JMH 一个Java自带的Benchmark
JAVA 一个 自带 JMH benchmark
2023-06-13 09:15:05 时间
JMH介绍:JDK9 及以后自带的一款可用于软件基准测试的工具 JMH(Java Microbenchmark Harness)。
如果项目使用JDK8请添加以下依赖
<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>
添加完依赖,我们直接上测试案例!
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
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注源!
相关文章
- java——List列表结构的复杂排序
- java 调用.asmx_Java调用asmx的一个例子
- java课程设计成绩管理系统_Java课程设计–学生成绩管理系统
- xml格式化 java_Java XML格式化程序
- 简单介绍一下spring bean的生命周期_java类的生命周期
- Java cast_java concat方法
- java 获取当前系统时间 时间比较
- java中两个list对象取交集、差集
- idea创建java项目的步骤_Java为什么新建不了项目
- Java 编写Vue组件(VueGWT的初尝试)
- Java中运算符 "|" 和 "||" 以及 "&" 和 "&&" 区别
- Java 方法
- DES/3DES/AES 三种对称加密算法在 Java 中的实现详解编程语言
- HDFS For Java详解大数据
- Java操作MySQL数据库快速入门(java访问mysql)
- Java操作MySQL数据库:实现看似不可能的梦想(java连接mysql数据库)
- eeOracle放弃Java EE:梦想的终结(oracle放弃java)
- XSS过滤JAVA过滤器filter 防止常见SQL注入详解编程语言
- java.sql.SQLException: com.mysql.jdbc.Driver详解编程语言
- Java Set.toArray()方法:用Set集合中的所有对象创建一个数组
- Linux重装Java:给你的操作系统新的灵魂(linux重装java)
- 工具Linux上使用Java开发的利器:选择指南(linux选择java)
- 处理处理Java中Redis过期键值对的技术(redisjava过期)
- Java中使用Redis包实现高效缓存(redis包java)
- 查找Java进程:Linux解决方案(linux查找java进程)
- Oracle和Java结合,推出新一代商城系统(java oracle商城)