新浏览器是否以不同方式优化循环?

时间:2013-03-15 17:07:19

标签: javascript performance

我正在读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中。

enter image description here

较新的浏览器是否以不同的方式优化for循环?现在只是基本方式编写for循环的最有效方法是什么?

1 个答案:

答案 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编译器中构建的实际优化智能相反),而更多是关于编写常规意义上的优化代码 - 了解使用哪种数据类型,何时使用等等。

我认为你会发现,如果你再次尝试测试,改变我在上面的代码示例中推荐的那两件事,虽然数字可能不完全匹配,但它们将是一个更接近前进的表现。