描述
本文描述JMH的用法。
示例
引入maven依賴
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.22</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.22</version>
<scope>provided</scope>
</dependency>
下面代碼測試了正常方法調用和反射調用平均耗時。
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 5, time = 1)
@Measurement(iterations = 5, time = 1)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class ReflectBenchMark {
@Benchmark
public Object reflect() {
Baby baby = new Baby();
Class<? extends Baby> aClass = baby.getClass();
try {
Method sayHello = aClass.getMethod("sayHello", null);
Object invoke = sayHello.invoke(baby, null);
return invoke;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
@Benchmark
public String methodNormal() {
Baby baby = new Baby();
return baby.sayHello();
}
public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(ReflectBenchMark.class.getSimpleName())
.forks(1)
.build();
new Runner(options).run();
}
}
輸出
...
Benchmark Mode Cnt Score Error Units
ReflectBenchMark.methodNormal avgt 5 0.003 ± 0.001 us/op
ReflectBenchMark.reflect avgt 5 0.176 ± 0.005 us/op
- @BenchmarkMode
測試類型:- Throughput:吞吐量,每個時間單位調用次數
- AverageTime:平均時間,每次調用時間
- SampleTime:
- SingleShotTime:只運行一次,測試冷啟動
- all
- @Warmup
預熱,iterations測試次數,time每次進行的時長,timeUnit時長單位 - @Measurement
實際執(zhí)行,參數和Warmup一致
引用
http://blog.dyngr.com/blog/2016/10/29/introduction-of-jmh/
https://www.xncoding.com/2018/01/07/java/jmh.html
http://tutorials.jenkov.com/java-performance/jmh.html
https://lexburner.github.io/java-jmh/
https://caorong.github.io/2017/08/22/jmh-usage/
http://openjdk.java.net/projects/code-tools/jmh/