実際遅いみたいですね。
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のしょぼさがばれるな。