【PHP8.1】PHP8.1はPHP7.4より20%高速化している

MLに[Automatic performance benchmarking: PHP 8.1 is ~30% faster than PHP 7.4](https://externals.io/message/116323)という投稿があったので紹介してみます。

# https://externals.io/message/116323

## kocsismate90

最近PHP用の自動ベンチマークフレームワークを作ってるんだけど、その宣伝に来たよ。
最初は[is_literal](https://wiki.php.net/rfc/is_literal)のRFCの性能評価に使ったんだけど、その後多くの問題を修正して新機能も追加したよ。

昔[インテルが行った自動ベンチマーク](https://externals.io/message/89843#89843)を覚えてる人もいるかもしれない。
私はこのプロジェクトに刺激を受け、そして今同じようなことをやっているけど、さすがに彼らほど高度なことはできなさそう。

今作っている[php-version-benchmarks](https://github.com/kocsismate/php-version-benchmarks)は、

・完全自動で定期的に実行してくれる。
・Dockerでローカル実行可能。クラウド(現在はAWSのみ)でも実行可能。
・X86-64とARM64に対応。
・PHP7.4以降に対応
・OPcache/JIT/preloadingにも対応
・PHPのソース、および現実的なサイトとしてのサンプルにSymfonyとLaravel入り。

最新のベンチマーク結果は[こちら](https://github.com/kocsismate/php-version-benchmarks/blob/main/docs/results/2021_11_11_09_20_1_aws_arm64_c6g_4xlarge/result.md)で公開してるよ。
この結果を定期的にMLに投稿するのはどうだろう？

## come@chilliet.eu 

MLに自動配信は邪魔なのでやめて。
大きな変更があったときに投稿するとかは歓迎。

## Craig Francis

デグレを発見できたりするかもしれないのは便利かも。

## kocsismate90

ごめん計算間違ってたので修正した。
30%じゃなくて23%とか21.5%くらいだった。
それでも十分な性能向上だからすごいと思う。


# 測定結果

[kocsismate/php-version-benchmarks](https://github.com/kocsismate/php-version-benchmarks/tree/main/docs/results)で見ることができます。

## 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のベンチマークです。
具体的には[計算処理を延々繰り返す](https://github.com/kocsismate/php-version-benchmarks/blob/main/app/zend/bench.php)というよくあるやつです。

| 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倍速くなった](https://qiita.com/rana_kualu/items/05a510f53c0ea9a1ccaf)ってのに、そこからさらに2割増しってどういうことだよ。

このまま高速化が続けば、そのうちC言語の速度を追い抜いてしまうかもしれませんぞ。