首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaScript中有理想的数组大小吗?

在JavaScript中有理想的数组大小吗?
EN

Stack Overflow用户
提问于 2014-01-25 05:30:10
回答 2查看 354关注 0票数 16

我在各种语言中看到过一些实用程序,它们可以计算出所需的数组容量的“理想大小”。这些例程通常在分配的数组大于容量的情况下使用。它们通常通过计算数组长度来工作,使得分配的块大小(以字节为单位)加上内存分配开销是给定容量所需的2的最小精确幂。根据内存管理方案的不同,在分配并释放内存块时,这可以显著减少内存碎片。

JavaScript允许构造具有预定义长度的数组。那么,“理想大小”的概念适用吗?我可以想到四个反对它的理由(没有特别的顺序):

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

<代码>F29

另一方面,也许所有这些参数都是错误的,一个小的实用程序实际上是有效的(如:在脚本性能中产生可测量的差异)。

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

EN

回答 2

Stack Overflow用户

发布于 2014-01-25 05:45:40

你必须测量性能,因为有太多的移动部件。虚拟机、引擎和浏览器。然后,虚拟内存(平台windows/linux、物理可用内存和海量存储设备HD/SSD)。很明显,当前负载(存在其他网页,或者如果是服务器端,则是其他应用程序)。

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

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

票数 1
EN

Stack Overflow用户

发布于 2020-11-01 21:54:44

我知道这个问题,答案是关于内存使用的。但是,尽管调用这两个构造函数(使用和不使用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>

不带size参数的函数分配和填充100,000项数组1000次所需时间为28s,而在数组构造函数中带size参数的函数仅用了不到7s的profiler shows

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21342830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档