2

我正在开发一个专门用于实用程序的库。它将具有帮助您操作的功能:字符串、数组、数字、对象等。性能是主要关注点。在处理字符串的重复函数(重复字符串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
}

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

这是我的基准。while 循环比 for 循环慢的唯一浏览器是 Opera。在 Internet Explorer 10 中速度特别快。

4

1 回答 1

0

你的 js 性能有很多错误,你有:

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

固定的 jsperf中,结果更有意义:

在此处输入图像描述

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

对于其余的代码,它们在每次运行时总是彼此非常接近,因此它们具有相同的性能。


副本也有错误的信息,如果你正在循环一个数组,那么你正在处理 CPU 缓存,所以在最好的情况下不仅是负数几乎相同,而且如果你正在循环一个数组,情况也会更糟。它也出现在jsperf中。

于 2013-08-03T11:57:35.210 回答