JIT コンパイル付き PHP のベンチマークテストを試した
PHP8 に JIT コンパイラを搭載するという提案が、投票によって可決されました。既に master ブランチにマージされています*1。
PHP: rfc:jit
JIT コンパイラの開発は、下記のリポジトリで 2016 年から続けられていました。このブログでも話題にしたことがありましたが*2*3、今回は改めて、2016 年から現在までの性能向上の様子をベンチマークテストで確認してみました。
GitHub - zendtech/php-src: The PHP Interpreter
ベンチマークテストの実行結果は以下のとおりでした*4。青線が JIT を有効にしたものです。2016 年 8 月に開発が始まって、10 月頃には速度改善が落ち着いている様子がわかります。
橙色の線は、各時点でリリースされていた PHP での実行速度です*5。OPcache を有効にした状態で計測しています。このように比較してみると、PHP 本体も継続的に高速化されてきていることがわかります。以下に引用するように、JIT の開発当初は bench.php で 3 倍の高速化と言われていたのが最終的な RFC では 2 倍以上と、ややトーンダウンしていますが、これは比較対象となる PHP 自体が速くなったことによるのですね。
Now, JIT passes almost all PHPT tests, makes 3 times speed-up on bench.php and no significant difference on real-life apps (+/-5% depended on opcache.jit setting.
http://news.php.net/php.internals/96613
JIT makes bench.php more than two times faster: 0.140 sec vs 0.320 sec. It is expected to make most CPU-intensive workloads run significantly faster.
https://wiki.php.net/rfc/jit#performance
グラフを見ると、2017 年 3 月頃に一時的に性能が落ちている部分、2017 年 7 月頃にさらに高速化されている部分が気になります。いずれもソースコードまでは調査できていませんが、前者は下記 1 のコミットから実行速度が低下して 2 のコミットで再び高速になっています。後者については、下記 3 のコミットで性能が向上しています。
- Prototype of linear-scan register allocator (incomplete) · zendtech/php-src@14a7b51 · GitHub
- JIT code generator refactoring · zendtech/php-src@37058a5 · GitHub
- enable global register allocator and AVX instruction usage by default · zendtech/php-src@d4535ce · GitHub
[2019-04-13 追記] 本記事の結果を得るために利用したスクリプトを GitHub で公開しました。
https://github.com/y-uti/php-jit-benchmarker
*1:Added JIT compiler for x86 and x86_64 · php/php-src@9a06876 · GitHub
*2:PHP の JIT 実装を試す - y_uti のブログ
*3:JIT のコードを読んでみた (勉強会発表資料) - y_uti のブログ
*4:ConoHa VPS 1GB プランの環境で実行しました。なお、今回の計測中には特に指摘を受けることはなかったのですが、PHP 本体のビルドを繰り返すため継続的に CPU 負荷の高い状態になってしまいます。注意してください。
*5:すべてのパッチバージョンまで調べるのは面倒だったので、こちらはマイナーバージョンごとに計測しました。