如何在 Java 中编写(和运行)正确的微基准测试?
我正在寻找一些代码示例和注释,说明要考虑的各种事情。
示例:基准测试应该测量时间/迭代还是迭代/时间,为什么?
相关: 秒表基准测试可以接受吗?
网友回答:
我知道这个问题已被标记为已回答,但我想提一下两个帮助我们编写微基准测试的库。
来自谷歌的卡尺
入门教程
来自OpenJDK的JMH
入门教程
网友回答:
关于从Java HotSpot的创建者那里编写微基准测试的提示:
规则 0:阅读有关 JVM 和微基准测试的知名论文。一个很好的是Brian Goetz,2005。不要对微观基准期望过高;它们仅测量有限范围的 JVM 性能特征。
规则 1:始终包含一个预热阶段,该预热阶段将测试内核一直运行到足以在计时阶段之前触发所有初始化和编译。(在预热阶段可以减少迭代次数。经验法则是数以万计的内部循环迭代。
规则 2:始终使用 、 等运行,以便您可以验证编译器和 JVM 的其他部分在计时阶段没有执行意外工作。-XX:+PrintCompilation
-verbose:gc
第2.1条规则:在计时和预热阶段的开始和结束时打印消息,以便您可以验证在计时阶段没有规则 2 的输出。
规则 3:请注意 和 与 以及 OSR 和常规编译之间的区别。该标志使用 at 符号报告 OSR 编译,以表示非初始入口点,例如:。如果您追求最佳性能,则首选服务器而不是客户端,并且首选常规而不是 OSR。-client
-server
-XX:+PrintCompilation
Trouble$1::run @ 2 (41 bytes)
规则4:请注意初始化效果。不要在计时阶段首次打印,因为打印会加载并初始化类。不要在预热阶段(或最终报告阶段)之外加载新类,除非您专门测试类加载(在这种情况下仅加载测试类)。规则 2 是您抵御此类影响的第一道防线。
规则5:请注意去优化和重新编译的影响。不要在计时阶段首次采用任何代码路径,因为编译器可能会根据先前的乐观假设(即根本不会使用该路径)丢弃并重新编译代码。规则 2 是您抵御此类影响的第一道防线。
规则6:使用适当的工具来阅读编译器的思想,并期望对它生成的代码感到惊讶。在形成关于什么使事物更快或更慢的理论之前,请自己检查代码。
规则7:降低测量中的噪声。在一台安静的机器上运行基准测试,并运行几次,丢弃异常值。用于与应用程序一起序列化编译器,并考虑设置以防止编译器与自身并行运行。尽量减少GC开销,设置(足够大)等于并在可用时使用。-Xbatch
-XX:CICompilerCount=1
Xmx
Xms
UseEpsilonGC
规则8:使用库进行基准测试,因为它可能更有效,并且已经为此目的进行了调试。例如JMH,Caliper或Bill and Paul出色的UCSDJava基准测试。
网友回答:
Java 基准测试的重要事项是:
System.gc()
gc()
我只是在写关于 .NET 中基准框架设计的博客。我之前有几篇文章,也许能给你一些想法——当然,不是所有的东西都是合适的,但其中一些可能是合适的。
模板简介:该模板名称为【如何在 Java 中编写正确的微基准测试?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。