我是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和它的选项的例子。
答案 0 :(得分:2)
您可以将LabelStyle labelStyle = new LabelStyle();
labelStyle.font = yourBitmapFont;
Label label = new Label("Hello world!", labelStyle);
dialog.text(label);
// You can also use: dialog.text("Hello world!", labelStyle)
个对象视为您运行它所需的基准测试的一部分,而不应将其创建时间视为您测量时间的一部分。
我们假设您要衡量计算所需的时间:
@State
不幸的是,JIT编译器太聪明了,不允许你这样做,并且会将方法折叠起来只返回@Benchmark
int benchmark() {
int foo = 1, bar = 1;
return foo + bar;
}
。这当然不是你想要衡量的。使用state,您可以转义这些值,让JMH负责不让JIT折叠其值。您可以使用2
方法初始化值。
作为另一个用例,您可以检查您的基准测试是否符合预期。这可以通过@Setup
方法验证状态来实现。
答案 1 :(得分:0)
使用状态类的两个主要好处是:
本文详细介绍了State类和状态对象: https://www.oracle.com/technical-resources/articles/java/architect-benchmarking.html
答案 2 :(得分:0)
第一个问题,状态类的确切作用是什么?保持参数?假设我想对一个以两种不同方式加密密钥的程序进行基准测试。我应该将密钥(一个 String 对象)保存在一个用特定状态注释的状态类中吗?或者只是将 String 对象保留在基准类上?对此的解释会很棒。
基准类也是一个状态类。见JMHSample_04_DefaultState.java。
<块引用>第二个问题,为什么在上面的例子中非共享状态类的性能比共享状态好很多?多线程状态如何改变它?
这是“现代”处理器的问题,而不是 JMH。处理器上的每个内核都有自己的 L1(也可能是 L2)缓存。他们通常不直接访问 RAM。如果多个线程不断向同一内存区域写入数据,则处理器会不断忙于同步所有内核之间的数据。您实际上不必访问相同的变量即可获得此效果。见JMHSample_22_FalseSharing.java。