You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle项目中JMH Setup方法执行但Benchmark方法未运行

解决JMH基准测试Setup执行但Benchmark不运行的问题

针对你遇到的Setup方法执行两次但@Benchmark方法未执行、报告为空的问题,可按以下步骤排查解决:

1. 确认JMH注解处理器配置正确

JMH依赖注解处理器生成基准测试的执行代码,即使其他子项目配置正常,也要确保当前子项目的build.gradle里正确声明了注解处理器依赖,且版本与jmh-core一致:

dependencies {
    implementation 'org.openjdk.jmh:jmh-core:1.37' // 替换为你实际使用的版本
    annotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess:1.37' // 版本需与core完全匹配
}

若之前用compileOnly或其他方式声明处理器,改为annotationProcessor才能保证注解被正确解析处理。

2. 检查@Benchmark方法的参数有效性

确保Blackhole的导入路径是org.openjdk.jmh.infra.Blackhole,如果导错包,JMH会判定该方法不是有效基准测试方法,直接跳过执行。

3. 调整@Setup的执行级别(可选)

你看到Setup执行两次,是因为默认@Setup的级别是Level.Trial——每个预热(Warmup)或测量(Measurement)的迭代都会触发一次。如果希望整个基准测试生命周期只执行一次Setup,显式指定级别:

@Setup(Level.Benchmark)
public void setupBenchmark() {
    System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    // ...
}

4. 查看JMH详细运行日志

执行Gradle命令时添加--info参数,获取JMH的完整运行日志:

./gradlew :sub-project:jmh --info

日志中会明确显示JMH是否识别到你的Benchmark方法,是否存在编译错误、生成类缺失、依赖冲突等问题,这是定位根因的关键。

5. 验证SingleShotTime模式配置

Mode.SingleShotTime是单次执行模式,若怀疑模式配置有冲突,可临时切换为Mode.Throughput或Mode.AverageTime,看Benchmark方法是否能正常执行,以此排除模式本身的问题。

6. 清理缓存后重新构建

执行以下命令清理构建缓存并重新运行基准测试,避免编译缓存导致的代码不生效问题:

./gradlew :sub-project:clean :sub-project:jmh

内容的提问来源于stack exchange,提问作者Steven Wu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:17:46