| name | jmh-bench |
| description | 该skill没有执行文件,为操作指引:运行JMH基准测试的标准流程 |
JMH 基准测试执行指南
核心要求
- 测试默认参数:
- 预热10次
- 测试5次
- 每次预热执行100ms
- 每次测试执行20ms
- 4线程执行
- fork 3次
- 测试首推用mvnd
前置准备
1. 获取环境信息
执行 skill /java-env 获取 Java 开发环境信息:
skill java-env
确认:
- mvnd/maven 目录位置
- JDK 版本匹配项目需求
2. 配置 pom.xml
在项目中添加 JMH 依赖:
<dependencies>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.37</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
执行方式
方式一:Maven Exec 插件(推荐)
mvn clean compile -q
mvn exec:exec -Dexec.executable="java" \
-Dexec.args="-cp %classpath org.openjdk.jmh.Main" -q
mvn exec:exec -Dexec.executable="java" \
-Dexec.args="-cp %classpath org.openjdk.jmh.Main BenchmarkClassName" -q
mvn exec:exec -Dexec.executable="java" \
-Dexec.args="-cp %classpath org.openjdk.jmh.Main BenchmarkClassName -wi 3 -i 3 -t 1 -f 1" -q
参数说明:
-wi N: Warmup 迭代次数
-i N: Measurement 迭代次数
-t N: 线程数
-f N: Fork 次数
方式二:run_bench.sh 脚本
创建脚本 run_bench.sh:
#!/bin/bash
PROJECT_DIR=$(dirname "$0")
cd "$PROJECT_DIR"
BENCHMARK_CLASS="${1:-}"
JMH_ARGS="${2:-}"
CLASSPATH="target/classes:target/test-classes:$(mvn dependency:build-classpath -Dmdep.outputFile=/dev/stdout -q)"
if [ -n "$BENCHMARK_CLASS" ]; then
java -cp "$CLASSPATH" org.openjdk.jmh.Main "$BENCHMARK_CLASS" $JMH_ARGS
else
java -cp "$CLASSPATH" org.openjdk.jmh.Main
fi
使用方式:
chmod +x run_bench.sh
./run_bench.sh
./run_bench.sh MyBenchmark
./run_bench.sh MyBenchmark "-wi 5 -i 5"
常用命令模板
| 场景 | 命令 |
|---|
| 快速验证 | -wi 3 -i 3 -t 1 -f 1 |
| 标准测试 | -wi 5 -i 5 -t 4 -f 2 |
| 精确测试 | -wi 10 -i 10 -t 1 -f 3 |
| 列出所有Benchmark | -l |
输出解读
典型输出示例:
Benchmark Mode Cnt Score Error Units
MyBenchmark.testMethod thrpt 5 123456.789 ± 5000 ops/s
指标说明:
thrpt: Throughput 吞吐量(ops/s)
avgt: Average Time 平均耗时(us/op)
sample: Sampling 时间采样
Score: 平均值
Error: 置信区间误差(99.9%)
最佳实践
- Warmup 充足 - 至少 5 次预热,让 JIT 编译稳定
- 避免 GC 影响 - 测试前可手动触发 GC:
System.gc()
- Blackhole 消费 - 防止死代码消除:
bh.consume(result)
- State 隔离 - 使用
@State(Scope.Thread) 避免线程竞争
- 单线程对比 - 多框架对比时先用
-t 1 消除并发因素