我想使用系统命令测试我的排序方法的性能,例如nanoTime
。
我目前面临的问题是我有4种不同的排序方法,我只接受单个数组输入。使用该单个数组测试所有排序方法的最佳方法是什么。
正在制作没有参考点的副本吗?
答案 0 :(得分:1)
您可以(a)制作副本以在一次运行期间检查所有方法,或者您可以(b)多次运行您的代码并选择此输入的方法。第一种方法似乎更简单:
public static void main(String[] args) {
final int methods = 4;
final int[] input = new int[0]; // or whatever you want.
final long[] measures = new long[methods];
for (int c = 0; c < methods; c++) {
int[] copy = new int[input.length];
System.arraycopy(input, 0, copy, 0, input.length);
long start = System.nanoTime();
switch (c) {
case 0:
// call method #0
break;
//...
case 3:
// call method #3
break;
}
measures[c] = System.nanoTime() - start;
}
System.out.println("Measures: " + Arrays.toString(measures));
}
答案 1 :(得分:0)
一种解决方案可能是在每个方法中创建一个临时数组并对其进行排序,以使原始方法保持不变。
这是我如何拍照的。这假设你想要返回已排序的数组,但如果你想做的只是排序时间,你可能不必这样做。
public String[] sort1(String[] arr){
String[] temp = Arrays.copyOf(arr, arr.Length);
// start counter
// sort temp
// end counter
return temp;
}
然后在main方法的某个地方,您可以使用原始数组调用每个排序方法,并且它永远不会被更改。
我(不可否认)不是效率专家,并且可能有一种比创建每个数组的副本更有效的方法,但如果这只是一个小应用程序来测试您的排序速度,那么这应该做你所做的一切需要它。
修改强>
这是我想到的一个控制流程,我认为这有助于为您保持最有条理的事情。
// Create array
public String[] myArray = {"Blah", "Blah", "Blah"};
// Have one sortArray() method that will take the array to be sorted, as well as the type of sort to be used.
public void sortArray(String[] arr, int arrayType){
String[] temp = Arrays.copyOf(arr, arr.Length);
// Switch based on sort type
switch(arrayType){
case 1:
sort1(temp);
break;
case 2:
sort2(temp);
break;
default:
// Maybe raise exception about no available sort. Or just break.
break;
}
}
// Your main method can loop through each:
public static void Main(String[] args){
int numSorts = 4; // Or whatever
for(int i = 1; i <= numSorts; i++){
sortArray(myArray, i);
}
}
我确定会调整很多语法以匹配您现有的代码,但我会创建一个复制输入数组的排序方法,然后调用必要的排序方法。然后,在main中,您可以遍历每个排序方法。在每个特定的排序方法(sort1(), sort2()
)里面,我会在那里开始你的计时器。无论您喜欢什么,都可以打印到控制台或日志中。
请告诉我这是否有效。