如何对抛出异常的方法进行基准测试?

How to benchmark methods that throw exceptions?

如何使用 jmh 对抛出异常的方法进行基准测试?

我在 jmh 1.19 下尝试了以下操作:

@Benchmark
public void throwException() throws IllegalArgumentException
{
  throw new IllegalArgumentException("Hard-coded exception");
}

但出现此错误:

# Run progress: 0.00% complete, ETA 00:02:00
# Fork: 1 of 3
# Warmup Iteration   1: <failure>

java.lang.IllegalArgumentException: Hard-coded exception
[...]

我应该像下面这样黑洞异常吗?

@Benchmark
public void throwException(Blackhole bh)
{
    try
    {
        throw new IllegalArgumentException("Hard-coded exception");
    }
    catch (IllegalArgumentException e)
    {
        bh.consume(e);
    }
}

或者是否有另一种方法告诉 jmh 接受抛出的异常?

总结我从 Kiril S. and Oleg Estekhin 收到的答案:

如果基准测试方法抛出异常,JMH 将始终失败。要更正此问题,基准测试方法必须捕获异常。然后它可以使用 Blackhole 对象或基准方法中的 return 对象来使用异常。这将阻止编译器优化 throw 语句。