🐈

PHP,Rust,golangの性能比較

2023/04/08に公開

結論

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が使いやすそうだなと感想を持ちました。

今回ベンチマークに使ったソースは下記に公開してます。
https://github.com/ryotashona/benchmark

言い訳:
I/Oは、あまり意味無いなと思いつつ書いたのでリファクタリングしてないです・・・

Discussion