系列文章目录

jmh学习笔记-源代码编译与bench mode
jmh学习笔记-State共享对象
jmh学习笔记-State共享对象前后置方法
jmh学习笔记-代码清除
jmh学习笔记-常量折叠
jmh学习笔记-Forking分叉
jmh学习笔记-环境配置
jmh学习笔记-缓存行的处理方式
jmh学习笔记-自定义项目引入jmh


文章目录

  • 系列文章目录
  • 前言
  • 一、State标签
    • 1、基准测试内线程内共享
    • 2、基础测试内线程间共享
    • 3、基础测试间变量共享
  • 二、Group再分析-组与执行组
  • 总结

前言

上一章节完成了jmh项目的编译并运行了其中的测试案例,针对jmh的运行方式以及测试模式(mode)、测试结果单位进行了介绍。通常,我们在测试当中可能会涉及到一些共享对象的操作,本章主要针对jmh的State注解进行讲解。


提示:以下是本篇文章正文内容,下面案例可供参考

一、State标签

org.openjdk.jmh.annotations.State这个标签用于指定一个属性共享的范围,

1、基准测试内线程内共享

比如在jmh类中定义如下这个属性(静态内部类)

@State(Scope.Thread)
public static class ThreadState {volatile double x = Math.PI;
}

然后再对应的Benchmark方法当中使用

@Benchmark
public void measureUnshared(ThreadState state) throws InterruptedException {// All benchmark threads will call in this method.//// However, since ThreadState is the Scope.Thread, each thread// will have it's own copy of the state, and this benchmark// will measure unshared case.state.x++;Thread.sleep(5000);System.out.println("thread name = " + Thread.currentThread().getName() + "  ,state= " + state.hashCode() + "  ,x " +"= " + state.x);
}

基准方法可以引用状态,并且JMH将在调用这些方法时注入适当的状态。 您可以完全没有状态,也可以只有一个状态,或者可以引用多个状态。 这使得构建多线程基准测试变得轻而易举。 在上面的基准方法当中就包含了一个状态,在这个方法运行时,jmh会自动注入这个对象。
随后我们开启4个线程来测试,对应的主类方法如下

public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(JMHSample_03_States.class.getSimpleName()).threads(4) // 四个线程测试.forks(1).build();new Runner(opt).run();
}

测试环境如下

# JMH version: 1.26
# VM version: JDK 1.8.0_121, Java HotSpot(TM) 64-Bit Server VM, 25.121-b13
# VM invoker: C:\Program Files\Java\jdk1.8.0_121\jre\bin\java.exe
# VM options: -javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=51076:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 4 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: org.openjdk.jmh.samples.JMHSample_03_States.measureUnshared

预热五个循环,10秒一个循环,测试五个循环,10秒一个循环。4个线程,同步执行。以下为第一轮预热的结果。

从这个结果可以看出,jmh使用了四个线程,这个四个线程使用的state对象都是不同的(从hashCode不同可以看),每个都有自己的独一份。也就是说通过@State(Scope.Thread)将这个对象限定为线程内部共享了。在上面同一个线程中,下一轮测试会使用上面的值,比如以下为预热完成之后,真正开始测试的第一轮结果。

从这个结果可以看出,Measurement阶段与Warmup阶段使用的线程相同,线程内的对象也是同一个对象,对象内的变量被共享(x的值持续增加)。

2、基础测试内线程间共享

如果想一个变量在同一个基础测试内被所有线程共享呢?定义对象如下

@State(Scope.Benchmark)
public static class BenchmarkState {volatile double x = Math.PI;
}

对应基础方法如下

@Benchmark
public void measureShared(BenchmarkState state) throws InterruptedException {// All benchmark threads will call in this method.//// Since BenchmarkState is the Scope.Benchmark, all threads// will share the state instance, and we will end up measuring// shared case.state.x++;Thread.sleep(5000);System.out.println("thread name = " + Thread.currentThread().getName() + "  ,state= " + state.hashCode() + "  ,x " +"= " + state.x);
}

测试的环境参数如下

# JMH version: 1.26
# VM version: JDK 1.8.0_121, Java HotSpot(TM) 64-Bit Server VM, 25.121-b13
# VM invoker: C:\Program Files\Java\jdk1.8.0_121\jre\bin\java.exe
# VM options: -javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=52024:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 4 threads, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: org.openjdk.jmh.samples.JMHSample_03_States.measureShared

与上面线程内共享的环境参数是一致的。
第一轮预热

从这里可以看出两个结论:第一个就是不同的线程之间确实是共享了同一个对象,但是共享对象中的变量值看起来好像不对(总量是对的,但是单次取的值不对)。Measurement阶段的情况是一致的。

通过@State(Scope.Benchmark)可以将一个对象标注为基准测试类共享(也就是基准测试的线程间共享),而@State(Scope.Thread)为线程内共享。

3、基础测试间变量共享

如果想在多个基准测试方法间共享变量该怎么办呢?此时需要使用Scope的另一个值了,此处我们先引入日志框架来打印日志,另外由于在多线程间共享变量,所以改为线程安全类型。

@State(Scope.Group)       // 基准测试分组
public class JMHSample_04_DefaultState {private static final Logger logger = LoggerFactory.getLogger(JMHSample_04_DefaultState.class);@Group@Benchmarkpublic void measure1(BenchmarkState state) throws InterruptedException {Thread.sleep(5000);int i = state.x.incrementAndGet();logger.info("measure1 , state = " + state.hashCode() + ", i = " + i);}@Group@Benchmarkpublic void measure2(BenchmarkState state) throws InterruptedException {Thread.sleep(5000);int i = state.x.incrementAndGet();logger.info("measure2 , state = " + state.hashCode() + ", i = " + i);}@State(Scope.Benchmark)public static class BenchmarkState {AtomicInteger x = new AtomicInteger(0);}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(JMHSample_04_DefaultState.class.getSimpleName()).threads(4).forks(1).build();new Runner(opt).run();}}

在上面通过@State(Scope.Benchmark)保证BenchmarkState是基准测试共享的,然后再通过类上面@State(Scope.Group)和在基准方法上添加@Group注解将基准方法measure1和measure2作为一个组进行测试。同时在BenchmarkState对象当中采用原子变量保证线程安全。 此时的测试环境结果如下

# JMH version: 1.26
# VM version: JDK 1.8.0_121, Java HotSpot(TM) 64-Bit Server VM, 25.121-b13
# VM invoker: C:\Program Files\Java\jdk1.8.0_121\jre\bin\java.exe
# VM options: -javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=54114:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 4 threads (2 groups; 1x "measure1", 1x "measure2" in each group), will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: org.openjdk.jmh.samples.JMHSample_04_DefaultState.group

这里Benchmark的名称变成了group结尾,而Threads变成了2 groups(measure1+measure2)。预热结果一阶段结果如下

在这里,两个基准方法最为一个组是一起测试的,而且对象是共享的,通过原子变量保证了线程的安全性。测试结果最后阶段结果如下

另外在这里,一共是四个线程,其中worker-1和worker-4分配给了基准方法measure1,而worker-2和worker-3分配给了基准方法measure2.

如果将上面的BenchmarkState修改为线程内共享呢?

@State(Scope.Thread)
public static class BenchmarkState {AtomicInteger x = new AtomicInteger(0);
}

虽然此时两个基准方法仍然作为一个组测试,但是总共四个线程,每个线程内部是会共享对象的,而线程之间不会共享。如下所示

注意:如果在这里将@State(Scope.Group)放在BenchmarkState类(共享对象)上面,而不是基准方法类上面,结果会是两个线程组,共享两个对象。

二、Group再分析-组与执行组

在上面的案例当中,我们通过@Group注解可以将过个基准测试作为一个组,然后通过Scope.Benchmark或者Scope.Thread来控制在这个Group之内实例共享的方式,那为什么只使用Scope.Group无法完成一个实例在这个Group内共享呢?这是因为这里涉及到Group与执行Group的概念。一个Group指的是通过@Group注解标注为一个组的基准测试,那么什么是执行Group呢?比如在上面的测试当中,group当中包含了两个基准测试,但是有4个线程,在测试的环境结果中显示如下

# Threads: 4 threads (2 groups; 1x "measure1", 1x "measure2" in each group), will synchronize iterations

在这里出现了2 groups; 1x "measure1", 1x "measure2" in each group,为什么会出现2groups呢?其实这里是2个执行组的概念,本来一个组里面只有两个基准测试,默认情况下是两个线程组成一个执行组来执行这个组的基准方法,这样在组内可以共享对象实例了,但是如果使用了四个线程,就分为2个执行组了,执行组与执行组是无法共享对象实例了。

对于Scope.Group而言,执行组与执行组之间可以共享对象实例,而不是组之间共享对象实例。

如果4个线程作为一个执行组呢?可以通过@GroupThreads注解来指定某个基准方法在一个执行组中的线程数。比如

@Benchmark
@Group("g")
@GroupThreads(3)
public int inc() throws InterruptedException {Thread.sleep(5000);int i = counter.incrementAndGet();logger.info("inc hashcode = {}, i = {}", counter.hashCode(), i);return i;
}@Benchmark
@Group("g")
@GroupThreads(1)
public int get() throws InterruptedException {Thread.sleep(5000);int i = counter.get();logger.info("get hashcode = {}, i = {}", counter.hashCode(), i);return i;
}

这个g组当中包含了两个基准方法,第一个通过GroupThreads执行了执行组线程数为3,第二个为1,所以此时一个g组的执行组的线程数为4。结果如下

# Threads: 4 threads (1 group; 1x "get", 3x "inc" in each group), will synchronize iterations

此时4个线程跑jmh测试的话,变量就可以在组内共享了,因为只存在一个执行组。完整代码如下

package org.openjdk.jmh.samples;import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;@State(Scope.Group)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class JMHSample_15_Asymmetric {private static final Logger logger = LoggerFactory.getLogger(JMHSample_15_Asymmetric.class);private AtomicInteger counter;@Setuppublic void up() {counter = new AtomicInteger();}@Benchmark@Group("g")@GroupThreads(3)public int inc() throws InterruptedException {Thread.sleep(5000);int i = counter.incrementAndGet();logger.info("inc hashcode = {}, i = {}", counter.hashCode(), i);return i;}@Benchmark@Group("g")@GroupThreads(1)public int get() throws InterruptedException {Thread.sleep(5000);int i = counter.get();logger.info("get hashcode = {}, i = {}", counter.hashCode(), i);return i;}/*** You will have the distinct metrics for inc() and get() from this run.*/public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(JMHSample_15_Asymmetric.class.getSimpleName()).forks(1).threads(4).build();new Runner(opt).run();} }

So far all the tests were symmetric: the same code was executed in all the threads. At times, you need the asymmetric test. JMH provides this with the notion of @Group, which can bind several methods together, and all the threads are distributed among the test methods.

Each execution group contains of one or more threads. Each thread within a particular execution group executes one of @Group-annotated @Benchmark methods. Multiple execution groups may participate in the run. The total thread count in the run is rounded to the execution group size, which will only allow the full execution groups.

Note that two state scopes: Scope.Benchmark and Scope.Thread are not covering all the use cases here – you either share everything in the state, or share nothing. To break this, we have the middle ground Scope.Group, which marks the state to be shared within the execution group, but not among the execution groups.

Putting this all together, the example below means: a) define the execution group “g”, with 3 threads executing inc(), and 1 thread executing get(), 4 threads per group in total; b) if we run this test case with 4 threads, then we will have a single execution group. Generally, running with 4*N threads will create N execution groups, etc.; c) each execution group has one @State instance to share: that is, execution groups share the counter within the group, but not across the groups.

执行结果如下

# JMH version: 1.26
# VM version: JDK 1.8.0_121, Java HotSpot(TM) 64-Bit Server VM, 25.121-b13
# VM invoker: C:\Program Files\Java\jdk1.8.0_121\jre\bin\java.exe
# VM options: -javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar=59186:D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 4 threads (1 group; 1x "get", 3x "inc" in each group), will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g# Run progress: 0.00% complete, ETA 00:01:40
# Fork: 1 of 1
# Warmup Iteration   1: 14:39:36.590 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 3
14:39:36.590 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 1
14:39:36.590 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 1
14:39:36.590 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 2
14:39:41.598 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 4
14:39:41.599 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 5
14:39:41.599 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 5
14:39:41.599 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 6
14:39:46.598 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 7
14:39:46.599 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 8
14:39:46.599 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 8
5002590311.500 ±(99.9%) 13642089.830 ns/op
# Warmup Iteration   2: 14:39:51.613 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 9
14:39:51.614 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 11
14:39:51.614 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 11
14:39:51.614 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 10
14:39:56.614 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 12
14:39:56.615 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 12
14:39:56.616 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 13
14:39:56.616 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 14
14:40:01.614 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 15
14:40:01.615 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 15
14:40:01.616 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 16
14:40:01.616 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 17
5000186081.750 ±(99.9%) 2852252.712 ns/op
# Warmup Iteration   3: 14:40:06.619 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 17
14:40:06.619 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 18
14:40:06.619 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 19
14:40:06.619 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 20
14:40:11.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 21
14:40:11.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 20
14:40:11.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 22
14:40:11.624 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 23
14:40:16.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 24
14:40:16.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 23
14:40:16.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 25
14:40:16.624 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 26
14:40:21.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 27
14:40:21.620 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 27
5000121210.042 ±(99.9%) 832740.617 ns/op
# Warmup Iteration   4: 14:40:26.631 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 28
14:40:26.631 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 27
14:40:26.644 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 29
14:40:26.644 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 30
14:40:31.632 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 31
14:40:31.632 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 30
14:40:31.645 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 33
14:40:31.645 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 32
14:40:36.632 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 34
14:40:36.632 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 33
14:40:36.645 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 35
14:40:36.646 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 36
14:40:41.632 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 37
14:40:41.632 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 37
14:40:41.645 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 38
5000199562.250 ±(99.9%) 864278.350 ns/op
# Warmup Iteration   5: 14:40:46.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 38
14:40:46.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 39
14:40:46.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 40
14:40:46.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 41
14:40:51.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 42
14:40:51.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 42
14:40:51.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 43
14:40:51.648 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 44
14:40:56.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 45
14:40:56.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 45
14:40:56.648 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 46
14:40:56.648 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 47
14:41:01.647 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 47
14:41:01.648 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 48
14:41:01.648 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 49
5000488855.833 ±(99.9%) 2319372.098 ns/op
Iteration   1: 14:41:06.654 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 50
14:41:06.654 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 51
14:41:06.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 51
14:41:06.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 52
14:41:11.654 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 53
14:41:11.654 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 54
14:41:11.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 54
14:41:11.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 55
14:41:16.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 56
14:41:16.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 57
14:41:16.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 58
14:41:16.655 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 58
14:41:21.656 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 59
14:41:21.657 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 60
5000720193.875 ±(99.9%) 2378963.830 ns/opget: 5000502466.000 ns/opinc: 5000792769.833 ±(99.9%) 7559486.720 ns/opIteration   2: 14:41:26.661 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 62
14:41:26.661 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 63
14:41:26.661 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 61
14:41:26.661 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 63
14:41:31.661 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 65
14:41:31.661 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 64
14:41:31.661 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 66
14:41:31.662 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 66
14:41:36.672 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 67
14:41:36.672 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 67
14:41:36.673 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 68
14:41:36.673 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 69
14:41:41.673 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 70
14:41:41.674 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 70
14:41:41.674 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 71
5004665661.500 ±(99.9%) 18209067.069 ns/opget: 5000470783.000 ns/opinc: 5006063954.333 ±(99.9%) 7724610.432 ns/opIteration   3: 14:41:46.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 73
14:41:46.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 72
14:41:46.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 72
14:41:46.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 74
14:41:51.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 74
14:41:51.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 75
14:41:51.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 76
14:41:51.680 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 77
14:41:56.681 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 77
14:41:56.681 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 78
14:41:56.681 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 79
14:41:56.681 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 80
14:42:01.681 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 81
14:42:01.681 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 82
14:42:01.681 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 81
5000277263.833 ±(99.9%) 903868.383 ns/opget: 5000127773.333 ns/opinc: 5000327094.000 ±(99.9%) 2192975.624 ns/opIteration   4: 14:42:06.686 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 84
14:42:06.686 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 83
14:42:06.686 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 85
14:42:06.686 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 85
14:42:11.686 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 86
14:42:11.688 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 86
14:42:11.688 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 87
14:42:11.688 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 88
14:42:16.687 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 89
14:42:16.690 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 89
14:42:16.691 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 90
14:42:16.692 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 91
5001364657.250 ±(99.9%) 6663398.595 ns/opget: 5000874630.000 ns/opinc: 5001527999.667 ±(99.9%) 21853494.705 ns/opIteration   5: 14:42:21.695 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 92
14:42:21.695 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 92
14:42:21.695 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 93
14:42:21.696 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 94
14:42:26.695 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 95
14:42:26.696 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 97
14:42:26.696 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 96
14:42:26.697 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 97
14:42:31.697 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-4] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 99
14:42:31.697 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-3] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 100
14:42:31.697 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-2] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - inc hashcode = 1337536086, i = 98
14:42:31.698 [org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g-jmh-worker-1] INFO org.openjdk.jmh.samples.JMHSample_15_Asymmetric - get hashcode = 1337536086, i = 100
5000795088.000 ±(99.9%) 2564271.198 ns/opget: 5001366833.000 ns/opinc: 5000604506.333 ±(99.9%) 2466310.425 ns/opResult "org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g":5001564572.892 ±(99.9%) 6839356.190 ns/op [Average](min, avg, max) = (5000277263.833, 5001564572.892, 5004665661.500), stdev = 1776159.083CI (99.9%): [4994725216.702, 5008403929.081] (assumes normal distribution)Secondary result "org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g:get":5000668497.067 ±(99.9%) 1815531.842 ns/op [Average](min, avg, max) = (5000127773.333, 5000668497.067, 5001366833.000), stdev = 471487.854CI (99.9%): [4998852965.225, 5002484028.908] (assumes normal distribution)Secondary result "org.openjdk.jmh.samples.JMHSample_15_Asymmetric.g:inc":5001863264.833 ±(99.9%) 9203048.725 ns/op [Average](min, avg, max) = (5000327094.000, 5001863264.833, 5006063954.333), stdev = 2390002.528CI (99.9%): [4992660216.108, 5011066313.559] (assumes normal distribution)# Run complete. Total time: 00:03:01REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.Benchmark                      Mode  Cnt           Score         Error  Units
JMHSample_15_Asymmetric.g      avgt    5  5001564572.892 ± 6839356.190  ns/op
JMHSample_15_Asymmetric.g:get  avgt    5  5000668497.067 ± 1815531.842  ns/op
JMHSample_15_Asymmetric.g:inc  avgt    5  5001863264.833 ± 9203048.725  ns/op

如果修改测试使用的线程数为8,那么此时就是两个执行组了,只有执行组内共享对象实例。


总结

大多数时候,您需要在基准测试运行时保持一些状态。 由于JMH被大量用于构建并发基准测试,因此我们选择了明确的带有状态对象的概念。 在上面案例当中是两个状态对象。 它们的类名不是必需的,重要的是它们标有@State。 这些对象将按需实例化,并在整个基准测试期间重新使用。 重要的属性是状态始终由那些基准线程之一实例化,然后可以访问该状态。 这意味着您可以像在工作线程中那样初始化字段(ThreadLocals是您的等)。通过@State(Scope.Thread)可以保证对象实例在线程内共享,而@State(Scope.Benchmark)可以保证对象实例在基准方法内线程间共享。而通过@State(Scope.Group)使用组作用域,但要注意对象实例不是在组内的所有线程间共享,而是执行组内共享。

package org.openjdk.jmh.annotations;/*** {@link State} scope.*/
public enum Scope {/*** <p>Benchmark state scope.</p>** <p>With benchmark scope, all instances of the same type will be shared across all* worker threads.</p>** <p>{@link Setup} and {@link TearDown} methods on this state object would be performed* by one of the worker threads, and only once per {@link Level}.* No other threads would ever touch the state object.</p>*/Benchmark,/*** <p>Group state scope.</p>** <p>With group scope, all instances of the same type will be shared across all* threads within the same group. Each thread group will be supplied with its own* state object.</p>** <p>{@link Setup} and {@link TearDown} methods on this state object would be performed* by one of the group threads, and only once per {@link Level}.* No other threads would ever touch the state object.</p>** @see Group*/Group,/*** <p>Thread state scope.</p>** <p>With thread scope, all instances of the same type are distinct, even if multiple* state objects are injected in the same benchmark</p>** <p>{@link Setup} and {@link TearDown} methods on this state object would be performed* by single worker thread exclusively, and only once per {@link Level}.* No other threads would ever touch the state object.</p>**/Thread,}

jmh学习笔记-State共享对象相关推荐

  1. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  2. python学习笔记4(对象/引用;多范式; 上下文管理器)

    python学习笔记4(对象/引用:多范式; 上下文管理器) ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是 ...

  3. 传智博客学习笔记8--面向对象下

    传智博客学习笔记8--面向对象下 2009-3-12 15:41:42 继承 extends 接口 interface 如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也 ...

  4. 《Java编程思想》学习笔记【一对象导论】

    重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...

  5. 前端JS学习笔记——内置对象Math、Date 、Array、String

    目录 1.Math常用方法 2.Date()方法 如何获取Date的时间戳 Date()方法的使用 格式化日期时间 格式化输出一串时间日期 倒计时功能 3.Array方法 创建数组对象的两种方法 检测 ...

  6. JS学习笔记之内置对象 4.21

    1 内置对象 JavaScript 中的对象分为3种:自定义对象 .内置对象. 浏览器对象 内置对象就是指 JS 语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或最基本而必要的功能(属性 ...

  7. JavaScript学习笔记之原型对象

    本文是学习<JavaScript高级程序设计>第六章的笔记. JS中,便于批量创建对象的三种模式: 1.工厂模式:用一个函数封装创建对象的细节,传入必要的参数,在函数内部new一个对象并返 ...

  8. Java 入门知识学习笔记 (类和对象)

    一.类和对象的定义及关系 1.类是同一类别对象的抽象定义:可以理解为是某一类具体对象的模子,确定对象将会拥有的特性,包括该类对象具备的属性和方法. 2.对象是对类的一种具体化的客观存在,是对类的具体实 ...

  9. JAVA编程思想学习笔记——第一章 对象导论

    搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的 ...

最新文章

  1. mysql 去掉复合索引_MySQL性能优化[实践篇]-复合索引实例
  2. Eclipse中JVM内存设置
  3. 【活动】侬好上海,Microsoft Reactor来啦
  4. 如何看待微软新开源的Service Fabric?
  5. linux shell调用c 程序设计,linux – 在bash -c中设置变量
  6. python三种数据类型_Python-更改Pandas中列的数据类型
  7. 异常详细信息: System.UnauthorizedAccessException: 对路径的访问被拒绝。
  8. VB 中定义FileSystemObject对象,要先添加对象
  9. DataFrame基础操作
  10. Asp.Net MVC4入门指南(7):给电影表和模型添加新字段
  11. procc 编程需要oracle11.lib,AVProVideo Pro 1.7.3版本 1.7.3属于稳定版本 (官网最新版1.9.1)...
  12. 企业微信好不好,OA软件何去何从?
  13. 多维时序 | MATLAB实现CNN-LSTM多变量时序预测
  14. 数字营销(三)如何确定合适的流量渠道?
  15. 随机信号的参数建模法AR模型及matlab实现
  16. 一种基于信令数据的业务推销类骚扰电话识别方法
  17. 基于Python的新闻聚合网站设计与实现
  18. 【git】 Please tell me who you are解决方法
  19. 抓取网页中的Silverlight数据初探
  20. 联想服务器rd系列,联想ThinkServer RD550服务器首发评测

热门文章

  1. 运动鞋折扣店如何贴吧引流?运动鞋推广引流加粉怎么做?
  2. Zotero6.0版本 Quicklook不能使用/中文乱码不显示
  3. poj2228 Naptime 题解报告
  4. linux多线程同步概览
  5. C#重载和重写的区别
  6. 【unity】粒子系统
  7. 关于专利书写以及申报的一点心得体会
  8. 【论文阅读】EDPLVO: Efficient Direct Point-Line Visual Odometry
  9. elment ui 时间组件(el-date-picker)限制只能选择当前时间之前的时间(包括时分秒的限制)
  10. 什么是终身学习(Life Long Learning / Continuous Learning / Never Ending Learning / Incremental Learning)