2013-02-27 28 views
12

Object.observe() JavaScript APIを使用すると、任意のJavaScriptオブジェクトのすべてのプロパティ変更に対して変更通知を受け取ることができます。Object.observe()はどのようにパフォーマンスに影響しますか?

JavaScriptエンジン(V8)で実行できるコード生成とパフォーマンスの最適化に重大な影響はありませんか?生成されたネイティブコードは、変更通知を生成する必要がある場合、オブジェクトへのすべての単一書き込みをチェックする必要があるようです。指定されたオブジェクトに通知が設定されているかどうかを静的に判断することはできません。チェックを最適化することはできません。

準拠しているJavaScriptエンジンは、このAPIのためにパフォーマンスが永続的に損なわれているようです。

+0

"*特定のオブジェクトに通知が設定されているかどうかを静的に判断することはできません*" - なぜですか? – Bergi

+0

@Bergiどうやってやるの?静的とは、コードを実行したり、オブジェクトを検査することなく意味します。 – usr

答えて

17

現代のJavaScriptエンジンを利用しますダイナミックディスパッチが生成されたコードに及ぼす影響を最小限に抑えるために、インラインキャッシングと適応再コンパイルの手法を使用します。

V8について話しているのであれば、オブジェクトが観測されているかどうかは隠れたクラスでエンコードされています。インラインキャッシュスタブと最適化されたコードの両方は、オブジェクトが期待される形状を持つかどうかを判断するために、隠れたクラスをいくつかの期待値と比較してチェックしています。まったく同じ検査で、オブジェクトが観測されているかどうかの情報が得られます。したがって、観測されていないオブジェクトで動作するコードパスは変わりません。オブジェクトの隠れたクラスは、観察されたビットセットで別のオブジェクトに切り替えられます。これを見るにはRuntime_SetIsObservedを読むことができます。

類似の推論は、最適化されたコードでガードを省略し、代わりに "形状"仮定に応じてコードを非最適化する部分に適用されます。オブジェクトが観察されなくなるという前提に基づいて脱最適化される。したがって、観察されない対象物については、再び価格は支払われない。つまり、V8で現在実装されているObject.observeは、正規化(辞書表現に変換)し、観測録画のためのランタイムシステムを介してラウンドトリップを必要とするため、V8で観察されるオブジェクトの価格が高くなります。しかし、後でこのコストを大幅に削減するには、内在する技術的な困難はありません。

+0

まだ、このエンジンは動的な「隠れたクラス」のアプローチを永遠に取る必要があります。現在、静的解析や型名アノテーション(JavaScriptの将来のバージョン)を使用して、これらの特殊化の最適化をさらに解決することは可能です。それは永遠に不可能になるでしょう。 JSは、たとえ完璧な型情報であっても、Javaや.NETほど高速になることはできません。 – usr

+0

最初に、現在のフォームでの完全なJavaScriptの静的型分析は高価で実用的ではないことに注意してください。明示的なものであり、たとえ導入されたエンジンが後方互換性のために古いコードを素早く実行するために隠されたクラスを保持しなければならない場合でも、第二に、言語Xと言語Yの速度の抽象概念を比較することは建設的ではない。ベンチマークや言語パターンなどを指定する必要がある。最後に、実行コードに* no *チェックが含まれているアプローチを具体的に説明した。 –

+0

この最後のアプローチは、観察されたオブジェクトに書き込む可能性のあるコードを非最適化するObject.observeに依存しています。たとえば、デバッガが接続されているときに、コードを非最適化するのと非常によく似ています。どのように実装されているかに応じて、すべてを最適化したり、影響を受ける機能のみを無効にしたりすることができます。 –

2

これは、JavaScriptエンジン(つまりV8)で実行できるコード生成とパフォーマンスの最適化に重大な影響を及ぼしませんか?

はい。プロキシ、ゲッター/セッター、おそらくプロトタイプオブジェクトと同じことですが、それらはすべてJavaScriptで動的です。

しかし、それらの非同期性のために新しい最適化が可能になります。他のより非効率なコードを時代遅れにする可能性があります。不要ラッパーまたはプロキシオブジェクトは、

  • への変更の追加/オブジェクトのプロパティの削除
  • 変更通知の
  • 変更通知は、メモリ効率とオブジェクトIDを提供する:Goals from the harmony draftを引用していませんオブジェクト上のプロパティのプロパティ記述子
  • アクセサープロパティが変更されたときにオブジェクトが手動で指示する機能
  • 効率的なエンジンで実現可能
  • 単純、標的、拡張現在ES
  • 非同期変更の通知が、変更の同期取り込みを可能にする保留中の送達
関連する問題