3

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

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

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

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

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

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

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

是的,我的 jsperf 代码可能遗漏了一些解决方案。因此,如果您有我没有想到的方法,请随时添加!谢谢!

4

3 回答 3

6

仅测试一次操作非常复杂,因为性能会根据计算机的其他操作而有很大差异。您将不得不多次运行该单个测试,并在每次测试之间重置为相同的条件。jsperf 多次运行测试的原因是为了得到一个好的平均值来清除异常。

您应该在不同的浏览器中对此进行测试,以查看哪种方法总体上是最好的。你会看到你得到了非常不同的结果。

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

for (var i = 0; i < numzeros; i++) zeros[i] = 0;
于 2012-06-09T18:47:30.410 回答
1

从 ES6 开始,你可以像这样使用填充

var totals = [].fill.call({ length: 5 }, 0);
于 2017-01-10T18:51:31.797 回答
-2

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

于 2012-06-09T18:50:50.120 回答