如何通过@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
相关产品推荐
相关产品推荐

