将内存预分配给对象数组

时间:2015-05-20 14:23:30

标签: javascript

我有一个声明为

的数组
var arr = new Array();

然后我有一个由Server返回的对象数组。并且此数组中的每个对象都有三个字段(总是)。我必须遍历这个并有条件地添加到 arr 数组。

由于 arr 未预先分配,因此它会在主阵列中达到大数字的性能。

在获得主响应数组后,有什么办法可以预先分配 arr 数组,以便我可以避免这个性能问题吗?

另外我如何获得对象的大小?

感谢。

3 个答案:

答案 0 :(得分:8)

假设您有10个对象,并且您将从每个对象传递三个值到一个数组。您可以通过将整数30传递给Array构造函数来初始化长度为30(10 * 3)的数组:

var numObjects = 10;
var myArray = new Array(3*numObjects);

请参阅我的jsperf基准测试,了解获得的性能证明。简而言之,在Firefox 38中预先调整阵列大小要快25%,在Chrome 42中大约快81%,在Internet Explorer 11中大约快16%。数字会因个人运行这些基准测试的经验而异,但是趋势将保持一致。通过预先调整阵列大小,可以获得最佳性能 http://jsperf.com/array-growth-dynamic-vs-preset

在这里发表了关于这个主题的更全面的讨论 How to initialize an array's length in javascript?

答案 1 :(得分:2)

感谢你相信(或不相信)Javascript没有任何直接访问内存分配的神。考虑到乱扔垃圾的大部分JS的质量,这本来是非常可怕的。

Javascript本身会在创建时为内存分配内存,并在收集垃圾时回收内存。 预填充数组对内存使用或性能没有任何积极影响。

编辑:我错了。请参阅@ ThisClark的回答。

MDN在javascript中有一个非常好的article on how memory management and GC work

答案 2 :(得分:1)

您可以使用filter函数过滤数组,如下例

var result = [
    {
        age: 15
    },
    {
        age: 21
    },
    {
        age: 25
    }
];

function isGreaterThan20(obj) {
  return obj.age > 20;
}

var arr = result.filter(isGreaterThan20);
// arr becomes [{ age: 21}, { age: 25}]

如果您需要预先分配定义大小的数组,请使用new Array(size)

相关问题