V8の正規表現を高速化する
このブログ投稿では、V8が最近実施したRegExpの組み込み関数を自己ホスト型JavaScript実装からTurboFanを基盤とする新しいコード生成アーキテクチャに直接接続する形になった移行について説明します。
このブログ投稿では、V8が最近実施したRegExpの組み込み関数を自己ホスト型JavaScript実装からTurboFanを基盤とする新しいコード生成アーキテクチャに直接接続する形になった移行について説明します。
V8およびその他の最新のJavaScriptエンジンは、ジャストインタイム(JIT)コンパイルによって、スクリプトをネイティブマシンコードに即時コンパイルし、実行前に高速化を図っています。コードはまずベースラインコンパイラによって初期的にコンパイルされ、非最適化されたマシンコードを迅速に生成できます。その後、実行時にコードを分析し、必要に応じてより高度な最適化コンパイラで動的に再コンパイルされ、性能を最大化します。V8では、このスクリプト実行パイプラインにおいて、ベースラインコンパイラと2つの最適化コンパイラ(CrankshaftとTurboFan)の間を切り替える複雑な仕組みが存在します。
以前のブログ記事では、ガベージコレクションがスムーズなブラウジング体験を妨げるジャンクの問題について紹介しました。本記事では、「オリノコ」というコードネームで呼ばれるV8の新しいガベージコレクタの基盤となる3つの最適化を紹介します。オリノコは、厳密な世代境界を持たない主に並列かつ同時的なガベージコレクタを実装することで、ガベージコレクションによるジャンクとメモリ消費を削減しつつ高いスループットを提供することを目指しています。オリノコを別個のガベージコレクタとして旗印の背後に実装するのではなく、V8の最新バージョンにオリノコの機能を段階的に搭載することで、ユーザーにすぐに恩恵をもたらすことにしました。この記事で紹介する3つの機能は、並列圧縮、並列リメンバードセット処理、およびブラックアロケーションです。
JavaScript仕様には多くの組み込み機能が含まれています。例えば、数学関数から完全装備の正規表現エンジンまでです。V8の新しいコンテキストにはこれらの関数が最初から利用可能です。これが機能するためには、グローバルオブジェクト(例えばブラウザのwindowオブジェクト)とすべての組み込み機能が設定され、コンテキストが作成される際にV8のヒープに初期化されなければなりません。この初期化を一から行うにはかなりの時間がかかります。
JavaScriptのパフォーマンスはChromeの価値の重要な側面の1つであり、特にスムーズな体験を実現する上で重要です。Chrome 41以降、V8は新しい技術を利用して、アイドル時間内の小さな未使用時間に高コストなメモリ管理操作を隠すことで、Webアプリケーションの応答性を向上させています。この結果、Web開発者はガベージコレクションによるジャンクが大幅に軽減され、スムーズなスクロールや滑らかなアニメーションを期待することができます。
先週私たちは、特定の種類のJavaScriptに対してTurboFanをオンにしたことを発表しました。この投稿ではTurboFanの設計に深く掘り下げたいと思います。