深入拆解 Java 虚拟机
郑雨迪
Oracle 高级研究员,计算机博士
86502 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
模块四:黑科技 (3讲)
深入拆解 Java 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

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

今天我们来聊聊性能基准测试(benchmarking)。
大家或许都看到过一些不严谨的性能测试,以及基于这些测试结果得出的令人匪夷所思的结论。
static int foo() {
int i = 0;
while (i < 1_000_000_000) {
i++;
}
return i;
}
举个例子,上面这段代码中的foo方法,将进行 10^9 次加法操作及跳转操作。
不少开发人员,包括我在介绍反射调用那一篇中所做的性能测试,都使用了下面这段代码的测量方式,即通过System.nanoTime或者System.currentTimeMillis来测量每若干个操作(如连续调用 1000 次foo方法)所花费的时间。
public class LoopPerformanceTest {
static int foo() { ... }
public static void main(String[] args) {
// warmup
for (int i = 0; i < 20_000; i++) {
foo();
}
// measurement
long current = System.nanoTime();
for (int i = 1; i <= 10_000; i++) {
foo();
if (i % 1000 == 0) {
long temp = System.nanoTime();
System.out.println(temp - current);
current = System.nanoTime();
}
}
}
}
这种测量方式实际上过于理性化,忽略了 Java 虚拟机、操作系统,乃至硬件系统所带来的影响。

性能测试的坑

关于 Java 虚拟机所带来的影响,我们在前面的篇章中已经介绍过不少,如 Java 虚拟机堆空间的自适配,即时编译等。
在上面这段代码中,真正进行测试的代码(即// measurement后的代码)由于循环次数不多,属于冷循环,没有能触发 OSR 编译。
也就是说,我们会在main方法中解释执行,然后调用foo方法即时编译生成的机器码中。这种混杂了解释执行以及即时编译生成代码的测量方式,其得到的数据含义不明。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Java 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • shitao
    这篇还没留言啊,总结下自己的一点jmh测试经验吧,希望老师指导。 1. 最好在专门的机器上做测试而不是自己的pc 2. 依赖的外部资源如redis,db等,测试过程中最好是独占的 3. 测试时间不宜过短,我一般10min以上吧
    18
  • 静心
    老师,什么叫冷循环呀? 既然有冷循环,是不是还有什么所谓的热循环?
    1
    2
  • 史海洋
    <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
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部