技术记录栈

记录点滴:java、datebase、linux、spring、javascript、nginx

2019/01/07

JMH openjdk基准测试套件Microbenchmark

JMH用于对java程序性能做基准测试,是一款由于openjdk提供的基准测试套件。

JMH工作原理

开发者使用@Benchmark注解,标识测试对象,JMH根据注解,生成特定的基准测试代码。JMH保证以尽可能可靠的方式生成代码。对JMH来说,用@Benchmark标记的方法,被看作是基准的“有效负载”,即我们要进行测试的目标。

JMH工作方式

测试对象

public class Main {
    
    @Benchmark
    public void empty() {
        //todo
    }
}

运行基准测试

public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder().include(Main.class.getSimpleName()).forks(1).build();
    new Runner(opt).run();

}

以上是JMH基准测试最简示例。

JMH依赖项

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.11.2</version>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.11.2</version>
</dependency>

完速示例参考移步到github:

https://github.com/putdns/jmh

示例说明

Benchmark     Mode  Cnt         Score        Error   Units
Main.and     thrpt   10   6226272.557 ±  30481.573  ops/ms
Main.append  thrpt   10     13244.970 ±     64.521  ops/ms
Main.empty   thrpt   10  12374236.900 ± 766829.412  ops/ms
Main.multi   thrpt   10   5910340.633 ± 216542.045  ops/ms
Main.plus    thrpt   10      3731.866 ±    121.945  ops/ms

以上数据是示例程序的运行结果,列表第4列是测试的关键,因为,测试类型是吞吐量(@BenchmarkMode(Mode.Throughput)),所以,这个值越大越能说明方法的效率。测试结果偏差值,为(±)后面的数值。

JMH常见异常处理

运行时如果出现异常,请参考JMH异常处理

参考openjdk Microbenchmark Suite:

https://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/