メインコンテンツまでスキップ

コードキャッシュ

· 約3分
Yang Guo ([@hashseed](https://twitter.com/hashseed)), ソフトウェアエンジニア

V8はジャストインタイムコンパイル (JIT) を使用してJavaScriptコードを実行します。これは、スクリプトを実行する直前にそれを解析してコンパイルしなければならないことを意味し、これがかなりのオーバーヘッドを引き起こす可能性があります。私たちが最近発表したように、コードキャッシュはこのオーバーヘッドを軽減するための技術です。スクリプトが初めてコンパイルされる際、キャッシュデータが生成されて保存されます。次回V8が同じスクリプトをコンパイルする必要があるとき、たとえ異なるV8インスタンスであっても、キャッシュデータを使用してコンパイル結果を再現することができ、一からコンパイルする必要がありません。その結果、スクリプトはより速く実行されます。

コードキャッシュはV8バージョン4.2以降で利用可能となり、Chromeに限定されません。これはV8のAPIを通じて公開されているため、すべてのV8エンベッダーがこの利点を生かすことができます。この機能をテストするためのテストケースは、このAPIの使用方法の例として機能します。

スクリプトがV8によってコンパイルされる際、v8::ScriptCompiler::kProduceCodeCacheをオプションとして渡すことで、後のコンパイルを高速化するためのキャッシュデータを生成することができます。コンパイルが成功すると、キャッシュデータはソースオブジェクトにアタッチされ、v8::ScriptCompiler::Source::GetCachedDataを使用して取得できます。それは後で保存し、例えばディスクに書き込むことで利用できます。

後のコンパイル時には、以前生成されたキャッシュデータをソースオブジェクトにアタッチし、v8::ScriptCompiler::kConsumeCodeCacheをオプションとして渡すことができます。この場合、V8はコードをコンパイルするのではなく、提供されたキャッシュデータから逆シリアル化するため、コードがはるかに速く生成されます。

キャッシュデータを生成するには、一定の計算とメモリコストがかかります。このため、Chromeは同じスクリプトが数日以内に少なくとも2回確認された場合にのみキャッシュデータを生成します。これにより、Chromeはスクリプトファイルを平均的に2倍速く実行可能なコードに変換でき、ユーザーはその後の各ページロードで貴重な時間を節約できます。