non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

rubyの代わりにmrubyをつかう→はやくならなかったorz

おはようございます。週末は長男のお稽古始めでした。年の初めということもあり、はしごしている二つの 習い事ともに、いつもよりグダグダ度が高っかたようです。@kjunichiです。

mrubyにすれば、はやくなると思いきや

試した環境

$ ruby --version
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]

$ mruby/bin/mruby --version
mruby 1.1.0 (2014-11-19) 

対象コード

def fib(n)
    return n if n <= 1
      fib(n - 1) + fib(n - 2)
end

puts fib(40)

比較結果

$ time ruby fib.rb
102334155

real    0m16.538s
user    0m15.998s
sys 0m0.068s

$ time mruby/bin/mruby fib.rb 
102334155

real    0m59.323s
user    0m58.628s
sys 0m0.103s

CRubyよりはやいと思ったmrubyだったが、結果はmrubyの方が遅かった。

末尾再帰にして再チャレンジ

def fib(n)
    def fib_help(a, b, n)
      if n>0
        fib_help(b, a+b, n-1) 
      else 
        a
      end
    end
    fib_help(0, 1, n)
end

puts fib(40)
$ time ruby fib3.rb 
102334155

real    0m0.548s
user    0m0.057s
sys 0m0.040s

$ time mruby/bin/mruby fib3.rb 
102334155

real    0m0.200s
user    0m0.016s
sys 0m0.006s

末尾再帰にしたら、mrubyの方がはやくなった。 ただし、末尾再帰にしたからはやくなったというわけでもなく、 末尾再帰に変形する過程でアルゴリズムが改善され、その結果はやくなるとの 解説を見かけた。ので、その辺りはおいおい勉強せねば。

参考資料

Rubyの作者のまつもとゆきひろさんからなんとコメント頂きました!

ありがとうございました!

関連記事

11年前の記事

9年前の記事

7年前の記事

5年前の記事