のっかりフィボナッチベンチ
恒例のフィボナッチベンチで V8 と Smalltalk、Ruby、Python、Scheme とを戦わせてみる - Smalltalkのtは小文字ですを見て、お手軽なのでなじみの言語で試してみることに。スペックがしょぼしょぼなので軽めで。
def fib(n) n < 2 ? n : fib(n - 1) + fib(n - 2) end p fib(35)
mitsu@garlic$ time ruby fib.rb 9227465 real 1m54.822s user 1m55.033s sys 0m0.005s mitsu@garlic$ time ~/local/ruby19/bin/ruby fib.rb 9227465 real 0m26.972s user 0m26.661s sys 0m0.001s
let rec fib n = if n < 2 then n else ((fib (n - 1)) + (fib (n - 2))) ;; print_int (fib 35)
mitsu@garlic$ ocamlc -o fib.byte fib.ml mitsu@garlic$ ocamlopt -o fib.native fib.ml mitsu@garlic$ time ./fib.byte 9227465 real 0m8.592s user 0m8.543s sys 0m0.001s mitsu@garlic$ time ./fib.native 9227465 real 0m0.719s user 0m0.706s sys 0m0.005s mitsu@garlic$
- C
#include <stdio.h> int fib(int n) { int ret; if (n < 2) { ret = n; } else { ret = fib(n - 1) + fib(n - 2); } return ret; } int main(int argc, char *argv[]) { printf("%d\n", fib(35)); return 0; }
mitsu@garlic$ cc -o fib fib.c mitsu@garlic$ time ./fib 9227465 real 0m1.102s user 0m1.091s sys 0m0.000s mitsu@garlic$ cc -O -o fib fib.c mitsu@garlic$ time ./fib 9227465 real 0m1.135s user 0m1.124s sys 0m0.004s mitsu@garlic$ cc -O2 -o fib fib.c mitsu@garlic$ time ./fib 9227465 real 0m0.667s user 0m0.656s sys 0m0.007s mitsu@garlic$
う〜〜〜ん、OCamlは簡単に書ける割に早いなぁ。