为什么在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();