我正在读Nicholas Zackas' High Performance Javascript其中讨论了通过反转并最小化其属性查找来优化for循环。
而不是:
for (var i = 0; i < items.length; i++ ) {
processItems(items[i]);
}
你得到:
for (var i = items.length; i--; ) {
processItems(items[i]);
}
在撰写本文时,执行时间比原始快<50> -60%。&#34;然而我创建了一个jsperf,在Firefox和Chrome中我注意到优化的 for循环实际上明显变慢了,尤其是在Firefox中。
较新的浏览器是否以不同的方式优化for循环?现在只是基本方式编写for循环的最有效方法是什么?
答案 0 :(得分:1)
也许您可以包含测试用例,而不是强制浏览器将答案强制转换为布尔值?
var i, arr = [...];
for (i = arr.length; i > 0; i -= 1) { arr[i-1] = 1; }
首先,你的循环是将0作为结束条件,第二个是arr[i]
,其中i = arr.length
未定义,这意味着Chrome将在访问该数组时取消优化循环,由于隐式类型,在Chrome的引擎盖下。
现在,就Chrome而言,你在Zakas的用例中发生了两次大的去优化。
在过去3年中,JavaScript引擎确实取得了很大进展,关于它们如何在幕后优化事物。 现在,它不是编写代码来欺骗引擎进行更好的优化(现在可能与现代浏览器的JS编译器中构建的实际优化智能相反),而更多是关于编写常规意义上的优化代码 - 了解使用哪种数据类型,何时使用等等。
我认为你会发现,如果你再次尝试测试,改变我在上面的代码示例中推荐的那两件事,虽然数字可能不完全匹配,但它们将是一个更接近前进的表现。