为什么在NodeJS v7中尝试catch块更快

function f(){ let n = 0 console.time('f') for (let i = 0; i < 1000000000; i++) { n += 1 } console.timeEnd('f') } function g(){ let n = 0 console.time('g') try { for (let i = 0; i < 1000000000; i++) { try { n += 1 }catch(e) {} } }catch(e){} console.timeEnd('g') } f();g(); 

输出结果

 ➜ static node -v v7.9.0 ➜ static node test.js f: 11293.079ms g: 5800.848ms ➜ static sudo n 6.9.5 ➜ static node -v v6.9.5 ➜ static node test.js f: 9922.718ms g: 12212.024ms ➜ static 

为什么尝试赶上更快比正常2倍

这是否意味着我们应该一起努力?

尽一切努力获得更多的performance

希望能得到答案

谢谢所有

节点v7.x中的V8版本允许包含try-catch或try-finally块的函数进行优化,而之前它们总是被永久地去除优化。 然而,曲轴仍然不能用try-catch或try-finally来内联函数。 虽然这可能会改变TurboFan(+点火)。

看起来像一个次优let i处理。 使用当前版本的节点,除非确实需要确定范围,否则避免let更为安全。

当我运行上面的未修改:

 % node-v7.8.0 t.js f: 6069.986ms g: 3926.725ms 

改变let i变成var i在循环上方的优化版本没有尝试现在更快,并注意巨大的加速试验和没有尝试:

 % node-v7.8.0 t.js f: 2349.275ms g: 2998.101ms 

修改后的来源:

 function f(){ let n = 0 console.time('f') var i; for (i = 0; i < 1000000000; i++) { n += 1 } console.timeEnd('f') } function g(){ let n = 0 console.time('g') var i; try { for (i = 0; i < 1000000000; i++) { try { n += 1 }catch(e) {} } }catch(e){} console.timeEnd('g') } f();g();