JavaScript中是否有理想的数组大小?

时间:2014-01-24 21:30:10

标签: javascript arrays memory-management

我已经看到各种语言中的小实用例程,对于所需的数组容量,它将为数组计算“理想大小”。当分配的数组大于容量时,通常使用这些例程。它们通常通过计算数组长度来工作,使得分配的块大小(以字节为单位)加上内存分配开销是给定容量所需的最小精确2。根据内存管理方案,这可以显着减少内存碎片,因为内存块已分配然后被释放。

JavaScript允许构建具有预定义长度的数组。那么“理想尺寸”的概念是否适用?我可以想到反对它的四个论点(没有特别的顺序):

  • JS内存管理系统的工作方式不会受益于此类策略
  • JS引擎已经在内部实施了这样的大小调整策略
  • JS引擎并不真正将数组保存为连续的内存块,因此整个想法都没有实际意义(除了类型化数组)
  • 这个想法适用,但内存管理依赖于引擎,没有任何单一的“理想大小”策略可行。

另一方面,也许所有这些论点都是错误的,一点实用例程实际上是有效的(如:在脚本性能方面做出可测量的差异)。

那么:可以为JavaScript数组编写一个有效的“理想大小”例程吗?

3 个答案:

答案 0 :(得分:8)

javascript中的数组是它们的核心对象。它们只是通过api像阵列一样。使用参数初始化数组只是使用该值设置length属性。

  

如果传递给Array构造函数的唯一参数是0到232-1(含)之间的整数,则返回一个长度设置为该数字的新JavaScript数组。 - Array MDN

此外,没有数组“类型”。数组是Object类型。因此它是Array Object ecma 5.1

因此,使用

之间的内存使用量没有差异
var one = new Array();
var two = new Array(1000);

除了长度属性。使用chrome的内存时间轴在循环中进行测试时,也会检查出来。每次创建1000个都会在我的机器上产生大约2.2MB的分配。

一个

2 enter image description here

答案 1 :(得分:1)

由于移动部件太多,您必须测量性能。 VM和引擎和浏览器。然后,虚拟内存(平台windows / linux,物理可用内存和大容量存储设备HD / SSD)。显然,当前的负载(存在其他网页或服务器端,其他应用程序)。

我认为在这样的努力中没什么用处。当浏览器中加载另一个标签或将页面加载到另一台机器上时,任何理想的性能大小可能都不再理想。

我在这里看到的最好的改进是开发时间,写得更少,并且更快地部署您的网站。

答案 2 :(得分:0)

我知道这个问题,答案与内存使用有关。但是,尽管在调用两个构造函数(使用和不使用size参数)之间分配的内存大小可能没有差异,但是填充数组时的性能有所不同。 Chrome引擎显然会执行一些预分配,这是在Chrome分析器中运行的以下代码所建议的:

<html>

<body>
<script>
    function preAlloc() {
        var a = new Array(100000);
        
        for(var i = 0; i < a.length; i++) {
            a[i] = i;
        }
    }

    function noAlloc() {
        var a = [];
        var length = 100000;
        for(var i = 0; i < length; i++) {
            a[i] = i;
        }
    }

    function repeat(func, count) {
        var i = 0;
        while (i++ < count) {
            func();
        }
    }
</script>
</body>
Array performance test
<script>
    // 2413 ms scripting
    repeat(noAlloc, 10000);
    repeat(preAlloc, 10000);
    
    
</script>
</html>

profiler shows中,没有size参数的函数花了28 s来分配和填充100,000个项目数组1000次,而在数组构造函数中带有size参数的函数花了不到7秒的时间。