最新の JavaScript エンジンは、インライン キャッシングと適応再コンパイル技術を利用して、生成されたコードに対する動的ディスパッチの影響を最小限に抑えます。
V8について話している場合、オブジェクトが観察されるかどうかは、その隠しクラスにエンコードされます。インライン キャッシュ スタブと最適化されたコードの両方が、オブジェクトが期待される形状を持っているかどうかを判断するために、何らかの期待値に対して隠しクラスをすでにチェックしています。まったく同じチェックにより、オブジェクトが観測されているかどうかに関する情報が得られます。そのため、監視対象外のオブジェクトで機能するコード パスは変更されません。オブジェクトの観察を開始することは、形状を変更するのと同じように扱われます: オブジェクトの非表示クラスは、観察されたビットが設定された別のクラスに切り替えられます: これを読むことができますRuntime_SetIsObserved
。
同様の推論は、最適化されたコードでガードを省略し、代わりに「形状」の仮定に依存するコードを最適化解除するシステムの部分に適用されます。オブジェクトが観測されると、そのようなオブジェクトが観測されなかったという仮定に依存するすべての最適化されたコードが最適化解除されます。このように、観測されていない天体に対価は支払われません。
とはいえ、V8での現在の実装ではObject.observe
、観測されたオブジェクトが正規化され (辞書表現に変換され)、観測記録のためにランタイム システムを介したラウンド トリップが必要になるため、観測されたオブジェクトに高い代償が払われます。しかし、後でこのコストを大幅に削減する上で固有の技術的な問題はありません。