【发布时间】:2017-09-04 15:08:11
【问题描述】:
我正在用 Java 实现一些排序算法,并希望能够对每个算法进行计时和比较。目前,我有一个脚本分别对每个算法进行计时,代码冗余量很大:
long min = 1000000;
long startTime;
long endTime;
QuickSort quicksorter = new QuickSort();
for (int i = 0; i != 10000; ++i) {
startTime = System.nanoTime();
quicksorter.sort();
endTime = System.nanoTime();
if ((endTime - startTime) < min)
min = endTime - startTime;
}
System.out.printf("Quicksort min time is %d ns.\n", min);
BinaryInsertionSort binarysorter = new BinaryInsertionSort();
min = 1000000;
for (int i = 0; i != 10000; ++i) {
startTime = System.nanoTime();
binarysorter.sort();
endTime = System.nanoTime();
if ((endTime - startTime) < min)
min = endTime - startTime;
}
System.out.printf("Binary insertion sort min time is %d ns.\n", min);
使用六七种不同的排序算法,这开始让人感觉效率极低。显而易见的“python-esque”解决方案是定义一个方法,它将方法作为参数并像这样对它们进行计时:
long timeit(function func) {
min = 1000000;
for (int i = 0; i != 10000; ++i) {
startTime = System.nanoTime();
func();
endTime = System.nanoTime();
if ((endTime - startTime) < min)
min = endTime - startTime;
}
System.out.printf("Min execution time is %d ns.\n", min);
}
但是,我认为在 Java 中将方法作为参数传递是不可取的(并且不方便),而且通常这样做可能是不可能的。我想每个排序器类都可以继承自一个实现基准测试方法的抽象类,但是在 Java 中是否有更好的方法来实现这一点?
【问题讨论】:
标签: java algorithm parameter-passing benchmarking timing