공정한 비교는 일반적인 하드웨어에서 가장 짧은 완료 시간입니다. 프로그램을 완료하는 데 걸리는 시간은 전적으로 하드웨어에 달려 있습니다. 그렇지 않은 경우 더 많은 전력 기계에 돈을 쓰는 것이 무엇이겠습니까?
재현 가능한 결과를 얻는 가장 가까운 방법은 상대 속도를보고하는 것입니다. 시간의 50 %를 실행하는 사용자 프로그램의 기간에 샘플 프로그램 및 보고서를 제공하십시오. 한 대의 PC에서 두 배 빠른 속도의 프로그램은 다른 컴퓨터에서 두 배 빠른 속도를 보입니다.
uni에서는 "secret"입력에 대해 실행될 과제를 제출하지만 오류를 수정하기 위해 두 번 이상 제출할 수 있습니다. 첫 번째 제출은 전혀 작동하지 않았지만 모든 입력을 기록했습니다. ;)
편집 : 더 긴 대답.
는 다음과 같은 프로그램을 고려
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);
}
}
당신은 그래서 첫 번째 예는 더 이상 두 번째는 당신이 의심 할 수 있도록한다는 것입니다 당신이
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
를 참조 -c은 javap로 생성 된 바이트 코드를 보면 처음에는 더 오래 걸립니다. 그러나 'n'이 흥미로운 크기 인 경우 올바르지 않습니다.
내 컴퓨터에서 FibMain 44를 실행했는데 다음과 같은 결과가 나타납니다.
701408733
Iteration took 495 us
701408733
Recursion took 19,174,036 us
반복을 수행하기 위해 걸리는 시간은 (이 경우 701,408,733에서) 재귀 걸리는 시간은 결과에 비례하지만 선형 증가 광고 (여기서는 44) N에 비례하고이 성장하기 때문이다 기하 급수적으로.
입력으로 50 번 시도하면 깜박임으로 첫 번째로 완료되고, 두 번째 입력은 기다리는 시간이 너무 길어집니다.
[언어 차단에 대한 엄격한 고지를 삽입 : http://shootout.alioth.debian.org/] – Juliet
님! 고마워, 줄리엣! –
하나의 스레드에서만 대부분의, 아마도 모든 알고리즘이 가장 적은 사이클로 실행될 것이라고 생각하기 때문에 모든 스레드를 합산하지 마십시오. 추가 스레드는 CPU 사이클이 아닌 완료 시간을 줄이는 것입니다. –