【发布时间】:2015-09-21 11:42:00
【问题描述】:
今天我有了一个检查循环性能的想法,我称之为“作用域”。这个想法很简单。这个循环有两个变量,“i”和“l”,它们被定义为比循环本身“高一个范围”。 这两个范围内没有其他内容。
我创建了 jsPerf 并获得了惊人的结果。 http://jsperf.com/variable-scoped-loop/6
我决定创建我的本地测试,结果更好(1000x1000 循环的平均时间为 5 秒,“标准”,低于 0.01 秒“范围”)。
所以现在我想知道为什么这个循环如此之快。我假设这都是关于 V8 的,但你永远不知道。
那么有人愿意解释一下吗?
TLDR:
为什么这个循环这么快?
var loop = ( function() {
var i, l;
return function( length, action ) {
for( i = 0, l = length ; i < l ; ++i ) {
action();
}
};
}() );
【问题讨论】:
-
我猜引擎必须为前两种情况在每个循环中创建变量 i 和 l,而在最后两种情况下,他在每个循环中指向相同的 i 和 l。不知道这是否有那么大的不同。
-
javascript 引擎是否会注意到您没有使用循环的结果并优化整个循环?
-
看来您外包了对理解您的问题至关重要的数据。请在问题本身中发布所有相关代码、图像和资源,如果链接失效或更改,您的问题将失去大部分意义!
-
@Philipp 对于前两种情况(var in for & var in fun),性能真的很糟糕,也许问题更多的是,为什么使用闭包的循环比“标准”循环快得多?
-
@Philipp 基本上我想看看每种方法之间的性能差异,即使是那些不好的方法。这就是一个问题的重点——为什么“范围”循环比“标准”循环要快得多。我认为这都是关于在每个循环上创建新的“i”和“l”变量。或许 GC 也在做一些工作。
标签: javascript performance loops for-loop