我创建了一个包含两个整数数组的示例类;一个排序和其他未排序。我正在打印数组的内容。打印排序数组所花费的时间是打印未排序数组所需时间的两倍。
参考代码:
public class Demo {
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5,6,7,8,9,10};
int[] array2 = {10,3,4,2,6,7,8,1,5,9};
long start = System.nanoTime();
for(int a:array1){
System.out.println(a);
}
System.out.println("Time required by sorted array\t"+(System.nanoTime() - start) / 1000000000.0);
start = System.nanoTime();
for(int a:array2){
System.out.println(a);
}
System.out.println("Time required by unsorted array\t"+(System.nanoTime() - start) / 1000000000.0);
}
}
输出:
1
2
3
4
5
6
7
8
9
10
Time required by sorted array 3.89505E-4
10
3
4
2
6
7
8
1
5
9
Time required by unsorted array 1.37727E-4
为什么显示数字时会有时间差异。另外我读了一个更快排序数组过程的地方,这里情况有所不同。
答案 0 :(得分:4)
根本不是你如何对代码进行基准测试。多运行一次你的代码,你会发现每次都会得到一个非常不同的结果。例如,以下是我的机器上几次运行的结果:
Time required by sorted array 4.53115E-4
Time required by unsorted array 2.0451E-4
Time required by sorted array 3.2349E-4
Time required by unsorted array 2.10212E-4
Time required by sorted array 3.48198E-4
Time required by unsorted array 1.90065E-4
如果我颠倒了打印循环的顺序,请执行以下操作:
long start = System.nanoTime();
for(int a:array2){
System.out.println(a);
}
System.out.println("Time required by unsorted array\t"+(System.nanoTime() - start) / 1000000000.0);
start = System.nanoTime();
for(int a:array1){
System.out.println(a);
}
System.out.println("Time required by sorted array\t"+(System.nanoTime() - start) / 1000000000.0);
结果也发生了变化:
Time required by unsorted array 3.04103E-4
Time required by sorted array 2.23136E-4
Time required by unsorted array 3.55041E-4
Time required by sorted array 1.99188E-4
Time required by unsorted array 3.63783E-4
Time required by sorted array 2.0489E-4
因此,时间差与数组是否已排序无关,而更多地与首先对哪个数组进行排序有关。
正确的代码基准测试,特别是在Java中是很棘手的。整个tools(以及更多tools)和methodologies致力于做到这一点。