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 付属に負けてしまった。何度かやってみたけど、誤差の範囲ではなかった。
というわけで、結論: