可能的重复:
最小化Java“热身”时间的技术或实用程序?
我知道 JVM 需要一段时间来“热身”,具体取决于代码大小。我的问题是:程序员有没有办法通过以某种方式指定代码的可能部分来帮助它加速“热身”过程?
可能的重复:
最小化Java“热身”时间的技术或实用程序?
我知道 JVM 需要一段时间来“热身”,具体取决于代码大小。我的问题是:程序员有没有办法通过以某种方式指定代码的可能部分来帮助它加速“热身”过程?
您可以通过多次调用代码来间接地进行。默认-xx:CompileThreshold=
值为 10000。因此您可以多次调用关键代码,例如 12,000 次。
您可以降低编译阈值,但您仍然有同样的问题,只是循环可以说是 1000 而不是 10000。
您想要预热代码的一个原因是对其进行优化,但如果您缩短迭代次数,则可能无法执行某些优化并且您可以获得次优调用(但并非总是如此)
再一次,如果您预热代码是一种不具有代表性的方式,它可以以次优方式对其进行优化,并且 JVM 可能会决定稍后重新优化它。
developerWorks 上有一篇关于 Java 中的微观性能测量的非常好的文章。它还涵盖了“热身”和其他相关内容的主题。作者在 Java 中实现了一个相当不错的微基准测试框架。该框架还处理 JVM 的预热阶段,并尝试在实际测试开始之前加速并完成它。该框架的源代码也是可用的,因此您可以看看它是如何实现的。
您可能需要考虑提前编译器,例如 gcj,它允许您在构建应用程序时将一组类编译为本机代码,并且只在虚拟机中运行运行时加载的类。编译完成后的性能不太好(特别是如果您在运行时加载的代码上花费大量时间),但对于运行时间较短的程序,预编译的好处不仅仅是抵消了这一点。