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