唯一の公正な比較は、一般的なハードウェアでの最短の完了時間です。プログラムを完了するまでの時間は完全にハードウェアに依存します。それ以外の場合、より強力なマシンにお金を費やす意味はありますか?
再現可能な結果に最も近いのは、相対速度を報告することです。たとえば、サンプル プログラムを提供し、たとえば 50% の時間で実行されているユーザー プログラムに関して報告します。ある PC で 2 倍高速なプログラムは、別の PC でも 2 倍高速になる可能性があります。
大学では、「秘密の」入力に対して実行される課題を提出しますが、エラーを修正するために複数回提出することもできました。私の最初の送信はまったく機能しませんでしたが、すべての入力をログに記録しました。;)
編集:より長い答え。
次のプログラムを検討してください
public class FibMain {
public static void main(String... args) {
{
long start = System.nanoTime();
System.out.println(iteration_fib(Integer.parseInt(args[0])));
long time = System.nanoTime() - start;
System.out.printf("Iteration took %,d us%n", time / 1000);
}
{
long start = System.nanoTime();
System.out.println(recursive_fib(Integer.parseInt(args[0])));
long time = System.nanoTime() - start;
System.out.printf("Recursion took %,d us%n", time / 1000);
}
}
public static long iteration_fib(int n) {
long t1 = 1;
long t2 = 1;
while (n-- > 2) {
long t = t2;
t2 += t1;
t1 = t;
}
return t2;
}
public static long recursive_fib(int n) {
if (n <= 2) return 1;
return recursive_fib(n - 1) + recursive_fib(n - 2);
}
}
生成されたバイト コードを javap -c で見ると、
public static long iteration_fib(int);
Code:
0: lconst_1
1: lstore_1
2: lconst_1
3: lstore_3
4: iload_0
5: iinc 0, -1
8: iconst_2
9: if_icmple 25
12: lload_3
13: lstore 5
15: lload_3
16: lload_1
17: ladd
18: lstore_3
19: lload 5
21: lstore_1
22: goto 4
25: lload_3
26: lreturn
public static long recursive_fib(int);
Code:
0: iload_0
1: iconst_2
2: if_icmpgt 7
5: lconst_1
6: lreturn
7: iload_0
8: iconst_1
9: isub
10: invokestatic #13; //Method recursive_fib:(I)J
13: iload_0
14: iconst_2
15: isub
16: invokestatic #13; //Method recursive_fib:(I)J
19: ladd
20: lreturn
したがって、最初の例は 2 番目の例よりも長いため、最初の例の方が時間がかかると思われるかもしれません。ただし、「n」が興味深いサイズである場合は正しくありません。
マシンで FibMain 44 を実行したところ、次の結果が得られました。
701408733
Iteration took 495 us
701408733
Recursion took 19,174,036 us
これは、反復の実行にかかる時間は n (この場合は 44) に比例し、直線的に増加しますが、再帰にかかる時間は結果 (この場合は 701408733) に比例し、指数関数的に増加するためです。
入力として 50 を試してみると、1 回目は瞬く間に完了しますが、2 回目は時間がかかりすぎて、待つのに飽きてしまいます。