我是jmh的新手并且了解线程背后发生的事情等等.
所以,我开始阅读并陷入@State注释并共享vs非共享状态.
我读了这个例子:http://hg.openjdk.java.net/code-tools/jmh/file/ecd9e76155fe/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_03_States.java 并且有关于它的几个问题.
第一个问题,国家阶级的确切作用是什么?保持参数?假设我想对以两种不同方式加密密钥的程序进行基准测试.我应该将键(String对象)保存在以特定状态注释的状态类中吗?或者只是将String对象保留在基准类上?对此的解释会很棒.
第二个问题,为什么在上面的例子中,非共享状态类性能比共享状态好得多?多线程状态如何改变它?
我觉得自己真的很模糊,因为我刚接触到这个东西,并且找不到"像我这样解释我的5个"jmh的例子,这是它的选择.
你可以考虑@State对象视为运行它所需的基准的一部分,而不应将其创建时间视为测量时间的一部分。
假设您想要测量计算所需的时间:
@Benchmark
int benchmark() {
int foo = 1, bar = 1;
return foo + bar;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,JIT 编译器太聪明了,无法让您执行此操作,并且会折叠该方法以简单地返回2。这当然不是你想要衡量的。使用状态,您可以转义这些值并让 JMH 负责不让 JIT 折叠其值。您可以初始化 a 中的值@Setup。
作为另一个用例,您可以检查基准测试是否符合您的预期。这可以通过验证@TearDown方法中的状态来实现。
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |