2017-12-05 4 views
7

特定のバージョンのノードでは、a += bは、a = a + bよりも大幅に低速ですが、ブラウザおよびそれ以降のバージョンでは同様です。何が彼らを違うように動かすのか?ノードで+ =(加算代入、等価)が遅いのはなぜですか?

  • node v6.10.0 (V8 5.1.281.93)、75%遅い、または逆86%遅く、
  • node v8.0.0 (V8 5.8.283.41) 4倍速くなり、または逆86%遅い、又は逆、
  • node v8.2.1 (V8 5.8.283.41) 7倍速くなり、高速
  • node v8.3.0 (V8 6.0.286.52)を7倍されます、
  • node v8.9.2 (V8 6.1.534.48)
  • 類似し、
  • node v8.7.0 (v8 6.1.534.42)
  • 類似する類似
  • safari 11.0.1同様のchrome 62.0.3202.94 (V8 6.1.534.42)、同様の

編集:これは問題ではありません

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)) 
+2

テストの順序を「two」と「one」に切り替えましたか? _Homemade_テストは必ずしも信頼できるものではありません。 –

+0

何が変わるのですか? @ibrahimmahrir – Luca

+1

私は "ちょうど"のために、同じ結果を得るために同じような結果を得ることを試みました – Billiam

答えて

4

:スニペット

5から6には、ノードのV8エンジンのアップデートに関連していますことを発見ノードではなく、ノードが使用するV8エンジンを使用します。最適化を止める言語構成要素であるgithubページ(github.com/vhf/v8-bailout-reasons)には、「救済措置の理由」リストがあります。 「サポートされていないlet compound assignment」、つまりlet-bound変数による複合割り当てがその1つです。 Chromiumの開発ツールでコードをプロファイリングすると、「最適化されていません:コンパイルされていません」というメッセージが表示されます。https://i.imgur.com/OWDMqQU.png

+0

v8の最適化に関するいくつかの良いニュース(またはより良い未来のために新しい希望): "あなたは長年にわたって学んだこのような最適化のすべてのキラーですか? 忘れてください あなたはそれらを必要としません。あなたが望むものを使用してください。 まだ何かが遅いですか?バグを報告してください!私はそれを修正します。」@bmeurer #jskongress 出典: https://twitter.com/slsoftworks/status/930041069529690112 https://www.youtube.com/watch?time_continue = 283&v = cvybnv79Sek –

関連する問題