2017-09-08 17 views
1

もう1つの最適化に関する質問です。私は変数V8 の型推論を行うかどうかを知りたいのですが、その変数に基づいてのアクセスを最適化します。V8の型推論の最適化はありますか?

型推論は、このようなものになるだろう:

let input = "keyboard"; 
// ^^^^^ input is String because "keyboard" is String 

そのV8の状況があり、特定の式の型が唯一の実行で得たことができるため、例えば、型を推論ないとaccidentalyそれを最適化しない場合があります時間?

絶対に、ローカルs

let s = ''; 

s = zxc + ''; 
+0

多分これにはあなたが探しているものが含まれていますか?https://www.html5rocks.com/en/tutorials/speed/v8/ –

+0

@Shyamほぼ... – Hydro

+0

javascriptはすばやくアクセスするためのものです –

答えて

1

はいオルタナティブ

let s = ''; // let s : String 

s = zxc; // What is zxc? 

zxcを置きます。

たとえば、2012年以降のV8タグでは32ビットの数値なので、すべての計算が非常に高速になります。 https://www.html5rocks.com/en/tutorials/speed/v8/#toc-topic-numbers

クランクシャフトは、あらゆるタイプのフィールドアクセスを高速化するために、あらゆる場所でハイブリッド型の推論を導入しています。

現在のイグニッションは、ますます良くなります。もちろん、フィールドタイプの知識を使用してネイティブコードパスを構築します。

誰かが既知のフィールドに予測されないタイプの値を書き込むと、それは独自の価格で最適化解除されます。

+0

残念ながら、タイプタギングにはあまり関連性がありません。 :/ – Hydro

1

(V8デベロッパーはこちら)短い答えは「はい、いいえ」です。長い答えは複雑です。

let s = '';の例のように、直接の「変数の型推論」はありません。正確には、次の割り当てはs = 1になる可能性があるからです。

つまり、最新のJavaScriptエンジン(V8など)が最適化されたコードを生成する基本原理の1つは、プログラムの特定のポイントでどのタイプが見られたかを観察することです。あなたが... = s + t、これまでstを持っている場合たとえば、常にされた文字列を持っている、そして最適化されたコードは、シーケンスおおよそのように含まれています:

check if the value in s is a string, otherwise bail out; 
check if the value in s is a string, otherwise bail out; 
perform a string concatenation of the two values; 

「救済」とは、全体の機能のために最適化されたコード投げ捨てられ、タイプについての焼き付けられた仮定をしない最適化されていないコード(またはバイトコード)で実行が続けられます。新しい最適化されたコードは、タイプに関する最新の情報に基づいて、後で生成される場合と生成されない場合があります。このアプローチは、通常「型推論」と呼ばれるものではありません。

JavaScriptの直接の「型推論」は、非常に限られた状況でのみ可能です。たとえば、ビット単位の演算(|,&~など)の結果は、常に32ビットの整数です。単項プラス(すなわち、+foo)の結果は常に数値です。文字列を他のものに追加した結果は常に文字列です。コンパイラを最適化すると、通常、より効率的なコードを生成するためのルールが適用されます。