PHP,Rust,golangの性能比較
結論
Rustは無条件で処理が早い
I/Oが絡むと効果が見えないが、処理効率を考えなくて良いのはメリット
PHPのメモリが異常に高い。この原因が分からなかった
memory_limitで制限かけても結果は変わらず
分かる方が居たら、コメント頂けるとうれしいです
背景
Rustが早いのは知っていたが、実際どんなもんだろう?と思ったので、適当なベンチマークを作って調べて見ました
あと、golangを軽く触ってみたかった
ベンチマーク
ライプニッツ級数(単純ループ計算処理)
[(-1)^n / (2n+1)]
上記n=0~10^8まで累計して X 4
PHP8-JIT | Rust | golang | |
---|---|---|---|
real [sec] | 6.36 | 1.34 | 9.00 |
user [sec] | 6.31 | 1.33 | 9.00 |
sys [sec] | 0.00 | 0.00 | 0.00 |
Mem [KB] | 27,888 | 1,840 | 3,452 |
Rustは予想通り早いですね。メモリも最小。
PHP8-JITよりgolangの方が遅いのは意外でした。
JITなしで試してみたら、どっこいどっこいでした。
JITの効果は結構ある。
メモリについてはPHPがなぜか異常に高い。
フィボナッチ数列(再帰呼び出し)
function getFib(int $n): int {
return $n < 2 ? $n : getFib($n - 1) + getFib($n - 2);
}
[getFib]を40回
PHP8-JIT | Rust | golang | |
---|---|---|---|
real [sec] | 2.37 | 0.23 | 0.35 |
user [sec] | 2.37 | 0.23 | 0.34 |
sys [sec] | 0.00 | 0.00 | 0.00 |
Mem [KB] | 27,996 | 1,832 | 3,388 |
Rustが最速、最小。予想通り。
こちらではPHP8-JITとgolangでの差が明確に出ました。
メモリについてはPHPがなぜか異常に高い。
I/O処理
input_file: 1レコード:int型:5カラム 200レコードのcsv
上記CSVをDB(mysql)にinsert (あえてトランザクション制御なし)
insertしたデータをcsvに書き出し
書き出したcsvとインプットファイルのレコード比較
以上を5回繰り返す
PHP8-JIT | Rust | golang | |
---|---|---|---|
real [sec] | 3.80 | 4.66 | 4.17 |
user [sec] | 0.02 | 0.06 | 0.04 |
sys [sec] | 0.03 | 0.17 | 0.11 |
Mem [KB] | 28,800 | 8,336 | 11,668 |
こちらではPHPが最速となってます。
メモリはこれまでと同じ傾向です。
ソースを見てもらえれば分かると思いますが、下記が影響しているかと思います。
- 1スレッド限定条件のため、Rustとgolangは非同期オーバーヘッドあり
- PHPはフレームワークを使ってないので、シンプルなのも影響している?
やはり、Disc I/Oの影響がデカいです。
実際の処理では並列で処理が走るので、これだけだと判断出来ないですね。
まとめ
Rustが何も考えないでも早し、メモリもあまり考えなくていいですね。好きです。
クセが強いので、仕事で使うには周りに使える人を増やす必要がありますが。
単純ループ処理でのPHP8の健闘に驚きました。PHP5から考えるとすごく早くなってるなと。
とはいえ、パース処理などで使われるであろう、再帰処理が他言語との差が大きいのでそれからgolangが使いやすそうだなと感想を持ちました。
今回ベンチマークに使ったソースは下記に公開してます。
言い訳:
I/Oは、あまり意味無いなと思いつつ書いたのでリファクタリングしてないです・・・
Discussion