おはようございます。週末は長男のお稽古始めでした。年の初めということもあり、はしごしている二つの 習い事ともに、いつもよりグダグダ度が高っかたようです。@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の方がはやくなった。 ただし、末尾再帰にしたからはやくなったというわけでもなく、 末尾再帰に変形する過程でアルゴリズムが改善され、その結果はやくなるとの 解説を見かけた。ので、その辺りはおいおい勉強せねば。
参考資料
- python - Tail Recursion Fibonacci - Stack Overflow
- Ruby で末尾呼び出し最適化する方法 - おもしぇてっく
- Rubyの再帰処理でTail call optimizationは有効か実験してみた - Qiita
Rubyの作者のまつもとゆきひろさんからなんとコメント頂きました!
mrubyはメモリ消費量は少なめですが(場合による)、高速化はそれほど望めません。 https://t.co/Vknh2BBolC
— Yukihiro Matsumoto (@yukihiro_matz) 2016年1月18日
ありがとうございました!