Java在JMH(JavaMicrobenchmarkHarness)微基准测试中的运用

简介: 开发者常常想比较两种实现的性能(如ArrayList与LinkedList、序列化框架JSON与Protobuf)。

1.微基准测试的必要性
开发者常常想比较两种实现的性能(如ArrayList与LinkedList、序列化框架JSON与Protobuf)。但是,简单的for循环测试结果不可靠,因为JVM会执行JIT编译、死代码消除、优化掉循环等。JMH(JavaMicrobenchmarkHarness)是OpenJDK官方的微基准测试框架,能够准确地测量Java代码性能。
参考:https://www.xrzqr.cn/category/weather-science.html

2.JMH的核心概念
状态(State):基准测试的状态对象,可定义@State(Scope.Benchmark)(所有线程共享)或@State(Scope.Thread)(每个线程单独)。
基准测试方法:使用@Benchmark标注。
设置/清理:@Setup、@TearDown标注初始化方法。
执行模式:
Throughput(单位时间执行次数)
AverageTime(平均执行时间)
SampleTime(执行时间分布)
SingleShotTime(单次执行,忽略JIT预热)
预热:@Warmup指定迭代次数,让JIT充分优化后再测量。
分叉:@Fork指定独立JVM进程数,避免测试间干扰。

3.编写一个简单基准测试
假设要比较StringBuilder和StringBuffer的append性能。使用JMH:
添加依赖org.openjdk.jmh:jmh-core和jmh-generator-annprocess。
定义@State(Scope.Thread)类,包含StringBuilder和StringBuffer实例。
编写两个@Benchmark方法,分别调用append。
运行JMH的main方法,输出结果。
JMH会输出每个操作的纳秒级别时间,并附带置信区间。
参考:https://www.xrzqr.cn/category/national-weather.html

4.常见陷阱与避免
死代码消除:如果基准方法的结果没有被使用,JVM可能会优化掉整个计算。使用Blackhole.consumeCPU或return结果。
常量折叠:如果输入是常量,JVM可能在编译期计算完。应使用@State参数化输入,或从java.util.concurrent.ThreadLocalRandom获取。
虚假共享:多线程访问相邻缓存行。JMH提供@CompilerControl和@AuxCounters帮助检测。

5.案例:比较JSON序列化库
某项目需要选择JSON库(JacksonvsGsonvsFastjson)。使用JMH编写基准测试:
准备相同复杂度的Java对象。
分别序列化和反序列化,测量吞吐量。
设置不同数据大小(小对象、大数组)。
运行结果表明,Jackson在吞吐量上领先Gson约30%,但Gson启动更快。最终团队根据JMH报告选择了Jackson。

6.集成到CI
JMH可以作为独立的JAR运行,并输出JSON格式的结果,方便CI系统收集并绘制性能趋势图。例如,每次Git提交后自动运行关键基准测试,对比历史数据,如果性能下降超过阈值,则报警。

7.与其他工具对比
System.nanoTime简单循环:不可靠。
JMH:官方标准,处理了JVM预热、死代码消除、分叉等,结果可信。

8.总结
JMH是Java开发者进行性能比较的利器。无论是评估数据结构、库、算法,还是验证优化效果,JMH都能提供可信的数据。学会JMH可以让你摆脱“感觉快”的感性判断,用数据驱动决策。
参考:https://www.xrzqr.cn

目录
相关文章
|
2月前
|
消息中间件 存储 监控
Java在JavaAgent与字节码增强技术中的应用(APM基石)
JavaAgent是一种特殊的JAR包,可以在JVM启动时(-javaagent)或运行时(AttachAPI)修改字节码。它利用Instrumentation接口,通过ClassFileTransformer在类加载前或重定义时替换字节码。
288 0
|
1月前
|
人工智能 分布式计算 Serverless
EMR Serverless Daft 如何简化多模态数据处理:视频抽帧、清洗、标注全流程与具身智能实践
阿里云 EMR Serverless Spark 引入 Ray 分布式计算框架与 Daft 高性能数据引擎,为用户提供了一套开箱即用、免运维且极致高效的多模态数据处理基础设施。
|
2月前
|
JSON 运维 PHP
PHP在命令行应用开发中的深度实践(CLI模式)
PHP不仅用于Web开发,其命令行(CLI)模式同样强大。许多开发者不知道的是,Laravel的artisan命令行工具就是PHPCLI应用的典范
126 4
|
2月前
|
自然语言处理 监控 机器人
企业级Agent解决方案盘点:瓴羊五大agent落地应用场景解析
2025年,瓴羊依托AgentOne统一框架,在营销、客服、BI分析、数据治理等五大场景实现企业级Agent规模化落地。通过多智能体协同、跨系统调度与业务闭环验证,助力企业破解数据孤岛、实时决策与安全合规难题,显著提升运营效率与商业价值。(239字)
|
2月前
|
数据采集 自然语言处理 API
反向海淘实战:Pandabuy、ACbuy、Cssbuy、Superbuy、CNFans 代购集运系统搭建真实体验
近年反向海淘火爆,Pandabuy等平台成海外用户采购中国货主流渠道。本文基于实操经验,从模式拆解、搭建流程、核心难点、实测对比四维度,分享如何用taocarts快速(7天)搭建合规、稳定、全链路代购集运系统,助创业者低成本入局。
449 1
|
2月前
|
运维 API 数据库
哪个IP查询工具更新更及时?实测对比:日更库 vs周更/月更库
IP归属地动态变化,周/月更库易过时,导致广告错投、风控失效。本文实测对比发现:日更商业库新IP段24小时内精准入库,而月更纯真库等严重滞后。附三大验证方法——跟踪新IP段、多工具交叉比对、WHOIS事实核查。(239字)
821 1
|
2月前
|
机器学习/深度学习 人工智能 编解码
睡岗检测数据集分享(适用于YOLO系列深度学习分类检测任务)
本数据集含2000张真实监控场景图像,专为睡岗检测设计,支持YOLO等目标检测模型。涵盖多光照、多角度、多分辨率条件,标注精准(YOLO格式),含训练/验证集及配置文件,适用于安防、交通、工业等智能监控场景。(239字)
285 1
|
2月前
|
缓存 运维 监控
Java在JMX(JavaManagementExtensions)监控与管理中的深度运用
JMX是Java平台的标准管理规范,允许开发者暴露应用程序的内部状态(如内存使用、线程数、业务指标)以及执行操作(如刷新缓存、切换日志级别)。
405 0
|
2月前
|
边缘计算 Rust JavaScript
PHP在WebAssembly中的运用——将PHP代码带到浏览器与边缘计算
WebAssembly(Wasm)是一种可移植的二进制指令格式,可在浏览器中接近原生速度运行。
159 0
|
2月前
|
机器学习/深度学习 NoSQL API
PHP在内容安全过滤与反垃圾系统中的实战
社交平台、评论系统、论坛等需要自动过滤敏感词(政治、色情、暴力)、检测垃圾评论(广告、刷屏)、防止恶意代码注入(XSS)。
219 0

热门文章

最新文章