y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

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 月頃には速度改善が落ち着いている様子がわかります。
f:id:y_uti:20190403234813p:plain

橙色の線は、各時点でリリースされていた 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 のコミットで性能が向上しています。

  1. Prototype of linear-scan register allocator (incomplete) · zendtech/php-src@14a7b51 · GitHub
  2. JIT code generator refactoring · zendtech/php-src@37058a5 · GitHub
  3. 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:すべてのパッチバージョンまで調べるのは面倒だったので、こちらはマイナーバージョンごとに計測しました。