2017-05-08 48 views
1
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(); 

輸出結果爲什麼try catch塊比正常快於V7的NodeJS

➜ 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 

爲什麼try catch塊的速度比正常2倍

是,這意味着我們應該都嘗試工作?

想盡辦法獲得更多的性能

希望得到的答案

thankx所有

回答

1

V8的節點V7.x中的版本允許含有的try-catch或嘗試,終於塊功能被優化,而之前他們是總是永久去最佳化。但是,曲軸仍然不能用try-catch或try-finally內聯函數。雖然這可能會改變TurboFan(+點火)。

+0

意味着我可以嘗試everyt興奮得到優化? – Shinhwe

+1

這隻會回答問題的一部分。根據OP的說法,似乎沒有try/catch結構的代碼執行起來比用try/catch包裝時要慢。 –

+1

使用try-catch或try-finally不會*導致優化發生。就是在以前的V8版本中,包含這些塊的函數從未被V8編譯器/優化器優化。現在使用節點v7.x中的V8版本,編譯器/優化器*可以*和*將優化包含這些塊的函數。 – mscdex

0

看起來像一個次優的let i處理。 對於當前版本的節點,避免使用let 更安全,除非確實需要確定範圍。

當我運行上面的不變:

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

更改let ivar 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(); 
+0

是的,這是一個更好的方法,謝謝 – Shinhwe