我正在为我的应用程序设置JMH基准,我想知道通过基准传递JMH状态与从基准主体访问它之间有什么区别吗?
换句话说
@Benchmark
public int myBenchmark(MyState state) {
MyObject objFromState= state.objFromState;
return objFromState.benchmarkMe();
}
VS
@Benchmark
public int myBenchmark() {
return objFromState.benchmarkMe();
}
...由于JMH被大量用于建立并发基准测试,我们选择了明确的带有状态对象的概念 ...基准方法可以引用状态,并且JMH将inject适当的状态,同时调用这些方法。
我看到的所有示例总是以与示例相同的方式引用状态:
@State(Scope.Thread)
public static class ThreadState {
volatile double x = Math.PI;
}
@Benchmark
public void measureUnshared(ThreadState state) {
state.x++;
}
您必须指定状态范围,使用批注明确声明它-您可以通过执行此操作来“注册”它。状态对象将进一步注入到引用它的方法中(通过将依赖项声明为方法参数)。在第二个代码段中,您引用state
对象-是的,但这不是共享状态。