使用零初始化javascript数组

Pau*_*aul 3 javascript optimization performance

我正在测试使用零初始化大型javascript数组的不同方法.到目前为止,使用push(0)的简单for循环似乎远远超过其他方法(参见http://jsperf.com/initialise-array-with-zeros),但我对此有效性表示怀疑测试.

在实践中,您只需创建一个这样的大型数组并对其进行缓存,以便稍后当您再次需要大型初始化数组时,您可以简单地对其进行切片.因此,我认为最重要的评估是第一次执行此代码所需的时间,而不是许多试验的平均值.

有人不同意吗?或者有人知道我如何/在哪里测试一轮的时间?

编辑:为了回应关于分配具有如此多零的数组的基本原理的一些误解,我想澄清两件事.

  1. 没有稀疏性.我需要创建多个大型数组并将它们用于计算.这些副本将填充浮点数,浮点数恰好为零的可能性可以忽略不计.
  2. 并非所有计算都是按顺序在阵列上执行的.我相信,与覆盖通过引用传递的数组中的值相比,在进程中生成数组的函数效率低(参见例如gl-matrix.js).

因此,我的解决方案是创建一个大型零填充数组,然后在需要新数组时获取slice(),然后通过引用将该副本传递给任何函数以使用它.在任何浏览器中,Slice都是超级超级快速的.

现在,虽然您可能仍然担心我为什么要这样做,但我真正感兴趣的是,如果可以在第一次运行时评估不同初始化方法的性能.我希望有这个时间,因为在我的情况下,我肯定只运行一次.

是的,我的jsperf代码可能会错过一些解决方案.所以如果你有一个我没有想到的方法,请随意添加它!谢谢!

Guf*_*ffa 6

仅测试一次操作非常复杂,因为性能会有很大差异,具体取决于计算机正在做什么.您必须多次运行该单个测试,并在每个测试之间重置为相同的条件.jsperf多次运行测试的原因是为了获得良好的平均值来清除异常.

您应该在不同的浏览器中测试它,以查看哪种方法是最好的.你会看到你的结果变化很大.

在Internet Explorer中,最快的方法实际上既不是您测试的方法,而是一个分配零的简单循环:

for (var i = 0; i < numzeros; i++) zeros[i] = 0;
Run Code Online (Sandbox Code Playgroud)