y_uti のブログ

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

PHP のバージョンごとのベンチマーク実行時間

PHP 5.5 以降の各バージョンでマイクロベンチマークの実行時間を計測してみた結果を報告します。PHPソースコードに含まれている Zend/bench.php を私の環境*1で各 10 回ずつ実行したものです。青色の棒は OPcache を無効にして実行したもの、橙色の棒は OPcache を有効にして実行したものです*2
f:id:y_uti:20170815222532p:plain

PHP 7 で大幅な高速化が達成されたことはよく知られていますが、その後のマイナーバージョンアップでも、特に OPcache を有効にした場合の性能が向上していることが分かります。これは、PHP 7 がリリースされた後、データフロー解析を用いた最適化などが実装され、より効率的なバイトコード命令を生成できるようになったためです。開発者の一人である nikic 氏のウェブサイトで論文*3が公開されています。

Static Optimization in PHP 7 (PDF ファイルへのリンクです。nikic's Blog の "about me" から辿れます)

論文のほかにも、PHP South Coast 2017 というカンファレンスでの発表資料が SlideShare で公開されています。

www.slideshare.net

Zend/bench.php は 18 種類のプログラムから構成されるマイクロベンチマークで、各プログラムの実行時間の内訳は以下のとおりでした。mandel, mandel2 などは PHP 7.1 と PHP 7.2 の間でも実行速度の向上が見られるようです。
f:id:y_uti:20170815230200p:plain

最後に、各バージョンの OPcache 最適化器のファイル構成を簡単に見比べてみます。まず PHP 5.6.31 では、ext/opcache/Optimizer に以下のファイルが存在していました。

$ ls -1 php-5.6.31/ext/opcache/Optimizer
block_pass.c
compact_literals.c
nop_removal.c
optimize_func_calls.c
optimize_temp_vars_5.c
pass10.c
pass1_5.c
pass2.c
pass3.c
pass5.c
pass9.c
zend_optimizer.c
zend_optimizer.h
zend_optimizer_internal.h

PHP 5.6.31 と PHP 7.0.22 とのファイル単位の差分は次のとおりです。最適化器を構成するファイルは PHP 5.6.31 よりも減っていることがわかります。

$ diff <(ls -1 php-5.6.31/ext/opcache/Optimizer) <(ls -1 php-7.0.22/ext/opcache/Optimizer)
6d5
< pass10.c
10,11d8
< pass5.c
< pass9.c

PHP 7.0.22 と PHP 7.1.8 との差分は次のとおりです。ここでファイル数が大幅に増えています。ファイル名を見ても、いかにも最適化器らしいキーワードが並んでいます。

$ diff <(ls -1 php-7.0.22/ext/opcache/Optimizer) <(ls -1 php-7.1.8/ext/opcache/Optimizer)
2a3
> dfa_pass.c
8a10,21
> zend_call_graph.c
> zend_call_graph.h
> zend_cfg.c
> zend_cfg.h
> zend_dfg.c
> zend_dfg.h
> zend_dump.c
> zend_dump.h
> zend_func_info.c
> zend_func_info.h
> zend_inference.c
> zend_inference.h
11a25,27
> zend_ssa.c
> zend_ssa.h
> zend_worklist.h

PHP 7.1.8 と PHP 7.2.0 beta2 との差分は次のとおりです。さらにいくつかのファイルが増えているようです。

$ diff <(ls -1 php-7.1.8/ext/opcache/Optimizer) <(ls -1 php-7.2.0beta2/ext/opcache/Optimizer)
2a3,4
> compact_vars.c
> dce.c
9a12,15
> sccp.c
> scdf.c
> scdf.h
> ssa_integrity.c

*1:Lenovo ThinkPad Edge E130, Core i5-3337U 1.8GHz で、Windows 7 上の仮想機械としてインストールした CentOS 7 を利用しています。

*2:CLI で OPcache を有効にするには、-dopcache.enable_cli=1 を指定して実行します。

*3:Nikita Popov, Biagio Cosenza, Ben Juurlink, and Dmitry Stogov. 2017. Static optimization in PHP 7. In Proceedings of the 26th International Conference on Compiler Construction (CC 2017). ACM, New York, NY, USA, 65-75. DOI: https://doi.org/10.1145/3033019.3033026