MacPorts でインストールした Ruby は遅いらしい

Rubyメーリングリストで出た話題。
MacPorts でインストールした Ruby は遅いらしい。

というわけで、MacOS X 10.5 Leopard で確かめてみた。

$ /usr/bin/ruby -v           # MacOS X 付属
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
$ /usr/local/bin/ruby -v     # 自前でコンパイル&インストール
ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.4.0]
$ /opt/local/bin/ruby -v     # MacPorts でインストール
ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9]

まずは fibonacci で確かめてみる。

def fib(n)
  n <= 1 ? 1 : fib(n-1) + fib(n-2)
end

if __FILE__ == $0
  require 'benchmark'
  n = $N ? $N.to_i : 30
  Benchmark.benchmark do |x|
    x.report("fib(#{n})") do
      fib(n)
    end
  end
end

実行結果。

$ /usr/bin/ruby -s fib.rb -N=33
fib(33)  4.560000   0.010000   4.570000 (  4.611006)
$ /usr/local/bin/ruby -s fib.rb -N=33
fib(33)  4.490000   0.010000   4.500000 (  4.557644)
$ /opt/local/bin/ruby -s fib.rb -N=33
fib(33) 22.220000   8.220000  30.440000 ( 30.747271)

結果は、自前コンパイル >= Mac付属 >> MacPorts という結果に。むう、MacPorts Ruby は確かに 5 倍近く遅い。


次に、もっと現実寄りのテストを求めて、Erubis 付属のベンチマークを試してみる。

erubis$ /usr/bin/ruby -rubygems bench.rb -n 10000  Erubis::Eruby
*** ntimes=10000, testmode=execute
                                    user     system      total        real
Erubis::Eruby                   7.490000   0.210000   7.700000 (  7.805032)
erubis$ /usr/local/bin/ruby -rubygems bench.rb -n 10000  Erubis::Eruby
*** ntimes=10000, testmode=execute
                                    user     system      total        real
Erubis::Eruby                   7.330000   0.230000   7.560000 (  7.709817)
erubis$ /opt/local/bin/ruby -rubygems bench.rb -n 10000  Erubis::Eruby
*** ntimes=10000, testmode=execute
                                    user     system      total        real
Erubis::Eruby                  10.220000   1.450000  11.670000 ( 11.880084)

ベンチマーク結果は、自前コンパイル >= Mac付属 >> MacPorts という結果に。
MacPorts Ruby は確かに遅い。ただ、fibonacci ほどの差はついてないから、あんまり問題にならなかったんだろう。


次に Erubis の、eRuby ファイルの parse 部分だけをテストしてみる。これは主に正規表現のマッチング速度が重要になるはず。

erubis$ /usr/bin/ruby -rubygems bench.rb -n 10000 -m convert Erubis::Eruby
*** ntimes=10000, testmode=convert
                                    user     system      total        real
Erubis::Eruby                   2.700000   0.200000   2.900000 (  2.939682)

erubis$ /usr/local/bin/ruby -rubygems bench.rb -n 10000 -m convert Erubis::Eruby
*** ntimes=10000, testmode=convert
                                    user     system      total        real
Erubis::Eruby                   2.810000   0.200000   3.010000 (  3.056374)

erubis$ /opt/local/bin/ruby -rubygems bench.rb -n 10000 -m convert Erubis::Eruby
*** ntimes=10000, testmode=convert
                                    user     system      total        real
Erubis::Eruby                   5.020000   1.130000   6.150000 (  6.827484)

こんどは Mac付属 >= 自前コンパイル >> MacPorts という結果に。むう、MacPorts が遅いのはかわらないが、自前コンパイルMac 付属に負けてしまった。何度かやってみたけど、誤差の範囲ではなかった。


というわけで、結論:

  • MacPorts でインストールした Ruby は、確かに遅い。
  • ただし、現実的なアプリケーション*1では体感できるほどの差はないかもしれない。

*1:Erubis のベンチマーク程度で「現実的なアプリケーション」というのもおかしいけど。