当前位置: 首页 > 面试题库 >

如何用Java编写正确的微基准?

贺海
2023-03-14
问题内容

您如何用Java编写(并运行)正确的微基准测试?

我正在寻找一些代码示例和注释,以说明要考虑的各种问题。

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


问题答案:

有关从Java HotSpot的创建者编写微基准测试的提示:

规则0:阅读有关JVM和微基准测试的著名论文。好的人是布莱恩·格茨(Brian Goetz),2005年。不要对微观基准期望太高;它们仅测量有限范围的JVM性能特征。

规则1:始终包括一个预热阶段,该阶段一直运行您的测试内核,足以在计时阶段之前触发所有初始化和编译。(在预热阶段可以进行较少的迭代。经验法则是数以万计的内html" target="_blank">循环迭代。)

规则2:始终与-XX:+PrintCompilation,-verbose:gc等一起运行,因此您可以验证在计时阶段,编译器和JVM的其他部分是否未进行意外工作。

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

规则3:请注意-client和-server,OSR和常规编译之间的区别。该-XX:+PrintCompilation标志报告OSR编译时带有一个符号,以表示非初始入口点,例如:Trouble$1::run @ 2 (41 bytes)。如果您追求最佳性能,则优先选择服务器而不是客户端,并经常选择OSR。

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

规则5:注意优化和重新编译的影响。在时序阶段不要第一次采用任何代码路径,因为基于较早的乐观假设(即根本不会使用该路径),编译器可能会垃圾并重新编译代码。规则2是抵御此类影响的第一道防线。

规则6:使用适当的工具来阅读编译器的思想,并期望对其生成的代码感到惊讶。在形成有关使事物变快或变慢的理论之前,请自己检查代码。

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

规则8:将库用于基准测试,因为它可能更有效,并且已经针对此目的进行了调试。



 类似资料:
  • 如何在Java编写(并运行)一个正确的微基准? 我正在寻找一些代码示例和注释,说明各种事情,以供思考。 示例:基准应该测量时间/迭代还是迭代/时间,为什么? 相关:秒表对标可以接受吗?

  • 我对编码很陌生。尝试用Java编写一个evaluatePostfix函数。我不断得到一个错误: 不兼容的类型:int不能转换为字符堆栈。push(eval(token,a,b)); 下面是我的代码块: 函数接受后缀表达式并计算结果。 这是我的eval函数:

  • 本文向大家介绍基于python编写的微博应用,包括了基于python编写的微博应用的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了基于python编写的微博应用,分享给大家供大家参考。具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥。 下载python版的SDK,打开example目录,仿照oauthSetTokenUpdate.py进行编码, 运行这个程

  • 听起来有点愚蠢,但我需要我的方法的帮助,这很烦人。我试着在网上查找,因为是一个出错和“找不到Kid constructor#2”的程序,尽管它在那里,我甚至会做其他事情,但它不起作用。好吧,这太多了,下面是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数是关闭的,应该是字符串)是关闭的。如果我硬编码第三个值,它就会失控,说它找不到这个(上面)。那么我怎么才能得到日期并把它分开

  • 问题内容: 以编程方式确定输入流/文件的正确字符集编码的最佳方法是什么? 我尝试使用以下方法: 但是在我知道要用ISO8859_1编码的文件上,上面的代码会产生ASCII,这是不正确的,并且不允许我将文件的内容正确地呈现回控制台。 问题答案: 无法确定任意字节流的编码。这就是编码的本质。编码是指字节值与其表示形式之间的映射。因此,每种编码“都可以”是正确的。 的getEncoding()方法将返回

  • 问题内容: 我的软件包具有以下结构: 我不确定应如何正确写入文件。 的样子: 但是例如应该看起来如何?我的是: 什么时候应该使用? 问题答案: 很好-它有助于指导导入语句,而无需自动导入模块 http://docs.python.org/tutorial/modules.html#importing-from-a- package 使用和是多余的,仅需要 我认为在导入软件包中使用的最强大的理由之一