JMH 的github地址: 点击下载项目
- 下载项目后, 将项目完整导入 idea 中, 其中的
jmh-samples
就是JMH测试DEMO。 那么我们通过DEMO学习如何通过JMH 测试吧 - 下面通过官方的demo 来学习
package org.openjdk.jmh.samples;
import org.openjdk.jmh.annotations.Benchmark;
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;
public class JMHSample_01_HelloWorld {
@Benchmark
public void wellHelloThere() {
// this method was intentionally left blank.
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(JMHSample_01_HelloWorld.class.getSimpleName())
.forks(1)
.build();
new Runner(opt).run();
}
}
运行main方法,控制台输出:
C:\openSource\jdk1.8\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=56388:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath C:\openSource\jdk1.8\jre\lib\charsets.jar;C:\openSource\jdk1.8\jre\lib\deploy.jar;C:\openSource\jdk1.8\jre\lib\ext\access-bridge-64.jar;C:\openSource\jdk1.8\jre\lib\ext\cldrdata.jar;C:\openSource\jdk1.8\jre\lib\ext\dnsns.jar;C:\openSource\jdk1.8\jre\lib\ext\jaccess.jar;C:\openSource\jdk1.8\jre\lib\ext\jfxrt.jar;C:\openSource\jdk1.8\jre\lib\ext\localedata.jar;C:\openSource\jdk1.8\jre\lib\ext\nashorn.jar;C:\openSource\jdk1.8\jre\lib\ext\sunec.jar;C:\openSource\jdk1.8\jre\lib\ext\sunjce_provider.jar;C:\openSource\jdk1.8\jre\lib\ext\sunmscapi.jar;C:\openSource\jdk1.8\jre\lib\ext\sunpkcs11.jar;C:\openSource\jdk1.8\jre\lib\ext\zipfs.jar;C:\openSource\jdk1.8\jre\lib\javaws.jar;C:\openSource\jdk1.8\jre\lib\jce.jar;C:\openSource\jdk1.8\jre\lib\jfr.jar;C:\openSource\jdk1.8\jre\lib\jfxswt.jar;C:\openSource\jdk1.8\jre\lib\jsse.jar;C:\openSource\jdk1.8\jre\lib\management-agent.jar;C:\openSource\jdk1.8\jre\lib\plugin.jar;C:\openSource\jdk1.8\jre\lib\resources.jar;C:\openSource\jdk1.8\jre\lib\rt.jar;O:\11_javaweb_project\jmh-master\jmh-samples\target\classes;O:\11_javaweb_project\jmh-master\jmh-core\target\classes;C:\openSource\repository\net\sf\jopt-simple\jopt-simple\4.6\jopt-simple-4.6.jar;C:\openSource\repository\org\apache\commons\commons-math3\3.2\commons-math3-3.2.jar org.openjdk.jmh.samples.JMHSample_01_HelloWorld
# JMH version: 1.27-SNAPSHOT
# VM version: JDK 1.8.0_191, Java HotSpot(TM) 64-Bit Server VM, 25.191-b12
# VM invoker: C:\openSource\jdk1.8\jre\bin\java.exe
# VM options: -javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=56388:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.3\bin -Dfile.encoding=UTF-8
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: org.openjdk.jmh.samples.JMHSample_01_HelloWorld.wellHelloThere
# Run progress: 0.00% complete, ETA 00:01:40
# Fork: 1 of 1
# Warmup Iteration 1: 3802658396.305 ops/s
# Warmup Iteration 2: 3884623694.805 ops/s
# Warmup Iteration 3: 3903365644.049 ops/s
# Warmup Iteration 4: 3875075570.336 ops/s
# Warmup Iteration 5: 3889230307.899 ops/s
Iteration 1: 3908019055.197 ops/s
Iteration 2: 3903886376.091 ops/s
Iteration 3: 3925061548.567 ops/s
Iteration 4: 3907436044.825 ops/s
Iteration 5: 3928217476.375 ops/s
Result "org.openjdk.jmh.samples.JMHSample_01_HelloWorld.wellHelloThere":
3914524100.211 ±(99.9%) 43234676.227 ops/s [Average]
(min, avg, max) = (3903886376.091, 3914524100.211, 3928217476.375), stdev = 11227908.119
CI (99.9%): [3871289423.984, 3957758776.438] (assumes normal distribution)
# Run complete. Total time: 00:01:41
REMEMBER: 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_01_HelloWorld.wellHelloThere thrpt 5 3914524100.211 ± 43234676.227 ops/s
Process finished with exit code 0
Benchmark
注解标注测试的方法, 然后再调用JMH的runner .run() 运行.
上面的控制台输出我们要关注的地方是 Result , 这个能够看到这个方法的 平均,最小, 最大, 标准运行吞吐量 opt/s.
还有最后的JMHSample_01_HelloWorld.wellHelloThere 也能看到wellHelloThere 的吞吐量. Mode 这里面的thrpt表示Throughput , 表示这是吞吐量. 这里的mode 表示测试基准的模式,这个模式我们后面会讲到如何使用.
- 由于原文的文档太长, 这里简单的总结一下
Benchmark
的作用, 使用这个标签, JMH 能够生成基准测试, 并且一个class 中, 可以测试多个方法, 每个 方法都使用Benchmark
标注即可, 需要注意的是, 如果你的 基准测试方法没有完成,那么JMH运行也不会停止, 如果在你的方法的body体中抛出一个异常, 那么JMH将会运行基准测试列表中的下一个基准测试.
网友评论