当前位置: 首页 > news >正文

JMH (Java Microbenchmark Harness)

JMH 是 Java 的微基准测试工具,由 OpenJDK 团队开发,专门用于编写、运行和分析 Java 代码的微基准测试(microbenchmark)。

为什么需要 JMH

普通的基准测试方法(如多次循环调用方法并计时)存在很多问题:

  • JVM 的 JIT 编译优化(方法内联、死代码消除等)

  • 预热效应(JVM 需要"热身"才能达到最佳性能)

  • 垃圾回收的干扰

  • 操作系统调度的影响

JMH 解决了这些问题,提供了准确的基准测试环境。

基本使用

1. 添加依赖

<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.37</version>
</dependency>
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.37</version><scope>provided</scope>
</dependency>

2. 编写基准测试

import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;@BenchmarkMode(Mode.AverageTime) // 测试模式:平均时间
@OutputTimeUnit(TimeUnit.NANOSECONDS) // 输出时间单位
@State(Scope.Thread) // 每个测试线程一个实例
public class MyBenchmark {@Param({"10", "100", "1000"}) // 参数化测试private int length;private int[] array;@Setup // 初始化方法public void setup() {array = new int[length];// 初始化数组...}@Benchmark // 基准测试方法public int testMethod() {// 被测代码int sum = 0;for (int i : array) {sum += i;}return sum;}
}

3. 运行基准测试

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 BenchmarkRunner {public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(MyBenchmark.class.getSimpleName()).forks(1) // 使用1个进程.warmupIterations(5) // 预热5次.measurementIterations(5) // 正式测量5次.build();new Runner(opt).run();}
}

常用注解

注解说明
@Benchmark标记基准测试方法
@BenchmarkMode测试模式:Throughput(吞吐量)、AverageTime(平均时间)、SampleTime(采样时间)等
@OutputTimeUnit结果时间单位
@State定义测试状态的作用域 (Scope.Thread/Benchmark/Group)
@Setup测试前的初始化方法
@TearDown测试后的清理方法
@Param参数化测试字段
@Fork指定fork次数(隔离测试)
@Warmup预热配置
@Measurement正式测量配置

最佳实践

  1. 避免死代码消除:确保基准测试方法有返回值或副作用

  2. 合理设置预热:通常3-5次预热迭代

  3. 使用@State管理状态:避免在基准测试方法中初始化

  4. 多次测量:增加测量次数提高准确性

  5. 参数化测试:使用@Param测试不同输入规模

  6. 避免系统干扰:关闭其他程序,保持测试环境稳定

高级特性

  • Profiler支持:集成各种分析器(GC、堆栈等)

  • 异步profiling:不影响基准测试运行

  • 时间控制:精确控制测试时间

  • 多线程测试:评估并发性能

典型输出示例

Benchmark                (length)  Mode  Cnt    Score    Error  Units
MyBenchmark.testMethod        10  avgt    5   15.234 ±  0.123  ns/op
MyBenchmark.testMethod       100  avgt    5  142.567 ±  1.234  ns/op
MyBenchmark.testMethod      1000  avgt    5 1356.789 ± 12.345  ns/op

JMH 是 Java 性能测试的事实标准工具,特别适合比较不同算法或实现的性能差异。

http://www.lqws.cn/news/544969.html

相关文章:

  • .NET MAUI跨平台串口通讯方案
  • (LeetCode 面试经典 150 题 ) 238. 除自身以外数组的乘积 (前缀和)
  • LeetCode 312 戳气球题解(Swift)+ 区间 DP 原理详解 + 可运行代码
  • WSL升级到24.04
  • 使用 asp.net core webapi 导出数据文件
  • .NetCore+Vue快速生产框架开发详细方案
  • LeetCode 349题解 | 两个数组的交集
  • 苍穹外卖day5--Redis设置店铺营业状态
  • 基于ubuntu 22.04环境安装NEURON仿真器
  • jenkins中执行python脚本导入路径错误
  • 跟着AI学习C#之项目实战-电商平台 Day3
  • 《聊一聊ZXDoc》之汽车服务导向SOME/IP
  • 自动登录脚本神器-Mac电脑实现自动登录堡垒机并自动输入账号密码跳转不同机器环境
  • uniapp处理后端返回的html字符串
  • spring-security-oauth2系列:自定义认证服务器
  • 为什么python处理csv文件将某个值替换成另一个值并另存后,csv文件的大小减小了一半
  • Nginx 与 Apache:有什么区别?哪种服务器最适合您?
  • 【数据挖掘】数据采集和预处理
  • 如何确保京东商品数据采集的准确性和及时性?
  • 【lua】Linux上安装lua和luarocks包管理工具
  • 提升AI准确性的关键:精准添加上下文
  • 【NodeJs】【npm】npm安装electron报错
  • Python Async 编程快速入门 | 超简明异步协程指南
  • C++常用算法解析:sort、find、for_each、copy
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-116节(封装)
  • cuda编程笔记(5)--原子操作
  • UI前端与数字孪生结合案例分享:智慧零售的可视化解决方案
  • 北京燃气集团管道腐蚀智能预测实践:LSTM算法驱动能源设施安全升级
  • VSCode中创建和生成动态库项目
  • 智能呼叫系统五大核心模式解析