JMH介绍:JDK9 及以后自带的一款可用于软件基准测试的工具 JMH(Java Microbenchmark Harness)。
如果项目使用JDK8请添加以下依赖
代码语言:javascript复制 <dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.27</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.27</version>
</dependency>
添加完依赖,我们直接上测试案例!
代码语言:javascript复制import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.results.format.ResultFormatType;
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;
import java.util.concurrent.TimeUnit;
//使用模式 默认是Mode.Throughput
@BenchmarkMode(Mode.AverageTime)
// 配置预热次数,默认是每次运行1秒,运行10次,这里设置为3次
@Warmup(iterations = 3, time = 1)
// 本例是一次运行4秒,总共运行3次,在性能对比时候,采用默认1秒即可
@Measurement(iterations = 3, time = 4)
// 配置同时起多少个线程执行
@Threads(1)
//代表启动多个单独的进程分别测试每个方法,这里指定为每个方法启动一个进程
@Fork(1)
// 定义类实例的生命周期,Scope.Benchmark:所有测试线程共享一个实例,用于测试有状态实例在多线程共享下的性能
@State(value = Scope.Benchmark)
// 统计结果的时间单元
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class TestStringBuilder {
@Param(value = {"10", "50", "100"})
private int length;
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(TestStringBuilder.class.getSimpleName())
.result("result.json") // 指定结果以json结尾,生成后复制可去:http://deepoove.com/jmh-visual-chart/ 或https://jmh.morethan.io/ 得到可视化界面
.resultFormat(ResultFormatType.JSON).build();
new Runner(opt).run();
}
@Benchmark // 测试StringBuffer 添加操作
public void testStringBufferAdd(Blackhole blackhole) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i ) {
sb.append(i);
}
blackhole.consume(sb.toString());
}
@Benchmark // 测试SptingBuilder 添加操作
public void testStringBuilderAdd(Blackhole blackhole) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i ) {
sb.append(i);
}
blackhole.consume(sb.toString());
}
}
运行Main方法后,会生成一个result.json文件,拖入:https://jmh.morethan.io/
如果想了解更多JMH的使用,请参考:https://juejin.cn/post/6914960426098917384
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注源!