我正在开发专门用于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中特别快。
答案 0 :(得分:0)
你的js perf有很多错误,你有:
在fixed jsperf结果中 更有意义:
请注意,+= str
已经过优化,更像是使用StringBuilder
。如果这是你的困惑。 Array代码分配一个新数组并调用join,这是一个具有复杂语义的复杂函数。 V8也未优化.join
。
对于其余的代码,每次运行时它们彼此之间的距离都不同,所以它们具有相同的性能。
副本也有错误的信息,如果你循环一个数组然后你正在对CPU缓存,所以不仅在最好的情况下负相似,但如果你循环数组更糟糕。它也出现在jsperf中。