gpt4 book ai didi

java - 将方法传递给 Java 中的基准测试程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:42:13 24 4
gpt4 key购买 nike

我正在用 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 中是否有更好的方法来实现这一点?

最佳答案

However, I gather that it is inadvisable (and inconvenient) to pass methods as parameters in Java, and doing so generically might be impossible

嗯?

从 Java 8 开始,您可以将此类泛型方法作为参数传递;你想要的是 Runnable .

如果你在同一个类中有两个方法:

public final class Foo
{
void f1() { /* whatever */ }
void f2() { /* whatever */ }
}

然后您可以使用方法引用在代码中计时,如:

final Runnable r1 = Foo::f1;
final Runnable r2 = Foo::f2;

然后将这些方法引用(它们是有效的 lambda)用于一些计时代码:

long start, end;

Stream.of(r1, r2).forEach(r -> {
start = System.nanoTime();
r.run();
end = System.nanoTime();
System.out.println("Time spent in ns: " + (end - start));
});

之后,您可以进一步优化您的代码以便使用,例如,IntConsumers .


诚然,出于基准测试的目的,一次运行无法完成。有 JIT 需要考虑,JIT 只会在相同代码路径执行一定数量后启动,对于“一定数量”的某些定义。因此,虽然上面的代码会给你一个指示(这个指示的值(value)),你不应该在任何情况下把它当作绝对的。

出于基准测试目的,请考虑使用 jmh ... 并仔细阅读所有文档! JVM 同时是运行代码的高效而复杂的设备...

关于java - 将方法传递给 Java 中的基准测试程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46039853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com