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

标签 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%”。然而我创建了一个 jsperf在 Firefox 和 Chrome 中,我注意到优化 for 循环实际上明显变慢,尤其是在 Firefox 中。

enter image description here

新版浏览器对 for 循环的优化方式是否不同?现在编写 for 循环的最有效方式是否就是基本方式?

最佳答案

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

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 编译器中内置的实际优化智能相悖),更多的是编写常规意义上的优化代码——知道使用哪种数据类型、何时使用等等。

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

关于javascript - 新浏览器是否以不同方式优化循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15438213/

相关文章:

javascript - Electron 中的谷歌广告?

javascript - 将 select 的内容拆分到不同的字段中

双等号 (==) 和三等号 (===) 之间的 JavaScript 性能差异

javascript - 使用 Multer 上传文件并在解析和上传到数据库之前将其短暂存储在内存中

javascript - 如何在 app.on ("before-quit"中使用 shutdown.bat 停止 Tomcat?

c++ - SIMD 延迟吞吐量

arrays - 使用并发在旋转的排序数组中查找最小值

c# - 遍历树时使用线程

javascript - youtube 视频后面的弹出窗口

javascript - 异步加载网页图标 - 跨浏览器解决方案?