鳥井さんとわかれて、一人で。
二人だと行けないところに行こう、と思って、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圧勝の予感..