加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在Java中编写正确的微基准测试?

发布时间:2020-12-15 02:11:48 所属栏目:Java 来源:网络整理
导读:你如何在 Java中编写(并运行)正确的微基准测试? 我正在寻找一些代码示例和注释,说明要考虑的各种事项. 示例:基准测量应该测量时间/迭代或迭代/时间,为什么? 相关:Is stopwatch benchmarking acceptable? 解决方法 关于编写微基准 from the creators of J
你如何在 Java中编写(并运行)正确的微基准测试?

我正在寻找一些代码示例和注释,说明要考虑的各种事项.

示例:基准测量应该测量时间/迭代或迭代/时间,为什么?

相关:Is stopwatch benchmarking acceptable?

解决方法

关于编写微基准 from the creators of Java HotSpot的提示:

规则0:阅读有关JVM和微基准测试的着名论文.一个好的是Brian Goetz,2005.不要期望微观基准太多;它们仅测量有限范围的JVM性能特征.

规则1:始终包括一个运行测试内核的预热阶段,足以在计时阶段之前触发所有初始化和编译. (在预热阶段,迭代次数较少.经验法则是数万次内循环迭代.)

规则2:始终使用-XX:PrintCompilation,-verbose:gc等运行,这样您就可以验证编译器和JVM的其他部分在计时阶段没有意外工作.

规则2.1:在计时和预热阶段的开始和结束时打印消息,这样您就可以在计时阶段验证规则2中没有输出.

规则3:注意-client和-server,OSR和常规编译之间的区别. -XX:PrintCompilation标志报告带有at符号的OSR编译以表示非初始入口点,例如:Trouble $1 :: run @ 2(41 bytes).如果您追求最佳性能,则首选服务器到客户端,并定期到OSR.

规则4:注意初始化效果.在打印加载和初始化类时,不要在计时阶段第一次打印.除非您专门测试类加载(并且在这种情况下只加载测试类),否则不要在预热阶段(或最终报告阶段)之外加载新类.规则2是您抵御此类影响的第一道防线.

规则5:注意去优化和重新编译效果.在计时阶段第一次不要采用任何代码路径,因为编译器可能会破坏并重新编译代码,这是基于先前的乐观假设,即路径根本不会被使用.规则2是您抵御此类影响的第一道防线.

规则6:使用适当的工具来阅读编译器的思想,并期望对它产生的代码感到惊讶.在形成关于什么使得更快或更慢的东西的理论之前,自己检查代码.

规则7:减少测量中的噪音.在安静的机器上运行您的基准测试,并运行几次,丢弃异常值.使用-Xbatch将编译器与应用程序序列化,并考虑设置-XX:CICompilerCount = 1以防止编译器与自身并行运行.尽量减少GC开销,设置Xmx(足够大)等于Xms并使用UseEpsilonGC(如果可用).

规则8:使用库作为您的基准测试,因为它可能更有效,并且已经针对此唯一目的进行了调试.例如JMH,Caliper或Bill and Paul’s Excellent UCSD Benchmarks for Java.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读