2017-05-17 10 views
12

彼は矢の関数宣言を好むので、私と私の同僚は、コーディングスタイルの論争を持っているので、私はこの質問をしています:v8では、通常のスタンドアロン関数宣言よりも矢印関数の方が高速(パフォーマンスが向上し、より軽い)ですか?

const sum = (a, b) => a + b; 

をそして私は古いスタイルスタンドアロン関数宣言好む:

function sum(a, b) { 
    return a + b; 
} 

私を古いスタイルのコードを読みやすくし、関数と変数の宣言をより明確に区別することができます。彼の指摘は、矢印の機能を持つコードは速く走るということです。

矢印関数の代わりに旧式のスタンドアロン関数宣言を使用すると、実際のパフォーマンスのペナルティ(v8)について知っていますか?そのペナルティは本当に存在しますか?

+1

[ES6矢印機能を使用するとパフォーマンスが向上しますか?](http://stackoverflow.com/questions/42772817/are-there-performance-gains-in-using-es6-arrow-functions) –

+1

パフォーマンスの差はごくわずかで、ベンダーに依存すると私は予想しています。関数本体も同様に*実行*されます。その違いは、関数オブジェクトのインスタンス化(例えば、 'prototype'プロパティ)と実行コンテキストのインスタンス化(例えば、受信機)です。 – Ben

+0

@Jonasw私の質問はより具体的です。私は他の質問が環境を指定していないときにv8の仕様にのみ興味があります。質問をより明確に編集します。 –

答えて

19

V8デベロッパーhe再。矢印関数は、従来の関数宣言の(主に)「構文的な砂糖」です。彼らはより速くはありません。

+0

矢印関数式は、合成糖以上です。彼らは基本的に、基本的にはまだ 'Function'オブジェクトを作成します。私はES6.0の仕様を読んでいません。私が言うことは正確ではないかもしれませんが、矢印関数式で構築された 'Function'を呼び出すと、' this'の実行コンテキスト(これは一般に 'この値は呼び出し側のスコープチェーンからの値です)。 – Hydro

+1

@Matheusこれは、矢印関数が 'this'を使用するとき、クロージャを作成する必要があることを意味します。特別なものはありません。また、私は、関数* object *の作成は、とにかくほとんどの場合、最適化されることを期待しています。だから、 '.prototype'オブジェクトを作成する必要がないために利益が得られない可能性があります。 – Bergi

+0

@Matheus:はい、「this」の周りに意味的な違いがあります。そのため、私は「(ほとんど)」と書いています。この質問(と私の答え)のポイントは、パフォーマンスの違いはないということです。あなたが言うように、フードの下では、同じ 'Function'オブジェクトです。なぜなら、それらを"構文的砂糖 " 。 @Bergi:関数オブジェクトの作成を最適化できることは例外であり、ルールではありません。残念なことに、JavaScriptの多くのことが観測可能であるためです。クローズド重いプログラムは、この理由のために非常にメモリ非効率である傾向があります。 – jmrk

2

以下のことを示しています(従来のまたは脂肪のいずれか)最初に行くためのペナルティ

  • があり

    1. クローム

    function goFat() { 
     
        for (var i = 0; i < 1000000; i++) { 
     
         var v =()=>{}; 
     
         v(); 
     
        } 
     
    } 
     
    
     
    function goTraditional() { 
     
        for (var i = 0; i < 1000000; i++) { 
     
         var v = function() {}; 
     
         v(); 
     
        } 
     
    
     
    } 
     
    
     
    function race() { 
     
        var start = performance.now(); 
     
        goTraditional(); 
     
        console.log('Traditional elapsed: ' + (performance.now() - start)); 
     
        start = performance.now(); 
     
        goFat() 
     
        console.log('Fat elapsed: ' + (performance.now() - start)); 
     
        start = performance.now(); 
     
        goTraditional(); 
     
        console.log('Traditional elapsed: ' + (performance.now() - start)); 
     
        start = performance.now(); 
     
        goFat() 
     
        console.log('Fat elapsed: ' + (performance.now() - start)); 
     
        console.log('------'); 
     
    }
    <button onclick="race()">RACE!</button>

    で識別可能な差はありません
  • +4

    ボタンをクリックする前に最初のタイマーを起動するので、大きなペナルティが発生します。 – Ryan

    +0

    ハハ! (訂正された) – Ben

    +1

    v8のシーンの後ろで何が起こるのか分からないとき(そして、私はv8のソースコードを読んだことが本当にわからないが、とにかく専門家ではない) v8の最適化により正しい結果が得られません。 http://mrale.ph/blog/2012/12/15/microbenchmarks-fairy-tale.html –

    関連する問題