2017-12-21 19 views
0

私はオブジェクトと、それが動作しなければならないフィールドを知るための投影をとる関数をコーディングしています。o [str] vs(o => o.str)

const o = { 
    a: 'Hello There'  
}; 


function foo(o, str) { 
    const a = o[str]; 
    /* ... */  
} 

foo(o, 'a'); 

や機能を持つ:

function bar(o, proj) { 
    const a = proj(o); 
    /* ... */ 
} 

bar(o, o => o.a); 

私はV8が私のjavascriptのオブジェクトとクラスを作成していると思う私は、このような文字列を使用する必要がある場合

私は思ったんだけど。フィールドを動的にアクセスするために文字列を使用すると、ハッシュテーブルなどのオブジェクトではなく、クラスを作成できますか?

答えて

2

V8デベロッパーはこちら。 「どのパターンを使うべきか」に対する答えおそらく "それは依存する"でしょう。私はあなたのアプリの振る舞いに応じて、どちらか一方が(より)速く(少し)なるシナリオを考えることができます。だから私はあなたがどちらかを試してみることを提案します(実際のコードではなく、マイクロベンチマークではありません)。自分自身を測るか、より大きな文脈で好きな方を選んでください。時間を費やす価値がある実際のボトルネックです。

性質が実際にその後、最速のオプションは、呼び出しの前にプロパティをロードするためにおそらく、呼び出しサイトで知られている場合:

function baz(o, str, a) { 
    /* ... */ 
} 

baz(o, "a", o.a); 

私は物事が実際にこのシンプルだったら、あなたはおそらく「wouldnことを実現この質問をしている。仮説が正しければ、これは、マイクロベンチマークの単純化がどのようにして正解が容易に変わることができるかを示す大きな例です。ほとんどいないあなたがそれらから読み取る方法については、あなたがオブジェクトを変更する方法に依存していること -


クラスの質問への答えは、この決定は、V8は、ボンネットの下に、あなたのオブジェクトを表しどのように影響を及ぼさないということです。また、記録のため:

  • オブジェクトはすべて「隠しクラス」を持ちます。ハッシュテーブル表現を使用するかどうかは、ハッシュテーブルモードまたはシェイプトラッキングモードがどのようなオブジェクトに対しても優れているかどうかは、ユースケースに依存するものの1つで、どちらのモードが存在するのかが正確にわかります。
  • 私はそれがあなたのケースで問題になることを知っていない限り(プロファイリングから)V8のヒューリスティックが正しいと判断し、手作業による介入はほとんど必要ありません。
+0

投影がループの内側にあるので、コールサイトでプロパティアクセスを行う明白な解決策がもう適用されません:-) – Bergi

+0

実際、私の場合、私はフィールドを知ることができません関数を呼び出す前に使用されます。 私がよく理解すれば、隠されたクラスが常に作成されます。しかし、V8はmyobject [variableStr]で何をしますか? – Greg

+0

プロパティの検索が実行されます。もちろん、キャッシュ可能なロードほど高速ではありませんが、代替機能が大きなセットの関数の1つを呼び出す場合は、それほど高速ではありません。どちらが速くなるか、またはその違いが重要かどうかを予測することは難しい。 (確かに、私が書いたように、現実は、問題の単純化されたスニペットより複雑になると思う。) – jmrk