关于编写 Java HotSpot 创建者微基准测试的提示:
规则 0:阅读一篇关于JVM和微基准测试的知名论文。一个很好的是Brian Goetz,2005年。不要对微观基准期望太高;它们仅测量有限范围的 JVM 性能特征。
规则 1:始终包括一个预热阶段,该阶段将一直运行测试内核,足以在定时阶段之前触发所有初始化和编译。(在预热阶段,迭代次数越少即可。经验法则是数万次内部循环迭代。
规则 2:始终使用 、 等运行,以便您可以验证编译器和 JVM 的其他部分在计时阶段没有执行意外工作。-XX:+PrintCompilation
-verbose:gc
第2.1条规则:在计时和预热阶段的开始和结束时打印消息,以便验证在计时阶段没有来自规则 2 的输出。
规则 3:请注意 and 和 之间的区别,OSR 和常规编译。该标志报告带有 at 符号的 OSR 编译,以表示非初始入口点,例如:。首选服务器而不是客户端,常规而不是OSR,如果你追求最佳性能。-client
-server
-XX:+PrintCompilation
Trouble$1::run @ 2 (41 bytes)
规则 4:请注意初始化效果。不要在计时阶段首次打印,因为打印会加载并初始化类。不要在预热阶段(或最终报告阶段)之外加载新类,除非您专门测试类加载(在这种情况下,仅加载测试类)。规则2是您抵御此类影响的第一道防线。
规则 5:请注意去优化和重新编译的影响。不要在计时阶段第一次采用任何代码路径,因为编译器可能会基于早期的乐观假设(即根本不会使用该路径)而垃圾并重新编译代码。规则2是您抵御此类影响的第一道防线。
规则6:使用适当的工具来阅读编译器的思想,并期望对它生成的代码感到惊讶。在形成关于什么使事情更快或更慢的理论之前,自己检查代码。
规则7:减少测量中的噪声。在安静的计算机上运行基准测试,并运行多次,丢弃异常值。用于使用应用程序序列化编译器,并考虑设置以防止编译器与自身并行运行。尽量减少GC开销,设置(足够大)等于并使用UseEpsilonGC
(如果可用)。-Xbatch
-XX:CICompilerCount=1
Xmx
Xms
规则8:使用一个库作为基准测试,因为它可能更有效,并且已经为此唯一目的进行了调试。例如JMH,Caliper或Bill and Paul的Java优秀UCSD基准测试。
我知道这个问题已被标记为已回答,但我想提到两个帮助我们编写微基准的库。
入门教程
入门教程
-
如何使用Java中的RESTful Web服务获取远程/客户端IP地址? 我已经在我的项目中编写了Rest Web服务。Web服务调用可能来自不同 machine.so 我需要通过REST Web服务找出IP地址。 从这个请求.getRemoteAddr()使用这个。 但是我不能使用getRemoteAddr()。因为我的请
-
从包含大量文件的zip文件中提取1文件的最快方法是什么? 我尝试了但它们也缺少一些东西。 LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。 虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件
-
输入/输出流在销毁时是否关闭? Java 中的 InputStreams 和 OutputStreams 是否在销毁时关闭()?我完全理解这可能是不好的形式(特别是在C和C++世界中),但我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load
-
Java 程序中的字符串大小是否有任何限制? 我有一个字符串定义为 字符串 xx 我可以分配的字符数是否有任何限制? 2) 我正在将用户输入分配给此字符串 xx。70%的人只说一个字。有时他们给出一个大句子,所以想知道可
-