【发布时间】:2020-03-04 21:21:33
【问题描述】:
我正在运行一个简单的排序 1000 次,并试图根据用户定义的数组长度获得完成(然后与另一个排序比较)所需的平均时间。我的问题是,当我尝试获取时间时,它始终为 0。我有一段时间没有编码,也没有看到我的错误。
import java.util.Scanner;
public class TimingExpBubble2 {
public static long average(long[] arr){
int sum = 0;
for (int i = 0; i < arr.length; i++)
sum += arr[i];
return sum / arr.length;
}
public static void main(String args[]) {
Scanner reader = new Scanner(System.in);
System.out.println("Enter array length: ");
int x = reader.nextInt();
long[] time = new long[1000];
for(int i = 0; i < 1000; i++)
{
int[] arr = new int[x];
for(int j = 0; j < arr.length; j++) {
arr[j] = (int) (Math.random() * 5000);
}
long start = System.currentTimeMillis();
for (int l = 0; l < arr.length - 1; l++) {
for (int j = 1; j < arr.length - i; j++) {
if (arr[j - 1] > arr[j]) {
int temp = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = temp;
}
}
}
reader.close();
long end = System.currentTimeMillis();
time[i] = (end - start);
}
System.out.println("Average time in Miliseconds: " + average(time));
}
}
'''
【问题讨论】:
-
使用 System.nanoTime()
-
在大多数情况下(我的测试),排序为
0毫秒,超过 10 个元素的数组。这往往会在 1000 次迭代中产生一个非常小的值(1-3 毫秒),因此结果平均为0.003毫秒(例如) - 而不是使用long作为结果,您将需要使用double- 这将要求您将可整除的值之一更改为double -
我可能很想使用
java.timeAPI,它支持Duration- 但这样做可能会带来额外的开销:/ -
将其更改为双精度或使用 nano 都可以。感谢您的输入