【发布时间】: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