Javascript 为什么阵列(99999)比阵列(100000)慢

Javascript 为什么阵列(99999)比阵列(100000)慢,javascript,Javascript,我在检查js性能测试用例时发现了这个 在结果中,数组(100000)比数组(99999)快。为什么会这样 编辑: 我的疑问是,在执行时创建数组时是否遵循了任何特定的算法。即使我执行99对100。100在我的浏览器中更快。为了了解算法(如果有的话),我发布了这个问题 浏览器:Chrome 30.0.15 操作系统:MacOSX它在技术上并不快。你的测试结果就是这样的 我也运行了测试,阵列(99999)比阵列(100000)快0.11%。在测试过程中,不做任何操作就再次运行它。顺便说一下,有一个近似

我在检查js性能测试用例时发现了这个

在结果中,数组(100000)比数组(99999)快。为什么会这样

编辑:

我的疑问是,在执行时创建数组时是否遵循了任何特定的算法。即使我执行99对100。100在我的浏览器中更快。为了了解算法(如果有的话),我发布了这个问题

浏览器:Chrome 30.0.15
操作系统:MacOSX

它在技术上并不快。你的测试结果就是这样的


我也运行了测试,阵列(99999)比阵列(100000)快0.11%。在测试过程中,不做任何操作就再次运行它。顺便说一下,有一个近似值——当我运行它时,它有+/-0.20%。。这就是为什么需要稍大一点的程序才能运行得更快。

一些实现(特别是Safari的Nitro)会预先分配内存,而另一些则不会。可能100k是一些任意选择的限制,在该限制下,它们会切换到不同的行为。

此工具不会给出%100个精确结果,因此正常数组(100000)比数组(99999)快

我的测试:


你的答案在测试结构中。虽然它是一个黑盒,但我不能说为什么会这样,但在javascript中,第一个代码会更快

我使用了该测试系统并获得了结果:


-正如您所看到的,第二个代码速度较慢。作为结论-要么是不稳定的测试系统,要么是没有足够的迭代来评估有意义的执行时间值。还要注意的是,尽管我的浏览器不是Chrome,但如果原因是在js内部,这应该无关紧要(虽然我的结果很明显)

这个谜团与垃圾收集有关。
运行第一个测试将产生大量垃圾,因此垃圾收集器一定会在某个时间运行,从而降低执行速度。
第二个测试将受到第一个测试中创建的垃圾的影响,这使得它比第一个测试更慢。
尝试交换测试,您将看到它是第一个获胜的测试:问题不在于数组大小,而在于测试顺序

在这里,我们看到了由jsperf引起的一个偏差,其结果应始终与预防措施一起使用

我在这里颠倒了测试顺序:


我们可以看到“100K比100K-1快”。。。如果它在第一个位置。

我没有看到任何结果表明其中一个更快?你的测试是什么。代码??我还认为差异太小,基准测试可能无法给出正确的结果。@ZathrusWriter:他在Chrome上测试过。其他用户(如我)也在Firefox24和Safari 6.1中尝试了该测试。它们的速度更快,这导致铬结果在图形中完全消失。如果您检查源或放大足够远,您将看到它们。例外情况:请在问题中明确说明确切的浏览器品牌和使用的版本以及结果。JS性能是特定于浏览器品牌/版本的。这种差异在Safari 6.1中更为极端。@ZathrusWriter我怀疑在执行时创建数组时是否遵循了任何特定的算法。“当使用长度调用数组构造函数时,有些实现会预先分配内存,而另一些实现则不会。”你有证据吗?@Bergi我甚至观察到100比99快。想知道是否有价值观的行为改变。谢谢你的回答。@VisioN:(
Ctrl+F
pre-allocate)@Bergi-Hm。。。本文中的测试是比较“不同浏览器中的空文本与预分配数组”,而不是不同浏览器如何实现预分配数组。@Bergi Ahah,是的。。开始挖V8。两天后回来:)因为不同的浏览器使用不同的JS引擎,所以在哪个浏览器上使用可能会有影响。