使用零初始化javascript数组

时间:2012-06-09 18:32:21

标签: javascript performance optimization

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

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

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

编辑:为了回应一些关于分配如此多零的数组的理由的误解,我想澄清两件事。

  1. 没有稀疏性。我需要创建多个大型数组并将它们用于计算。这些副本将用浮点数填充,浮点数恰好为零的几率可以忽略不计。
  2. 并非所有计算都是按顺序在阵列上执行的。我相信,与覆盖通过引用传递的数组中的值相比,在进程中生成数组的函数效率低(参见例如gl-matrix.js)。
  3. 因此,我的解决方案是创建一个大的零填充数组,然后在需要新数组时获取slice(),然后通过引用将该副本传递给任何函数以使用它。在任何浏览器中,Slice都是超级超级快速的。

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

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

3 个答案:

答案 0 :(得分:6)

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

您应该在不同的浏览器中对此进行测试,以确定哪种方法最佳。你会发现你得到了非常不同的结果。

在Internet Explorer中,最快的方法实际上既不是您测试的方法,也不是指定零的简单循环:

for (var i = 0; i < numzeros; i++) zeros[i] = 0;

答案 1 :(得分:0)

启动ES6,您可以使用fill,如:

var totals = [].fill.call({ length: 5 }, 0);

答案 2 :(得分:-2)

没有任何实际任务相当于“用零初始化javascript数组”,尤其是一个大的。你应该重新考虑为什么你需要0。这是一个稀疏数组,您需要0作为默认值吗?然后只需添加一个条件访问,将检索到的值设置为0,而不是浪费内存和初始化时间。