のっかりフィボナッチベンチ

恒例のフィボナッチベンチで 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は簡単に書ける割に早いなぁ。