2017-05-08 3 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(); 

Ausgabeergebniswarum versuchen schnelle catch-Block als normal in NodeJS v7

➜ 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 

warum catch-Block schneller versuchen als normal 2x

ist das bedeutet, wir sollten alle versuchen, arbeiten?

versuchen alles mehr Leistung zu erhalten

hoffen, dass die Antwort

thankx alle

Antwort

1

Die Version des V8 in Knoten v7.x erhalten können Funktionen enthalten, try-catch oder Try-finally-Blöcke zu optimiert werden, während sie vorher immer dauerhaft deoptimized waren. Allerdings kann Crankshaft immer noch nicht inline mit try-catch oder try-finally arbeiten. Dies kann sich jedoch mit TurboFan (+ Ignition) ändern.

+0

bedeutet, dass i everyt versuchen Hing optimiert werden? – Shinhwe

+1

Das beantwortet nur einen Teil der Frage. Laut OP scheint Code ohne try/catch-Konstrukte langsamer ausgeführt zu werden, als wenn er in try/catch eingebunden wird. –

+1

Die Verwendung von try-catch oder try-finally verursacht * keine Optimierung. In früheren Versionen von V8 wurden Funktionen, die diese Blöcke enthielten, vom Compiler/Optimierer von V8 * nie * optimiert. Jetzt kann der Compiler/Optimierer * mit der Version von V8 in Knoten v7.x Funktionen optimieren, die solche Blöcke enthalten. – mscdex

0

sieht wie ein sub-optimales let i Handling aus. Mit den aktuellen Versionen von Knoten ist es noch sicherer zu vermeiden let , es sei denn, man wirklich wirklich braucht das Scoping.

Wenn ich laufen die oben unmodifizierten:

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

Ändern let i-var i über der Schleife die optimierte Version ohne Versuch jetzt schneller, und notieren Sie die große Beschleunigung für beide mit-versuchen und ohne-Versuch:

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

Die modifizierte Quelle:

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

Ja, es ist ein besserer Weg, danke – Shinhwe

Verwandte Themen