🐚

PHPの各バージョンの計算速度を比較してみた

2021/04/16に公開
2

概要

最近PHPを触り始めたんですが、PHPの計算処理はくそ遅いって記事とか、いや意外と速くなったとかって話とかを聞いたので、実際にどうなのかをバージョンごとに分けてベンチマークをざっと比較してみようと思いました。

今回、参考にしたページはこちらです
https://qiita.com/hanaata/items/c91788bcac2a40f1bb05

上記サイトではphpは比較されてなかったのですが、実際に比較する上で他の言語との比較も一応できたらいいかな、ということで同じくライプニッツ級数を計算する時間を計測しました。(当然マシーンパワーの差などあるので良い比較ではありませんが、、)

LeibnizFormula.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でパパッと構築できるので、もし良ければ遊んでみてください。
https://github.com/Kai180621/php-benchmark

計測

では、実際に計測していきましょう。
今回使用した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]

あれ??全然、変わらない。速くなったって聞いたんだけどなぁ。ということで調べてみたところ、こちらの記事が見つかりました。
https://solidseed.co.jp/column/php8-jit/
要約すると、JITという技術が導入されて、たしかに速くはなっているが、まだデフォルトではオフなので設定してあげないといけない、とのことでした。

php 8.0 with JIT

php.iniに以下の設定を追加しました。

php.in
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が効果を発揮するのにも何か条件がありそうです。
https://qiita.com/rana_kualu/items/73c346b3feadfa3a5b21

予測するに、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

mpywmpyw

テーブル形式で比較結果がまとめられていると分かりやすいかもです

FooliShellFooliShell

たしかに、その通りですね!ありがとうございます。
JITなどの検証をしたのち、まとめたいと思います