Java基准测试JMH

描述

本文描述JMH的用法。

示例

引入maven依赖

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.22</version>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.22</version>
    <scope>provided</scope>
</dependency>

下面代码测试了正常方法调用和反射调用平均耗时。

@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 5, time = 1)
@Measurement(iterations = 5, time = 1)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class ReflectBenchMark {

    @Benchmark
    public Object reflect() {
        Baby baby = new Baby();

        Class<? extends Baby> aClass = baby.getClass();

        try {
            Method sayHello = aClass.getMethod("sayHello", null);

            Object invoke = sayHello.invoke(baby, null);

            return invoke;
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Benchmark
    public String methodNormal() {
        Baby baby = new Baby();
        return baby.sayHello();
    }


    public static void main(String[] args) throws RunnerException {

        Options options = new OptionsBuilder()
                .include(ReflectBenchMark.class.getSimpleName())
                .forks(1)
                .build();

        new Runner(options).run();

    }

}

输出

...
Benchmark                      Mode  Cnt  Score    Error  Units
ReflectBenchMark.methodNormal  avgt    5  0.003 ±  0.001  us/op
ReflectBenchMark.reflect       avgt    5  0.176 ±  0.005  us/op
  • @BenchmarkMode
    测试类型:
    • Throughput:吞吐量,每个时间单位调用次数
    • AverageTime:平均时间,每次调用时间
    • SampleTime:
    • SingleShotTime:只运行一次,测试冷启动
    • all
  • @Warmup
    预热,iterations测试次数,time每次进行的时长,timeUnit时长单位
  • @Measurement
    实际执行,参数和Warmup一致

引用

http://blog.dyngr.com/blog/2016/10/29/introduction-of-jmh/
https://www.xncoding.com/2018/01/07/java/jmh.html
http://tutorials.jenkov.com/java-performance/jmh.html
https://lexburner.github.io/java-jmh/
https://caorong.github.io/2017/08/22/jmh-usage/
http://openjdk.java.net/projects/code-tools/jmh/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今日体验,思考2019年过去的半年里,真的经历了太多太多!工作上并没有太大的起色,虽然每天很忙,但是结果,满意度并...
    王海博阅读 188评论 0 0
  • 2019 年马上就要开始了,我已经 33 了,记忆力从过目不忘变成了转瞬即忘,为了给自己老了以后留下点念想,给两个...
    Su_zhe阅读 281评论 1 3
  • (三)隔墙有耳 同批考进单位的还有三个女孩儿,小县城愿意考公回来的也大多是女孩儿。 有一天,大家无意中讨论单位的一...
    李佐萌阅读 250评论 0 1
  • 《前任3:再见前任》想要告诉我们的事儿很简单: 要么勇敢一点,别那么轻易放弃,要么洒脱一些,跟过去好好告别。 影片...
    QD高压锅阅读 203,123评论 7 49