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

如何通过@Param配置JMH测试的线程数?

能不能用JMH的@Param注解调整线程数跑多组测试?

直接像你写的那样做是不行的,原因很简单:@GroupThreads要求传入的是编译期常量,而@Param修饰的变量是在测试运行时才会被注入具体值的,编译器在编译阶段没法确定它的数值,所以代码会编译失败。

给你两个可行的解决方案:

方案一:手动指定线程数多次运行

你可以通过命令行参数,针对不同线程数分别运行基准测试,最后汇总结果。比如:

  • 运行1线程的测试:
    java -jar 你的基准测试jar包 -gp actorGroup.threads=1 -f 1
    
  • 运行2线程的测试:
    java -jar 你的基准测试jar包 -gp actorGroup.threads=2 -f 1
    
  • 以此类推,替换1为4、8即可。
    这里的-gp是用来指定Group的参数,actorGroup是你给@Group指定的名字(如果没指定,默认是基准方法名)。

方案二:编程式动态生成测试配置

如果不想手动多次敲命令,可以写代码动态生成不同线程数的测试配置,自动依次运行:

public class ActorBenchmark {
    @State(Scope.Benchmark)
    public static class ThreadState {
        // 这里放你的线程状态数据
    }

    @Benchmark
    @Group("actorGroup")
    public void actor(ThreadState state) {
        // 你的测试逻辑
    }

    public static void main(String[] args) throws Exception {
        // 要测试的线程数列表
        int[] threadCounts = {1, 2, 4, 8};
        
        for (int threads : threadCounts) {
            Options options = new OptionsBuilder()
                    .include(ActorBenchmark.class.getSimpleName())
                    // 指定当前测试的组线程数
                    .groupThreads("actorGroup", threads)
                    // 每个线程数跑1次fork
                    .forks(1)
                    .build();
            
            new Runner(options).run();
        }
    }
}

这样运行main方法后,JMH会自动依次用1、2、4、8线程数执行测试,输出各组结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:58:12