【问题标题】:Why are negative while loops so fast? [duplicate]为什么负的while循环这么快? [复制]
【发布时间】:2013-08-04 07:19:32
【问题描述】:

我正在开发一个专门用于实用程序的库。它将具有帮助您操作的功能:字符串、数组、数字、对象等。性能是主要关注点。在处理字符串的重复功能时(重复一个字符串n 次数),我决定测试一下我当前的方法有多快:

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

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

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

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

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

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

【问题讨论】:

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

标签: javascript performance loops while-loop repeat


【解决方案1】:

你的 js 性能有很多缺点,你有:

  • 关闭 1,关闭 10,关闭 9 错误
  • 测试中的内联代码
  • 不检查结果

fixed jsperf 中的结果使 更有意义:

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

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


副本也有错误的信息,如果您正在循环遍历数组,那么您正在处理 CPU 缓存,因此在最佳情况下不仅负数几乎相同,而且如果您循环遍历数组,则更糟。它也出现在jsperf 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多