42
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-03

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言語の速度を追い抜いてしまうかもしれませんぞ。

42
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?