Javascript 新浏览器对循环的优化是否有所不同?

Javascript 新浏览器对循环的优化是否有所不同?,javascript,performance,Javascript,Performance,我在读Nicholas Zackas的书,他在书中讨论了通过反转for循环并最小化其属性查找来优化for循环 而不是: for (var i = 0; i < items.length; i++ ) { processItems(items[i]); } 在撰写本文时,执行时间“比原来快了50%-60%”。但我创建了一个新的循环,在Firefox和Chrome中,我注意到optimized for循环实际上要慢得多,特别是在Firefox中 新浏览器对循环的优化是否有所不同?现在编

我在读Nicholas Zackas的书,他在书中讨论了通过反转for循环并最小化其属性查找来优化for循环

而不是:

for (var i = 0; i < items.length; i++ ) {
  processItems(items[i]);
}
在撰写本文时,执行时间“比原来快了50%-60%”。但我创建了一个新的循环,在Firefox和Chrome中,我注意到optimized for循环实际上要慢得多,特别是在Firefox中


新浏览器对循环的优化是否有所不同?现在编写for循环的最有效方法是简单的基本方法吗?

也许您也可以包含测试用例,而不是强制浏览器将答案转换为布尔值

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的用例中进行了两次大规模的去优化

JavaScript引擎在过去3年中确实取得了长足的进步,在幕后优化方面。 现在,更多的是编写常规意义上的优化代码——知道何时使用哪些数据类型等等,而不是编写代码来诱使引擎更好地优化(这与现代浏览器的JS编译器中内置的实际优化智能是背道而驰的)


我想您会发现,如果您再次尝试测试,更改我在上面的代码示例中建议的两件事,虽然数字可能不完全匹配,但它们将更接近正向性能。

奇怪,我昨天也做了同样的测试,fest one是速度最慢的…对我来说,它似乎非常接近微优化。+1个非常有趣的问题,我可以解释Chrome的结果,但希望阅读SpiderMonkey来源的人能够对这个问题有所了解@Kolink据我所知,这并不是关于如何编写快速代码,而是关于如何进行优化这本书中的许多微观优化现在可能都是错误的。Javascript引擎在过去三年多的时间里有了很大的进步。@Steve-o我通过反向设置得到了相同的结果。在许多情况下,这是关于使用JIT可以识别的模式。例如,如果JIT可以确定循环退出条件包含边界检查,则它可以忽略对循环内的每个数组访问执行边界检查。@BenVoigt确实如此。另一部分是在数组中不越界,首先是
i@Norguard,我不明白这是如何回答OP的问题的。这并不能解释chrome和firefox之间的结果差异。问题在于如何在这两个平台上进行阵列优化,以及如何/为什么要以不同的方式进行优化。(另外,看看他包含的jsperf,即测试用例)降序版本实际上并不像这个答案所说的那样访问
arr[arr.length]
。(有那么一会儿我同意了,但仔细看看)
var i, arr = [...];
for (i = arr.length; i > 0; i -= 1) { arr[i-1] = 1; }