为什么+ =(加法赋值,加上相等)在节点中如此慢?

在某些版本的节点中, a += b明显比a = a + b慢,但在浏览器和更高版本中相似。 是什么让他们跑得如此不同呢?

  • node v6.10.0 (V8 5.1.281.93) ,速度降低75%,反转速度提高4倍
  • node v8.0.0 (V8 5.8.283.41) ,慢86%,反转速度快7倍
  • node v8.2.1 (V8 5.8.283.41) ,慢86%,反转速度快7倍
  • node v8.3.0 (V8 6.0.286.52) ,类似
  • node v8.7.0 (v8 6.1.534.42) ,类似
  • node v8.9.2 (V8 6.1.534.48) ,类似
  • chrome 62.0.3202.94 (V8 6.1.534.42) ,相似
  • safari 11.0.1 ,类似

编辑:发现它与节点的v8引擎从5更新到6有关。

片段:

 const iter = 10 * 1000 * 1000 function one() { let i = 0 let sum = 0 while (i < iter) { sum += i i++ } } function two() { let i = 0 let sum = 0 while (i < iter) { sum = sum + i i++ } } let time const tries = 10 time = Date.now() for (let i = 0; i < tries; i++) { one() } console.log('one: ' + String(Date.now() - time)) time = Date.now() for (let i = 0; i < tries; i++) { two() } console.log('two: ' + String(Date.now() - time)) 

       

网上收集的解决方案 "为什么+ =(加法赋值,加上相等)在节点中如此慢?"

这在Node中不是问题,而是使用V8引擎(Node正好使用)。 在github页面(github.com/vhf/v8-bailout-reasons)上有一个“救援原因”列表,这是一个杀死优化的语言结构。 “不支持的让复合赋值”,即带有允许variables的复合赋值就是其中之一。 如果您在Chromium的开发工具中对代码进行剖析,您应该可以看到“未优化:不支持的复合赋值”: https : //i.imgur.com/OWDMqQU.png