我正在尝试对在各种硬件和操作系统平台上运行的JVM进行一些基准测试。我已经创建了一个算法来训练JVM中我感兴趣的部分,并打算多次运行这个算法来找到一个像样的平均值。
当我运行基准测试时,我发现第一次运行比后续运行要长得多:
132ms
86ms
77ms
89ms
72ms我的怀疑是类的装入很慢,在第一次运行时会产生很大的开销。虽然这确实是我认为每个JVM都独一无二的特性,但目前我对此并不感兴趣。
是否有一个标准的命令行选项或属性来急切地装入类?或者还有没有其他的理论?
发布于 2009-03-01 10:26:59
最简单的做法是忽略第一次运行。(如果这样做是合理的)注意:如果您运行相同的代码10,000次,它将进一步编译代码,您将获得更好的结果,因此您可能希望忽略某些微基准测试的前10K结果。
一些JVM支持即时加载,但我不认为Sun的JVM支持。
JWrapper支持AOT https://www.jwrapper.com/features
发布于 2009-03-01 16:33:00
如果您想强制加载类,请执行以下操作:
public class Main
{
static
{
loadClasses();
}
public static void main(final String[] argv)
{
// whatever
}
private static void loadClasses()
{
final String[] classesToLoad;
// even better, read them from a file and pass the filename to this method
classesToLoad = new String[]
{
"foo.bar.X",
"foo.bar.Y",
}
for(final String className : classesToLoad)
{
try
{
// load the class
Class.forName(className);
}
catch(final ClassNotFoundException ex)
{
// do something that makes sense here
ex.printStackTrace();
}
}
}
}发布于 2009-03-01 13:23:20
Java基准测试的第一条规则:一个方法运行的前15000次(大约)并不有趣。
这个帖子包含一些可靠的建议:How do I write a correct micro-benchmark in Java?
https://stackoverflow.com/questions/599602
复制相似问题