鳥井さんとわかれて、一人で。
二人だと行けないところに行こう、と思って、1時間並んで昼食。美味しかった。 http://tabelog.com/ishikawa/A1701/A170101/17006172/ ここ。
兼六園も、お城も良かった。
夜もたくさん食べてしまった。
鳥井さんにくっついて金沢へ。
新幹線、指定席がとれず、自由席に挑戦したが、連休初日だからか、むっちゃこんでいて、10分前だと、全然だめ。すし詰め状態だった。ので、1時間待って、次の便で座れた。
美術館に行くなど。夕飯も美味しい。
Ori and the Blind Forest: Definitive Edition をはじめたらしい。Windows 10 のストアで購入。
凄い面白かった。ただし、Xbox コントローラー必須(キーボードつらすぎた)。 これが2000円とか、ありえん。
いったことがなかった石見銀山へ。
松江で、車ない、と言ったら「どうやって行くの?」と言われたけど、ちゃんと電車とバスで行けました。宿は、その近く。いいところでした。
炭鉱跡は、凄い涼しいというか寒かった。
絶対どっかにありそうだけど、ベンチマーク用関数 fib_m() を考えてみた。
Sak 関数と呼んで下さい。 (いや、絶対誰か考えてるだろうけど...)
つまり、結果は 1 にしかならないので、Bignum の計算が不要になる。
ちょっと試してみた。
# Ruby def fib_m n case n when 0, 1 1 else fib_m(n-1) * fib_m(n-2) end end fib_m(40) =begin 2.4 trunk real 0m18.688s user 0m18.647s sys 0m0.016s 手元の trunk real 0m17.245s user 0m17.192s sys 0m0.028s =end
手元のビルド、ちょっとだけ改善が見られる。
# JRuby $ jruby -v jruby 9.0.3.0 (2.2.2) 2015-10-21 633c9aa OpenJDK 64-Bit Server VM 24.95-b01 on 1.7.0_101-b00 +jit [linux-amd64] $ time jruby ~/src/rb/t.rb real 0m19.053s user 0m18.294s sys 0m2.732s
ちょっと古いので、新しい奴はもっと速いと思う。
# Elixir defmodule FibM do def fib_m 0 do 1 end def fib_m 1 do 1 end def fib_m n do fib_m(n-1) * fib_m(n-2) end end FibM.fib_m(40) ''' $ time elixir lib/fib_m.ex real 0m7.797s user 0m0.270s sys 0m7.555s '''
BEAM VM 速いね...。
# C int fib_m(n) { if (n == 0 || n == 1) { return 1; } else { return fib_m(n-1) * fib_m(n-2); } } main(){ fib_m(40); } /* $ gcc fib_m.c $ time ./a.out real 0m0.912s user 0m0.905s sys 0m0.004s $ gcc -O3 fib_m.c $ time ./a.out real 0m0.262s user 0m0.252s sys 0m0.008s */
なんというか、起動時間が大勢を占めているっぽい。-O3 で残ってるんか? 見てみたら一応、残っていた。というか、凄い展開されてる。
# Python def fib_m(n): if n == 0: return 1 elif n == 1: return 1 else: return fib_m(n-1) * fib_m(n-2) fib_m(40) $ python --version ~/src/py/fib_m.py Python 2.7.6 $ time python ~/src/py/fib_m.py real 0m38.784s user 0m38.733s sys 0m0.028s $ python3 --version Python 3.4.3 $ time python3 ~/src/py/fib_m.py real 0m42.571s user 0m42.540s sys 0m0.012s
意外と遅い。
# Crystal 0.18.6 [204bfd0] (2016-06-28) def fib_m(n) case n when 0, 1 1 else fib_m(n-1) * fib_m(n-2) end end fib_m(40) $ crystal -v Crystal 0.18.6 [204bfd0] (2016-06-28) $ time crystal fib_m.cr real 0m3.231s user 0m2.251s sys 0m1.053s
はえー。
# scheme (Gauche) (define (fib_m n) (cond ((= n 0) 1) ((= n 1) 1) (else (* (fib_m (- n 1)) (fib_m (- n 2)))))) (fib_m 40) $ gosh -V Gauche scheme shell, version 0.9.3.3 [utf-8,pthreads], x86_64-unknown-linux-gnu $ time gosh ~/src/scheme/fib_m.scm real 0m15.085s user 0m14.982s sys 0m0.080s
計ってるのは関数呼び出しのコストだから、アルゴリズム替えろよ、とかは無しで。
というわけで、主要 n 言語でした(嘘)。
これはSqueak圧勝の予感..