首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免jvm预热

避免jvm预热
EN

Stack Overflow用户
提问于 2010-12-03 21:31:20
回答 4查看 5.1K关注 0票数 9

如果我正在设计一个关于排序算法的测试,我可以这样做以避免JVM预热吗?谢谢!

代码语言:javascript
运行
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-03 21:34:07

JVM预热通常指的是JVM查找热点和JIT这些代码部分所需的时间。如果你运行你的实际测试几百次(实际上我相信是几千次),你应该可以运行的相当好。

然而,你应该知道,即使你这样做了,也不能保证。您必须试验您的特定JVM,以弄清楚在关键部分被JITed等之前必须做多少工作。

this little case study中,在1700次调用之后开始进行即时编译。

票数 8
EN

Stack Overflow用户

发布于 2010-12-03 22:16:30

如果我正在设计一个关于排序算法的测试,我可以这样做以避免JVM预热吗?

先说些卖弄学问的话。您不应该避免JVM预热。这是必须要发生的。您要做的是防止JVM预热扭曲您的基准测试结果。

为了回答你的问题,这种方法大体上是正确的,但很难预测在初始循环中需要进行多少次测试。这很可能取决于测试代码、JVM版本和JVM调优参数……除此之外,可能还有其他事情。

我通常做的就是打印原始的计时,过滤掉初始的“热身”迭代,“用眼睛”看起来有异常的计时值,然后手工计算平均值。它很笨拙,但它给了我一些信心,我已经考虑到了预热和其他可能的异常来源。

票数 4
EN

Stack Overflow用户

发布于 2010-12-04 00:12:59

这是一个非常大的领域,但这里有几个提示:

1)确保您的完整测试(包括迭代循环)位于重复调用的子例程中。因此,您的测试在"parent“方法中有for()循环。将它下推到一个“孩子”,并重复调用它。这使得各种即时技术可以真正进行全面的优化,而不必进行动态代码替换(dynamic loop transfer等)。

2)确保测试在长时间预热后长时间运行。如果可能的话,在同样长的热身之后,实际测量期的最短时间是30秒。例如,SPECjbb等。对于多次迭代,每次迭代运行几分钟。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4345999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档