「PHP 8」にJITを導入、パフォーマンスが大幅向上:CPUに負荷がかかるワークロードに有用
開発中の「PHP 8」にJITコードを取り込む提案がPHPの開発者コミュニティーの投票で可決された。CPUに負荷のかかるワークロードで実行速度が劇的に高まるという。
オープンソースの汎用(はんよう)プログラミング言語「PHP」の最新版「PHP 8」へ「JIT(Just-In-Time)」コンパイラを導入することが決まった。
JITコードの取り込みについては、RFC(Request for Comments)として提案されており、2019年3月21〜28日に開発者コミュニティーで投票が行われ、50対2で可決された。
これを受け、PHP JITブランチのコードがPHPのマスターブランチにマージされた。発表時点ではPOSIXプラットフォームと、Windowsのx86/x64プラットフォームをサポートしている。
RFCでは、PHP 8にJITを取り込む理由として以下の3つが挙げられていた。
- 他の最適化手法ではこれ以上パフォーマンスを高めることができない段階に、PHPが達している JITを使用しない限り、PHPのパフォーマンスをこれ以上高めることができない
- JITを使用することで、PHPがWeb以外のCPU集約型のシナリオで、より頻繁に使われる可能性が広がる こうしたシナリオでは、JITの使用によるパフォーマンスの向上メリットが非常に大きいと予想される。PHPは現状では、恐らくこうしたシナリオで利用が検討されることがほぼない
- JITが使用可能になれば、パフォーマンスを大幅に犠牲にすることなく、C言語の代わりに(またはC言語に加えて)PHPで組み込み関数を開発することが可能になる こうなれば、イノベーションが加速することはもちろん、Cベースの開発に付き物のメモリ管理、オーバーフローなどの問題の影響を受けにくい、より安全な実装が可能になる
ベンチマークで4倍の性能向上を測定
RFCでは、Mandelbrotベンチマークによる以下の関数について実行結果の公開データを参照し、JITによってパフォーマンスが4倍以上向上することを指摘している。
function iterate($x,$y) { $cr = $y-0.5; $ci = $x; $zr = 0.0; $zi = 0.0; $i = 0; while (true) { $i++; $temp = $zr * $zi; $zr2 = $zr * $zr; $zi2 = $zi * $zi; $zr = $zr2 - $zi2 + $cr; $zi = $temp + $temp + $ci; if ($zi2 + $zr2 > BAILOUT) return $i; if ($i > MAX_ITERATIONS) return 0; } }
JITの導入により、パフォーマンスを測定する「bench.php」の実行時間が、0.320秒から0.140秒へと半分以下に短縮されたことも、RFCでは紹介している。JITは、ほとんどのCPU集約型ワークロードの動作を大幅に高速化すると予想されている。
今後はWordPressでの高速化も狙う
ただし、現時点では、「WordPress」のようなアプリケーションでは、JITによるパフォーマンス改善があまり期待できないという。このため、プロファイリングや投機的最適化により、こうしたアプリケーションでもJITの効果を高めることを計画している。
RFCによれば、JITのモダンな実装である「PHP JIT」は、JavaScriptの「V8」やPHP互換のHHVM(HipHop Virtual Machine)、Pythonの「PyPy」などと比べて、極めてシンプルだという。その一方で、PHP JITは、PHPの全体的な複雑さを招き、新たなタイプのバグが発生するリスクや、開発および保守コストを増大させるといった課題があるという。
PHP JITの実装は、コードをコンパイルし、共有メモリへ保持しておくOPcacheとはほぼ独立した形となった。PHP JITはコンパイル時と実行時に有効にしたり、無効にしたりできる。PHP JITを有効にすると、PHPファイルのネイティブコードはOPcacheの共有メモリに設けられた追加領域に格納される。JITコードのエントリポイントを指すポインタは「op_array」→「opcodes[].handler」に保持される。
このため、PHP JITには下位互換性の問題はないものの、「xdebug」などのサードパーティーのデバッガや、「XHProf」「Blackfire」「Tideways」といったプロファイラに影響するという。
なお、今回のJIT技術を、同じく開発中の「PHP 7.4」に実験機能として取り込むことが併せて提案されたものの、こちらは投票で否決された。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Ruby 2.6が公開、JITコンパイラを実装
「Ruby 2.6.0」が公開された。JIT(Just-In-Time)コンパイラが導入されたことに加え、処理性能を向上させる改善が複数施されている。終点なしRangeなどの新機能も実装された。 - 初心者がPHPプログラミングを始めるための基礎知識とXAMPPのインストール
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。初回は、PHPの概要や特徴を紹介し、環境構築や「Hello World!」までの手順などを解説します【PHP 7.1含め2017年の情報に合うように対応、XAMPP環境構築を追記】。 - WordPress自体のチューニングが必要な理由と高速化の基本的な考え方
企業のCMSサイトやオウンドメディアなどエンタープライズ用途での利用が増加しているWordPressの高速化について解説する連載。初回は、WordPressの高速化が求められる背景や、WordPress高速化の基本的な考え方であるページのロード時間とその構成要素、1秒当たりの同時アクセス数について解説します。