【Ruby】ifとcaseで速度比較してみた

zomです。
仕事上でifを連発している過去の自分のソースを見て、caseで書き直したほうが見やすいのでは?と思い、リプレイスしてみました。
やってみたものの「まぁ、多少見やすくなったかな?」程度の結果でした。
肝心なのは「多少の見栄え < 速度」だと思いますので、速度が落ちていないかどうかが問題です。
そこで思ったのですが、ifとcaseで速度に違いはあるのか?ということでした。

普通に考えれば演算子がifは==で比較して、caseは===で、とか、そもそもの比較対象によって速度は変わるので一概に言えないのではないだろうか、というのが自分の考えです。
それでも百聞は一見にしかずだろ、ということでやってみます。

あ、その前にググってみたらRubyのifとcaseでは、どちらが速いかこちらですでにやってました。
でも、バージョンも書いてないし、一応試してみます。

上記のサイトのをそのまま使わせていただきます。

Ruby1.9.3で試してみます。

ん?上記のサイトとだいぶ違う結果が…。
まさか実行順が違う?と思って2回めの前にifとcaseの順番を変えてますが、当然そういうわけではなさそう。

じゃあRuby2.0ならどうだろう?

おー…。

ちなみに1.9と2.0ではサーバが別物なので、そこでの数値は比較できないです。(rbenvがあるので、やろうと思えばできますが面倒…)
いずれにしてもRuby1.9と2.0だとcaseのほうが3倍~4倍程度速いっぽい?

確かcaseの内部では===(case比較演算子)が使われてるはず。
じゃあif文の==をcase比較演算子に書き換えたら数値が近づくかな?と思い試してみました。

さっきの1.8sくらいから0.2sくらい悪化してますけど!?
まぁ、case比較演算子のほうが型までみたり、時間がかかるイメージはありますが…じゃあなんでcaseのほうが速い?

と、謎は謎のままです。
何事も自分で計測して確かめるのが一番ですね。(無難なまとめ)

投稿者:

zom

都内でプログラマやってるアラサーの男性です。 このブログは日記とか書いてます。ゆるーくやってます。かるいオタクです。 パズドラ/クラクラ/ケリ姫/にゃんこ大戦争あたりをよくやってます。 以下、人名は敬称略。音楽大好き。平沢進、ヒトリエ、FinalFantasyあたりのコンサート・ライブによく行きます。マンガも大好きです。作者で言うと日本橋ヨヲコ、水上悟志あたり。

コメントを残す

メールアドレスが公開されることはありません。