読者です 読者をやめる 読者になる 読者になる

Rubyは遅い

実際遅いみたいですね。
http://www.atmarkit.co.jp/news/200809/11/ruby.html

理由としてあがってるのはこんなとこ。

コンパイル時に型が決まらないことから最適化が効きづらいこと。

動的言語の難しいところですね。

関数がなく、すべてメソッドであること。トップレベルで関数を定義しても、mainオブジェクトの”関数的”メソッドとなりメソッド探索のコストがかかる。

へー

標準で提供されるクラスのメソッドも書き換え可能な”オープンクラス”であるため、例えば「1+1」をコンパイル時に計算できない。

これはマジです。整数の+演算子をオーバーライドしてみます。

class Fixnum
  def + n
    self * n
  end
end

p 1 + 1

出力は1です。
そう考えると1Gを表すのにPerlなら「2**30」って書いてたけど、rubyの場合はそれをやめて「1073741824」と書いたほうがいいのかな。どのくらい違うのかあとで試してみよう。



で、Rubyな人たちの反論はと。

これに対するRubyコミュニティやまつもと氏の典型的な反論は、「PCより開発者の時間(生産性)のほうが重要」、「WebアプリケーションではIO性能がボトルネックになっていてCPU はあまり使わない」、「ハードウェアの性能は年々上がっている」、「スケールアウトすればいい」というもので、「実は反論のどれもRubyが速いとは言ってない。遅いのは事実」(前田氏)という。

反論じゃないw というかぜんぜん気にしてないですねww
言ってることも的を得てる。国内最大のruby製サイト、cookpadの橋本さんも同じようなこと言ってたし。
結局いちばん遅いのは人とディスクIO。





追記:
簡易的にだけど試してみた。

[mikeda@cent ~]$ time ruby -e '1_000_000.times do 2**30 end'

real 0m7.672s
user 0m7.193s
sys 0m0.474s
[mikeda@cent ~]$ time ruby -e '1_000_000.times do 1073741824 end'

real 0m1.289s
user 0m0.855s
sys 0m0.435s
[mikeda@cent ~]$
[mikeda@cent ~]$
[mikeda@cent ~]$ time perl -e '2**30 for 0..1_000_000'

real 0m0.113s
user 0m0.110s
sys 0m0.003s
[mikeda@cent ~]$ time perl -e '1073741824 for 0..1_000_000'

real 0m0.107s
user 0m0.104s
sys 0m0.003s

rubyだと明らかに遅くなりますね。というかPerlとの差・・・
というわけでRubyでは定数はちゃんと宣言して使おう。
いやどの言語でも当たり前ですねww すみません。


またヒマなときにちゃんとbenchmarkしてみます。
しかしPCのしょぼさがばれるな。