JMH(Java Microbenchmark Harness)是一个专门为Java语言编写的基准测试框架,用于精确测量代码的性能。下面是如何正确使用JMH以及一个关于ArrayList
的示例。
假设我们想要比较ArrayList
在不同初始容量下的添加操作性能。
import org.openjdk.jmh.annotations.*;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@State(Scope.Benchmark)
public class ArrayListBenchmark {
@Param({"10", "100", "1000"})
private int initialCapacity;
private ArrayList<Integer> arrayList;
@Setup
public void setup() {
arrayList = new ArrayList<>(initialCapacity);
}
@Benchmark
public void testAdd() {
arrayList.add(1);
}
public static void main(String[] args) throws Exception {
org.openjdk.jmh.Main.main(args);
}
}
@BenchmarkMode(Mode.AverageTime)
:指定基准测试模式为平均时间。@OutputTimeUnit(TimeUnit.NANOSECONDS)
:指定输出时间单位为纳秒。@Warmup
:预热设置,运行5次,每次1秒。@Measurement
:实际测量设置,运行10次,每次1秒。@Fork
:指定运行基准测试的进程数。@State(Scope.Benchmark)
:定义基准测试的状态。@Param
:定义参数化测试的参数。@Setup
:在每次基准测试之前执行的方法。@Benchmark
:标记为基准测试的方法。编译并运行上述代码后,JMH将输出每次运行的平均时间,并提供统计分析结果。通过比较不同初始容量下的性能数据,可以评估ArrayList
在不同场景下的性能表现。
请注意,为了获得准确的结果,基准测试应该在控制环境中进行,并考虑其他可能影响性能的因素,如系统负载、JVM优化等。
领取专属 10元无门槛券
手把手带您无忧上云