JMH State类和共享vs非共享状态

时间:2017-03-08 06:55:18

标签: java jmh

我是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和它的选项的例子。

3 个答案:

答案 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