描述
本文描述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>
下面代碼測試了正常方法調(diào)用和反射調(diào)用平均耗時票灰。
@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:吞吐量,每個時間單位調(diào)用次數(shù)
- AverageTime:平均時間罐氨,每次調(diào)用時間
- SampleTime:
- SingleShotTime:只運(yùn)行一次臀规,測試?yán)鋯?/li>
- all
- @Warmup
預(yù)熱,iterations測試次數(shù)栅隐,time每次進(jìn)行的時長塔嬉,timeUnit時長單位 - @Measurement
實(shí)際執(zhí)行,參數(shù)和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/