忆梦|Java JMH 基准测试工具( 二 )

jmh-generator-annprocess1.192.2 使用 JMH 进行测试///代码清单 2-1import org.openjdk.jmh.annotations.*;import org.openjdk.jmh.runner.Runner;import org.openjdk.jmh.runner.options.Options;import org.openjdk.jmh.runner.options.OptionsBuilder;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.concurrent.TimeUnit;//Mode 表示 JMH 进行 Benchmark 时所使用的模式//BenchmarkMode的value是一个数组 , 可以把几种Mode集合在一起执行 , 还可以设置为Mode.Al@BenchmarkMode(Mode.AverageTime)//benchmark 结果所使用的时间单位//使用java.util.concurrent.TimeUnit中的标准时间单位// 微秒@OutputTimeUnit(TimeUnit.MICROSECONDS)///JMH测试类必须使用@State注解 , // State定义了一个类实例的生命周期 , // 可以类比Spring Bean的Scope@State(Scope.Thread)public class DemoApplicationTestJMH {public static void main(String[] args) throws Exception {String name = DemoApplicationTestJMH.class.getName();Options options = new OptionsBuilder().include(name ).forks(1).measurementIterations(3).warmupIterations(3).build();new Runner(options).run();}@Benchmarkpublic void testArrayList() {List arrayList = new ArrayList<>();for (int i = 0; i < 10000000; i++) {arrayList.add("测试数据");}}@Benchmarkpublic void testLinkedList() {//测试 LinkedListList linkedList = new LinkedList<>();for (int i = 0; i < 10000000; i++) {linkedList.add("测试数据");}}}然后运行main 方法后控制台日志会输出很长的日志信息 , 在这里是执行了testArrayList 与testLinkedList两个方法的基准测试 , 每个方法都会对应一段日志信息 , 小编在这里将testArrayList 方法 日志信息拆分成两段如下:
第一段包括 JVM 的启动参数配置信息 以及 JMH 的基本配置
/Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=65371: ... 省略路径IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath # JMH version: 1.19# VM version: JDK 1.8.0_74, VM 25.74-b02# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java# VM options: -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=65371:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8# Warmup: 3 iterations, 1 s each# Measurement: 3 iterations, 1 s each# Timeout: 10 min per iteration# Threads: 1 thread, will synchronize iterations# Benchmark mode: Average time, time/op# Benchmark: com.example.demo.DemoApplicationTestJMH.testArrayList# Run progress: 0.00% complete, ETA 00:00:12# Fork: 1 of 1objc[56915]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/bin/java (0x10d1a44c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10d1e94e0). One of the two will be used. Which one is undefined.# Warmup Iteration1: 101153.611 us/op# Warmup Iteration2: 76302.787 us/op# Warmup Iteration3: 54296.903 us/opIteration1: 57062.920 us/opIteration2: 65024.286 us/opIteration3: 56325.284 us/op分析如下图
忆梦|Java JMH 基准测试工具


推荐阅读