我正在用JMH测试一堆void方法。我知道使用黑洞来防止死代码消除的重要性。但是void方法呢?我不能用黑洞来消耗它们,它们会经过适当的测试吗?
如果您的方法接受任何参数,您可以尝试以下操作:
@Benchmark
public Object test() {
yourVoidMethod(param);
return param;
}
编译器可能认为param
在测试的方法中进行了某种程度的修改,不会丢弃代码。
同样对于一些无效的方法,你可以做smth,比如:
@Benchmark
public int test() {
yourVoidMethod();
return hashCode();
}
对我来说,它适用于这样的案例
@Benchmark
public int sleep() {
while (run) {
LockSupport.parkNanos(TimeUnit.MICROSECONDS.toNanos(pause));
}
return hashCode();
}
但这是一个非常特殊的情况。
最好的方法是重新设计代码,从中返回一些东西
UPD:您还可以尝试从封装代码的类进行扩展,以便在代码中以某种方式使用Blackhole
,例如通过重写或重载方法。看见https://github.com/openjdk/jmh/blob/master/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_28_BlackholeHelpers.java