今天我有一个想法来检查循环的性能,我称之为"范围为"。这个想法很简单。这个循环有两个变量," i"和" l"这是定义的"一个范围更高"比循环本身。 这两个范围内没有别的东西。
我创造了jsPerf并获得了惊人的成绩。 http://jsperf.com/variable-scoped-loop/6
我决定创建我的本地测试,结果甚至更好(&#34的平均时间为1000x1000循环;&#34为标准;&#34为0.01s;&#34为范围; <。 / p>
所以现在我想知道为什么这个循环太快了。我假设它完全是关于V8的,但你永远都不知道。
所以有人愿意解释吗?
TLDR:
为什么这个循环太快了?
var loop = ( function() {
var i, l;
return function( length, action ) {
for( i = 0, l = length ; i < l ; ++i ) {
action();
}
};
}() );
答案 0 :(得分:2)
不幸的是,这里没有任何魔力:你的测试是错误的。
对于varInFor
,empty
函数正确调用9999^2
次,而使用varInScope
时,它仅调用9999
次。这就是为什么它完成得更快的原因。您可以通过使empty
函数打印一些内容来轻松测试。
原因是变量i
和l
在varInScope
的外部和内部调用之间共享。因此,在内循环结束后,i
已经等于l
并且外循环立即退出。
请参阅another JSPerf了解每次初始化函数的固定版本(在闭包中创建一组新的变量),实际上,它比实际上高出20% 。 &#34;正常&#34; for loop。