如果我正在设计一个关于排序算法的测试,我可以这样做以避免JVM预热吗?谢谢!
double count = 0;
double start, end;
for(int r = 0; r < warmup; r++) {
// do test
}
for(int t = 0; t < runs; t++){
start = System.nanoTime();
// do test
end = System.nanoTime();
count += start - end;
}
double avg = count/avg
发布于 2010-12-03 13:34:07
JVM预热通常指的是JVM查找热点和JIT这些代码部分所需的时间。如果你运行你的实际测试几百次(实际上我相信是几千次),你应该可以运行的相当好。
然而,你应该知道,即使你这样做了,也不能保证。您必须试验您的特定JVM,以弄清楚在关键部分被JITed等之前必须做多少工作。
在this little case study中,在1700次调用之后开始进行即时编译。
发布于 2010-12-03 14:16:30
如果我正在设计一个关于排序算法的测试,我可以这样做以避免JVM预热吗?
先说些卖弄学问的话。您不应该避免JVM预热。这是必须要发生的。您要做的是防止JVM预热扭曲您的基准测试结果。
为了回答你的问题,这种方法大体上是正确的,但很难预测在初始循环中需要进行多少次测试。这很可能取决于测试代码、JVM版本和JVM调优参数……除此之外,可能还有其他事情。
我通常做的就是打印原始的计时,过滤掉初始的“热身”迭代,“用眼睛”看起来有异常的计时值,然后手工计算平均值。它很笨拙,但它给了我一些信心,我已经考虑到了预热和其他可能的异常来源。
发布于 2010-12-03 16:12:59
这是一个非常大的领域,但这里有几个提示:
1)确保您的完整测试(包括迭代循环)位于重复调用的子例程中。因此,您的测试在"parent“方法中有for()循环。将它下推到一个“孩子”,并重复调用它。这使得各种即时技术可以真正进行全面的优化,而不必进行动态代码替换(dynamic loop transfer等)。
2)确保测试在长时间预热后长时间运行。如果可能的话,在同样长的热身之后,实际测量期的最短时间是30秒。例如,SPECjbb等。对于多次迭代,每次迭代运行几分钟。
https://stackoverflow.com/questions/4345999
复制