我正在编写一个程序来比较不同的排序算法速度。大多数情况下,我可以用
开始每个算法方法long startTime = System.currentTimeMillis();
并以
结束long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime + " milliseconds");
但是,因为快速排序是递归的,所以这不会起作用,因为它会为每次递归打印一个时间,而不是总的经过时间。
我的代码
public static void quickSort(int[] arr, int low, int high) {
if (arr == null || arr.length == 0)
return;
if (low >= high)
return;
// pick the pivot
int middle = low + (high - low) / 2;
int pivot = arr[middle];
// make left < pivot and right > pivot
int i = low, j = high;
while (i <= j) {
while (arr[i] < pivot) {
i++;
}
while (arr[j] > pivot) {
j--;
}
if (i <= j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
// recursively sort two sub parts
if (low < j)
quickSort(arr, low, j);
if (high > i)
quickSort(arr, i, high);
if ((low >= j) && (high <= i)) {
}
}
我怎样才能使它只运行&#34; stopTime&#34; algorthim的最后一次迭代。感谢
答案 0 :(得分:-1)
不要测量递归方法中的性能。可以在某些private
辅助方法中移动方法的核心代码,也可以在调用它的方法中进行衡量,例如在main
方法中。
辅助方法变体:
public static void quickSort(int[] arr, int low, int high) {
long startTime = System.currentTimeMillis();
// Call the helper
quickSortHelper(arr, low, high);
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime + " milliseconds");
}
private static void quickSortHelper(int[] arr, int low, int high) {
// All code goes here, adjust calls
// to 'quickSort', they should now call 'quickSortHelper'
}
请注意,您的技术只是获得粗略估算的快捷方式。如果像这样做,有很多效果会弄乱你的微基准测试。例如JVM噪音(启动时),特别是缓存效果(对具有相同或类似输入的方法的重复调用将非常快,因为它们已经被缓存)。
您可以阅读此问题以获取更多详细信息:How do I write a correct micro-benchmark in Java?