前回の記事って本当は、Java > Cという話をしたかったんですよ。ベンチマークって本当に難しいですね! というわけで、今回はJava > Cという話をみつけました。フィボナッチ数列ってやつです。
まずはCバージョンを書いてみましょう。
1 #include <stdio.h>
2
3 int fib(int n) {
4 if(n < 2)
5 return n;
6 else
7 return fib(n - 2) + fib(n - 1);
8 }
9
10 int main() {
11 printf("%d\n", fib(40));
12 }
実行結果は、下記の通りです。
% cc fib.c -o fib % time ./fib 102334155 ./fib 3.30s user 0.01s system 98% cpu 3.361 total
次は、Javaバージョンを書いてみましょう。
1 class Fib {
2 public static int fib(int n) {
3 if(n < 2)
4 return n;
5 else
6 return fib(n - 2) + fib(n - 1);
7 }
8 public static void main(String[] args) {
9 System.out.println(fib(40));
10 }
11 }
実行結果は下記の通りです。Javaの方が早い結果がでています。
% javac Fib.java % time java Fib 102334155 java Fib 1.89s user 0.04s system 98% cpu 1.963 total
サーバVM向けの最適化オプションをつけてみましょう。もっと良い結果が得られます。Javaおそるべしですね。
% time java -server Fib 102334155 java -server Fib 1.46s user 0.04s system 95% cpu 1.573 total
ちなみに、gccにも最適化というものがありますので、そちらを有効にしてみましょう。
% cc fib.c -O3 -o fib % time ./fib 102334155 ./fib 1.10s user 0.01s system 93% cpu 1.182 total
アッー!

アー!
アッー!