JavaScriptエンジン「V8 release v6.5」リリース。WebAssemblyバイナリをダウンロードと並行してコンパイル、ダウンロード完了とほぼ同時にコンパイルも完了
GoogleのChromeブラウザで使われているJavaScriptエンジンの最新版「V8 release v6.5」のリリースが発表されました。
V8 release v6.5の最大の特徴は、WebAssemblyの「Streaming Compilation」(ストリーミングコンパイレーション)を実現したことです。
ダウンロードとコンパイルを並行して行うStreaming Compilation
WebAssemblyは、Webブラウザ上でネイティブコード並に高速実行が可能なバイナリフォーマット。Webブラウザにダウンロードした後でネイティブコードにコンパイルされ、実行されるというものです。
通常のコンパイルは、コンパイルすべきWebAssemblyバイナリのダウンロードが完了した後で、保存されたファイルがコンパイラに渡されてコンパイルされる、という手順を踏みます。
しかし今回実装されたStreaming Compilationは、WebAssemblyのバイナリコードのダウンロードが始まると、ダウンロードの完了を待つことなく受け取ったデータをどんどんコンパイラに渡して、ダウンロードと並行でコンパイルを行ってしまうというものです。
下記は、V8 release v6.5のStreaming Compilationが有効になるChrome 65と、そのひとつ前のバージョンであるChrome 64によるベンチマークの結果です。
青いマーカーがダウンロードにかかった時間、そして赤いマーカーがChrome 65でコンパイルにかかった時間。黄色いマーカーがChrome 64でコンパイルにかかった時間を示しています。
いちばん左の2つのマーカーは、ネットワークの帯域が25Mbit/sのときのベンチマーク結果です。Chrome 65もChrome 64も、青いマーカーが示すダウンロードにかかった時間(22秒程度)は同じですが、Chrome 65ではダウンロードが終わったあとで、赤いマーカーが少しだけ見え、すぐにコンパイルが終わったことが分かります。
一方、Chrome 64では黄色いマーカーが示すように、青いマーカーが示すダウンロードが終わった後で、黄色いマーカーが示すように10秒程度コンパイルに時間がかかっています。
真ん中の2つのマーカーはネットワークの帯域が50Mbit/sのベンチマークで、ここでもChrome 65はデータ転送が終わるやいなやコンパイルも終わっていますが、Chrome 64はさきほどと同じように10秒程度のコンパイル時間がかかっています。
いちばん右の2つのマーカーは100Mbit/sのネットワーク帯域のベンチマークで、さすがにこのスピードでWebAssemblyのコードを受け取っても、Chrome 65では並行して行われたコンパイルの速度が間に合わず、数秒程度のコンパイル時間がかかっています。
FirefoxもStreaming Compilationを実装済み
こうしてみるとChrome 65もChrome 64も、ベンチマークで使われたWebAssemblyファイルのコンパイルには10秒程度かかっているようです。
ただ、Chrome 64はダウンロードが終わった時点でコンパイルが開始されて10秒かかっているのに対し、Chrome 65ではダウンロードが始まった時点でコンパイルも開始されるためにChrome 64よりも早めに終わっているわけです。
そしてこの、WebAssemblyのバイナリをダウンロードしながらコンパイルを行うStreaming Compilationは、先月リリースされたFirefox 58でも実装されています。
となるとChrome 65やFirefoxでいかにWebAssemblyのコードを早く実行するかという点において、これまでのJavaScriptと同じようにダウンロード時間を短縮するためにファイル容量を小さくする、というチューニングテクニックは引き続きとても重要なのだと言えそうです。
あわせて読みたい
来月にはJava 10が登場し、9月にはJava 11が登場予定。新しいリリースモデルを採用した今後のJava、入手方法やサポート期間はこう変わる(OpenJDKに関する追記あり)
≪前の記事
Webブラウザの操作をJavaScriptで自動化。Headless Chromeのフレームワーク「Puppeteer」がバージョン1.0に到達。ChromeのDevToolsチームが開発