MLにAutomatic performance benchmarking: PHP 8.1 is ~30% faster than PHP 7.4という投稿があったので紹介してみます。
https://externals.io/message/116323
kocsismate90
最近PHP用の自動ベンチマークフレームワークを作ってるんだけど、その宣伝に来たよ。
最初はis_literalのRFCの性能評価に使ったんだけど、その後多くの問題を修正して新機能も追加したよ。
昔インテルが行った自動ベンチマークを覚えてる人もいるかもしれない。
私はこのプロジェクトに刺激を受け、そして今同じようなことをやっているけど、さすがに彼らほど高度なことはできなさそう。
今作っているphp-version-benchmarksは、
・完全自動で定期的に実行してくれる。
・Dockerでローカル実行可能。クラウド(現在はAWSのみ)でも実行可能。
・X86-64とARM64に対応。
・PHP7.4以降に対応
・OPcache/JIT/preloadingにも対応
・PHPのソース、および現実的なサイトとしてのサンプルにSymfonyとLaravel入り。
最新のベンチマーク結果はこちらで公開してるよ。
この結果を定期的にMLに投稿するのはどうだろう?
come@chilliet.eu
MLに自動配信は邪魔なのでやめて。
大きな変更があったときに投稿するとかは歓迎。
Craig Francis
デグレを発見できたりするかもしれないのは便利かも。
kocsismate90
ごめん計算間違ってたので修正した。
30%じゃなくて23%とか21.5%くらいだった。
それでも十分な性能向上だからすごいと思う。
測定結果
kocsismate/php-version-benchmarksで見ることができます。
Laravel demo app - 25 consecutive runs, 250 requests (sec)
実用環境、すなわち実環境のLaravelに大量のリクエストを送り付けて結果を見るテストです。
PHP | 最小 | 最大 | 標準偏差 | 平均値 | 平均値差分 | 中央値 | 中央値差分 | メモリ |
---|---|---|---|---|---|---|---|---|
PHP 7.4 | 1.33639 | 1.46424 | 0.03508 | 1.36586 | 0.00% | 1.35102 | 0.00% | 33.00 MB |
PHP 8.0 | 1.25693 | 1.39606 | 0.03539 | 1.28991 | -5.56% | 1.27588 | -5.56% | 32.39 MB |
PHP 8.1 | 1.05594 | 1.06841 | 0.00409 | 1.06094 | -22.32% | 1.05898 | -21.62% | 35.48 MB |
PHP 8.1 (JIT) | 1.04156 | 1.08010 | 0.00697 | 1.04972 | -23.15% | 1.04883 | -22.37% | 43.29 MB |
PHP 8.1 (preloading) | 1.05253 | 1.14954 | 0.02023 | 1.06853 | -21.77% | 1.06247 | -21.36% | 35.37 MB |
PHP7.4から8.0で5%、そして7.4から8.1では2割の高速化と、わりかしえらいことになっています。
単純にPHP8.0からPHP8.1にするだけでも1割以上早くなるというわけで、PHPの最適化はいったいどうなってるんですかね。
しかし、JITをオンにしても影響はほぼありません。
おそらくは処理時間のほとんどがDBやファイルとのI/Oだからでしょう。
CPUの使用時間なんてI/Oに比べたら微々たるものですからね。
bench.php - 15 consecutive runs (sec)
こちらはCPUのベンチマークです。
具体的には計算処理を延々繰り返すというよくあるやつです。
PHP | 最小 | 最大 | 標準偏差 | 平均値 | 平均値差分 | 中央値 | 中央値差分 | メモリ |
---|---|---|---|---|---|---|---|---|
PHP 7.4 | 0.34132 | 0.34402 | 0.00067 | 0.34197 | 0.00% | 0.34182 | 0.00% | 23.52 MB |
PHP 8.0 | 0.33340 | 0.34220 | 0.00245 | 0.33838 | -1.05% | 0.33817 | -1.07% | 23.43 MB |
PHP 8.1 | 0.34259 | 0.35276 | 0.00247 | 0.34749 | 1.61% | 0.34850 | 1.95% | 23.52 MB |
PHP 8.1 (JIT) | 0.10965 | 0.11136 | 0.00044 | 0.10993 | -67.85% | 0.10978 | -67.88% | 25.23 MB |
PHP 8.1 (preloading) | 0.34613 | 0.35117 | 0.00180 | 0.34757 | 1.64% | 0.34623 | 1.29% | 23.53 MB |
JITやべえ。
露骨にJITの恩恵が出ていますね。
JITのとんでもない高速化が目を引きますが、JIT以外はそんなに早くなっていない、というよりむしろ若干遅くなっていますね。
1-2%程度なのでほぼ気付かない程度ですが。
測定結果からすると、JITはCPUをぶん回す処理に圧倒的に強く、バックエンドでのバッチ処理などに向いています。
Laravelなどの通常アプリでは逆にJITの恩恵がほぼ無く、単純にPHP8.1での全体的な処理能力向上がパフォーマンスに寄与しています。
従って、Web用サーバではJIT無効で運用し、バッチ用バックエンドサーバではJITを有効にする、という戦略が有効でしょう。
まあ大抵は兼用している気がしますが、その場合はとりあえずJIT有効にしておけばいいんじゃないかな。
感想
お前まだ早くなるのか。
PHP7.3でPHP5から3倍速くなったってのに、そこからさらに2割増しってどういうことだよ。
このまま高速化が続けば、そのうちC言語の速度を追い抜いてしまうかもしれませんぞ。