我需要为 bubbleSort 函数计时,如果达到某个时间限制,该函数就会停止。我如何在 java 中做到这一点?
I need to time a bubbleSort function, which stops if a certain time limit is reached. How do i do that in java?
public static long[] bubbleSort(String[] array, long limit) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j].compareTo(array[j + 1]) > 0) {
String temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
if ( System.currentTimeMillis() - startTime > limit * 10) {
return new long[] {0L, System.currentTimeMillis() - startTime};
}
}
}
return new long[] {1L, System.currentTimeMillis() - startTime};
}
这是我写的代码。这不好。
这个功能太花时间了。但是如果我删除 if 块
if ( System.currentTimeMillis() - startTime > limit * 10) {
return new long[] {0L, System.currentTimeMillis() - startTime};
}
速度快多了!
例如:对于 if 块,时间是 = Sorting time: 0 min. 0 sec. 81 ms.
没有 if 块 = Sorting time: 0 min. 0 sec. 15 ms.
如果限制为 = 4 毫秒,则函数将始终 return 而没有 运行 其完整过程。
为什么会这样?我还能做什么?
P.S.: return数组的第一个值用于检查排序是否完成。
首先,为了优化性能我们可以尝试的是移动比较,
if ( System.currentTimeMillis() - startTime > limit * 10) {
return new long[] {0L, System.currentTimeMillis() - startTime};
}
从嵌套循环到外循环。如果数组的大小足够大,这会提供很多改进。
更好的方法是使用计时器 class 或多线程,如以下帖子中所述:
Setting Timeout in Java
How to set a Timer in Java
public static long[] bubbleSort(String[] array, long limit) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j].compareTo(array[j + 1]) > 0) {
String temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
if ( System.currentTimeMillis() - startTime > limit * 10) {
return new long[] {0L, System.currentTimeMillis() - startTime};
}
}
}
return new long[] {1L, System.currentTimeMillis() - startTime};
}
这是我写的代码。这不好。 这个功能太花时间了。但是如果我删除 if 块
if ( System.currentTimeMillis() - startTime > limit * 10) {
return new long[] {0L, System.currentTimeMillis() - startTime};
}
速度快多了!
例如:对于 if 块,时间是 = Sorting time: 0 min. 0 sec. 81 ms.
没有 if 块 = Sorting time: 0 min. 0 sec. 15 ms.
如果限制为 = 4 毫秒,则函数将始终 return 而没有 运行 其完整过程。
为什么会这样?我还能做什么?
P.S.: return数组的第一个值用于检查排序是否完成。
首先,为了优化性能我们可以尝试的是移动比较,
if ( System.currentTimeMillis() - startTime > limit * 10) {
return new long[] {0L, System.currentTimeMillis() - startTime};
}
从嵌套循环到外循环。如果数组的大小足够大,这会提供很多改进。
更好的方法是使用计时器 class 或多线程,如以下帖子中所述:
Setting Timeout in Java
How to set a Timer in Java