忆梦|Java JMH 基准测试工具( 二 )
jmh-generator-annprocess///代码清单 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|淘宝商家要小心了!取消的“中差评”体系又回来啦!
- javascript|游戏开发之旅-JavaScript重新介绍
- Java|java多线程并发小demo
- Java|java程序猿如何才能走远,怎么做自己的职业规划
- 蚂蚁花呗|血亏!阿里P8轻易把总结了近一年的java高级特性笔记送人了
- 百度|Java高级进阶多线程学习之路(七)ThreadLocal
- javascript|家里宽带是300M的,但是实际测速才2M应该这样维权。
- 社交|十一国庆过后,秋招Java岗,陆续收到字节/招银等offer
- Java|Java面试之基础问题答案口述整理
- 忆梦微信发视频还能添加文字?原来方法这么简单,手把手教你学会
