Oilpanにおけるポインタ圧縮
4ギガバイト未満のRAMを使用するプログラムをコンパイルする場合に、64ビットのポインタを使用するのは全くもって愚かなことです。このようなポインタの値が構造体内に現れると、メモリの半分を無駄にするだけでなく、キャッシュの半分を効果的に捨てることになります。
4ギガバイト未満のRAMを使用するプログラムをコンパイルする場合に、64ビットのポインタを使用するのは全くもって愚かなことです。このようなポインタの値が構造体内に現れると、メモリの半分を無駄にするだけでなく、キャッシュの半分を効果的に捨てることになります。
この投稿のタイトルから、オイルパンに関する書籍のコレクションを深掘りするのかと思うかもしれませんが、今回は違います。その代わりに、V8 v9.4以降ライブラリとしてホストされているC++ガベージコレクターであるOilpanについて詳しく見ていきます。
JavaScriptでは、期待されるパラメータの数とは異なる引数の数で関数を呼び出すことができます。つまり、宣言された形式パラメータより少ないまたは多い引数を渡すことができます。前者の場合は「アンダーアプリケーション」と呼ばれ、後者は「オーバーアプリケーション」と呼ばれます。
スラック追跡は、新しいオブジェクトに実際に使用するサイズよりも大きな初期サイズを与える方法であり、これにより迅速に新しいプロパティを追加できます。そして一定期間後、使われていないスペースをシステムに魔法のように返却します。すごいでしょ?
デフォルト設定では、V8は初回実行時に正規表現をネイティブコードにコンパイルします。JITなしのV8の作業の一環として、正規表現用のインタープリターを導入しました。正規表現を解釈することにはメモリ使用量が少ないという利点がありますが、パフォーマンスの低下を伴います。このブログ投稿では、正規表現を解釈する利点を活かしつつ、欠点を軽減する方法を説明します。
以前に、JavaScriptエンジンがShapesとInline Cachesを使用してオブジェクトと配列のアクセスを最適化する方法や、エンジンがプロトタイプのプロパティアクセスを高速化する仕組みについて詳しく探りました。この記事では、V8がさまざまなJavaScript値に対して最適なメモリ内表現を選択する方法と、それがShapeの仕組みにどのように影響を与えるかについて説明しています。これらすべてはReactコアにおける最近のV8の性能の崖を説明する助けとなります。
注意: 記事を読むのではなく、プレゼンテーションを見る方が好きなら、以下の動画をご覧ください!そうでない場合は、動画をスキップして読み進めてください。
V8 v7.4は、実行時に実行可能なメモリを割り当てずにJavaScriptを実行することをサポートします。
デフォルト設定では、V8は実行時に実行可能なメモリを割り当てたり変更したりする機能に大きく依存しています。例えば、TurboFan最適化コンパイラはホットなJavaScript(JS)関数に対してネイティブコードをリアルタイムに生成し、多くのJS正規表現はirregexpエンジンによってネイティブコードにコンパイルされます。実行時に実行可能なメモリを作成することは、V8を高速にする要因の一つです。