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

时间:2017-12-05 23:45:22

标签: javascript node.js performance

在某些版本的节点中,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))

1 个答案:

答案 0 :(得分:4)

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