Javascript 为什么负循环速度如此之快?

Javascript 为什么负循环速度如此之快?,javascript,performance,loops,while-loop,repeat,Javascript,Performance,Loops,While Loop,Repeat,我在一个专门为公用事业服务的图书馆工作。它将具有帮助您操作的函数:字符串、数组、数字、对象等等。性能是一个主要焦点。在使用字符串的repeat函数(重复字符串n次数)时,我决定测试当前方法的速度: Array(n + 1).join(string); // n = times to repeat; string = string to copy 与仅使用循环进行比较。事实证明,虽然这是重复字符串的最短方法,但也是最慢的方法。我知道它仍然很快。我的意思是,一个人不可能在一秒钟内完成200000件

我在一个专门为公用事业服务的图书馆工作。它将具有帮助您操作的函数:字符串、数组、数字、对象等等。性能是一个主要焦点。在使用字符串的repeat函数(重复字符串
n
次数)时,我决定测试当前方法的速度:

Array(n + 1).join(string); // n = times to repeat; string = string to copy
与仅使用循环进行比较。事实证明,虽然这是重复字符串的最短方法,但也是最慢的方法。我知道它仍然很快。我的意思是,一个人不可能在一秒钟内完成200000件事情,但与循环相比,它是缓慢的

是什么让循环如此之快?我注意到一个特别快的循环是while循环,它包含
I--

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


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

您的js性能有很多故障,您有:

  • 差一个,差十个,差九个
  • 测试中内联的代码
  • 没有检查结果
结果表明: 更有意义:

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

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



副本也有错误的信息,如果你在一个数组中循环,那么你是在对CPU缓存进行操作,因此,在最好的情况下,负的情况几乎相同,如果你在一个数组中循环,情况也会更糟。它也会在中出现。

询问为什么“消极的while循环”是快的,只有与“积极的while循环”或for循环相比才有意义。这里您要问的是“为什么循环比创建数组并将其未定义的元素与我的字符串连接起来要快?”我知道在性能测试中还有其他循环情况,但请注意,您的负for循环不是等价的,它应该是
for(var I=10;I--;)
您的minusWhile速度如此之快,因为它在循环体中从不做任何工作,而负号也不做While。。。除此之外,您应该注意到,这些循环基本上都是相同的速度。一般来说,没有免费的午餐:任何时候看到这样的异常值,调试测试代码。如果重复次数超过10次,我希望Array.join方法在性能上超过循环。@nnnnnn:你确定“var i=0;而(i--){”有作用吗?(我不这么认为…)此外,工作加倍甚至三倍怎么会导致性能下降几十倍而不是2-3倍呢?好的观点@dandavis。(之前的评论被删除。)我以为你指的是问题中直接显示的代码,在正文中只有一条注释。因此,为了更清楚地阐明你的观点:在jsperf测试中,while负循环将
I
初始化为错误的值。
var i = 10;
while (i--) {
    // do stuff
}