28 | 基准测试框架JMH(上)
郑雨迪

今天我们来聊聊性能基准测试(benchmarking)。
大家或许都看到过一些不严谨的性能测试,以及基于这些测试结果得出的令人匪夷所思的结论。
举个例子,上面这段代码中的foo方法,将进行 10^9 次加法操作及跳转操作。
不少开发人员,包括我在介绍反射调用那一篇中所做的性能测试,都使用了下面这段代码的测量方式,即通过System.nanoTime或者System.currentTimeMillis来测量每若干个操作(如连续调用 1000 次foo方法)所花费的时间。
这种测量方式实际上过于理性化,忽略了 Java 虚拟机、操作系统,乃至硬件系统所带来的影响。
性能测试的坑
关于 Java 虚拟机所带来的影响,我们在前面的篇章中已经介绍过不少,如 Java 虚拟机堆空间的自适配,即时编译等。
在上面这段代码中,真正进行测试的代码(即// measurement后的代码)由于循环次数不多,属于冷循环,没有能触发 OSR 编译。
也就是说,我们会在main方法中解释执行,然后调用foo方法即时编译生成的机器码中。这种混杂了解释执行以及即时编译生成代码的测量方式,其得到的数据含义不明。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Java 虚拟机》,新⼈⾸单¥59
《深入拆解 Java 虚拟机》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(5)
- 最新
- 精选
- shitao这篇还没留言啊,总结下自己的一点jmh测试经验吧,希望老师指导。 1. 最好在专门的机器上做测试而不是自己的pc 2. 依赖的外部资源如redis,db等,测试过程中最好是独占的 3. 测试时间不宜过短,我一般10min以上吧18
- 静心老师,什么叫冷循环呀? 既然有冷循环,是不是还有什么所谓的热循环?12
- 史海洋<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency>
- 曾轼麟感觉基准测试好麻烦,能否有更加简洁的方式呢?比较真实项目中,依赖还是比较强的
- akka自己测试时的一点不同点: java版本:java version "11.0.3" 2019-04-16 LTS; 需提供额外jar包:javax.annotation.javax.annotation-api,否则提示文件缺失; 原@Benchmark包中未提供,自动生成以@GenerateMicroBenchmark替代; mvn package会生成两个jar:microbenchmarks.jar/test-1.21.jar
收起评论