为什么负面的循环如此之快?

时间:2013-08-02 22:00:01

标签: javascript performance loops while-loop repeat

我正在开发专门用于Utilities的库。它将具有帮助您操作的函数:字符串,数组,数字,对象等。表现是一个主要焦点。在处理字符串的重复函数(重复字符串n次数)时,我决定测试当前方法的速度:

Array(n + 1).join(string); // n = times to repeat; string = string to copy

与仅使用循环进行比较。事实证明,虽然这是重复字符串的最短方式,但它也是最慢的。我明白它仍然很快。我的意思是,人类不可能在1秒内完成200,000件事,但与循环相比,它很慢。

是什么让循环如此之快?我发现一个特别快的循环是while循环,其中包含i--

var i = 10;
while (i--) {
    // do stuff
}

我决定使用这种方法,因为它是最快的。但我想知道为什么?是什么让它比其他方法快得多?

这是my benchmark。在while中,while循环比for循环慢的唯一浏览器是在Opera中。它在Internet Explorer 10中特别快。

1 个答案:

答案 0 :(得分:0)

你的js perf有很多错误,你有:

  • 关闭一个,关闭十个,关闭九个错误
  • 测试中内联的代码
  • 不检查结果

fixed jsperf结果中 更有意义:

enter image description here

请注意,+= str已经过优化,更像是使用StringBuilder。如果这是你的困惑。 Array代码分配一个新数组并调用join,这是一个具有复杂语义的复杂函数。 V8也未优化.join

对于其余的代码,每次运行时它们彼此之间的距离都不同,所以它们具有相同的性能。


副本也有错误的信息,如果你循环一个数组然后你正在对CPU缓存,所以不仅在最好的情况下负相似,但如果你循环数组更糟糕。它也出现在jsperf中。