PHPの各バージョンの計算速度を比較してみた
概要
最近PHPを触り始めたんですが、PHPの計算処理はくそ遅いって記事とか、いや意外と速くなったとかって話とかを聞いたので、実際にどうなのかをバージョンごとに分けてベンチマークをざっと比較してみようと思いました。
今回、参考にしたページはこちらです
上記サイトではphpは比較されてなかったのですが、実際に比較する上で他の言語との比較も一応できたらいいかな、ということで同じくライプニッツ級数を計算する時間を計測しました。(当然マシーンパワーの差などあるので良い比較ではありませんが、、)
<?php
function leibniz_formula()
{
$s = 0;
for ($i = 0; $i < 10**8; $i++)
{
$s += ((-1)**$i)/(2*$i + 1);
}
return $s;
}
leibniz_formula()
その他、実際のソースコードはこちらです。DockerとMakefileでパパッと構築できるので、もし良ければ遊んでみてください。
計測
では、実際に計測していきましょう。
今回使用したphpのバージョンは以下です
- php 5.6.40
- php 7.0.33
- php 7.4.16
- php 8.0.3
※ちなみに、実際には何回ずつか測定しましたが、それぞれの結果はほぼ一定でした。
php 5.6
まずは、php 5.6からです。
$ /usr/bin/time -f "\nreal:%e[sec]\nuser:%U[sec]\nsys:%S[sec]\nMemory:%M[KB]" php LeibnizFormula.php
real:15.38[sec]
user:15.34[sec]
sys:0.01[sec]
Memory:20560[KB]
どうなんでしょうか。。?笑
ざっと、参考記事をみてみた感じ、当然C言語(3.68s)やJava(8.18s)には敵いませんが、Python(49.65s)とかをみるとそんなに悪くない感じがしますね笑
php 7.0
では、次にphp7.0です。
$ /usr/bin/time -f "\nreal:%e[sec]\nuser:%U[sec]\nsys:%S[sec]\nMemory:%M[KB]" php LeibnizFormula.php
real:12.97[sec]
user:12.94[sec]
sys:0.00[sec]
Memory:23184[KB]
お、まあまあ速くなってますね。およそ85%の時間です。ただ、代償なのかわかりませんが、メモリーの消費も増えてますね。
php 7.4
では、次に7.4です。同じ7なのであまり期待できないな。と思ってましたが、、、
$ /usr/bin/time -f "\nreal:%e[sec]\nuser:%U[sec]\nsys:%S[sec]\nMemory:%M[KB]" php LeibnizFormula.php
real:10.17[sec]
user:10.16[sec]
sys:0.01[sec]
Memory:21752[KB]
結構短くなってる!!さっきよりも大きく改善してますね。驚きました。
php 8.0
では、最後に、php8です。これには大きな期待がかかります。
$ /usr/bin/time -f "\nreal:%e[sec]\nuser:%U[sec]\nsys:%S[sec]\nMemory:%M[KB]" php LeibnizFormula.php
real:10.26[sec]
user:10.20[sec]
sys:0.01[sec]
Memory:21928[KB]
あれ??全然、変わらない。速くなったって聞いたんだけどなぁ。ということで調べてみたところ、こちらの記事が見つかりました。
要約すると、JITという技術が導入されて、たしかに速くはなっているが、まだデフォルトではオフなので設定してあげないといけない、とのことでした。php 8.0 with JIT
php.iniに以下の設定を追加しました。
zend_extension = opcache
[opcache]
opcache.enable_cli=1
opcache.enable = 1
opcache.jit = on
opache.optimization_level=0x7FFFBFFF
opcache.jit_buffer_size = 128M
そして実行結果がこちらです。
/usr/bin/time -f "\nreal:%e[sec]\nuser:%U[sec]\nsys:%S[sec]\nMemory:%M[KB]" php LeibnizFormula.php
real:10.01[sec]
user:9.87[sec]
sys:0.07[sec]
Memory:25424[KB]
んーー、ほとんど変わってないように見えますね。JITはキャッシュの仕組みらしいので、試しに数回走らせてみると、0.5s程度は速くなりました。
キャッシュする分、メモリの使用量が上がっているので、おそらくJIT自体は効いているのかな。?
実は試しにこちらの方のプログラムを走らせてみたところ、自分のよりもかなり速くなったのでJITが効果を発揮するのにも何か条件がありそうです。
予測するに、JITは事前にソースコードをネイティブコードに変換するものらしいのですが、LeibnizFormulaは比較的プリミティブな計算ばかりなので、あまり効果を発揮できなかったのかもしれません。ここら辺、今後検証することがあれば追記します。
では、自由研究みたいになってしまいましたが、読んでいただきありがとうございました!笑
検証表(おまけ)
後日再度数回ずつ検証した表となります。
5.6 | 7.0 | 7.4 | 8.0 | 8.0 JIT |
---|---|---|---|---|
18.85s | 16.23s | 11.05s | 12.31s | 10.13s |
18.74s | 13.91s | 10.44s | 10.49s | 9.67s |
17.84s | 15.02s | 11.09s | 11.15s | 9.83s |
Discussion
テーブル形式で比較結果がまとめられていると分かりやすいかもです
たしかに、その通りですね!ありがとうございます。
JITなどの検証をしたのち、まとめたいと思います