java在JMH实验中GC什么时候应该设置为真
我从StackOverflow帖子中读到,不建议将GC设置为true,因为它会删除GC启发式。但是我想知道GC应该设置为True的场景
例如,我有一个基准测试方法,如下所示
@Benchmark
public int test(int a, int b){
return a + b
}
如果我想具体衡量测试(5,6)的执行情况。为了避免JIT记住相同输入的结果,我将GC设置为True,这样在每次迭代后,返回值都会被强制GC擦除
这是设置GC为真的有效方案吗
非常感谢您指出该示例无法运行。是的,我只是做了一个转换来讨论什么是打开GC的有效方案。
我不打算使用“@State”,因为我可能还想测量test(665,666)
。我愿意将它们声明为参数,并从Java CLI获取它们的值
由于这个虚构的例子,转换被从主题中拖走了。下面是:应该打开GC的JMH实验是什么
# 1 楼答案
你想做的事情与你想象的不一样,也与
GC
无关。在您的例子中,JIT
优化和GC
是不相关的。我想你最好的办法是了解你错了什么,以及如何通过JMH
的样本。关于一个有趣的例子,请参见this,它解释了错误的基准代码设置如何导致错误的结果,它在某种程度上触及了您的观点如果你想测量
a + b
所做的事情,而不带JIT
的偏见,那么你要做的是正确地设置JMH
而不是禁用垃圾收集,这无论如何都不会有帮助总的来说,你应该在测试中考虑GC时间,imo——因为无论暂停(如果有)是什么,它本身就是基准的一部分,这是由于你的分配。另一方面,如果你想在没有任何GC影响的情况下测量时间,看看
Epsilon GC
,它确实做到了:它什么都不做。最后一点是a
和b
必须通过JMH
框架传递给@Benchmark
方法:阅读更多关于@State
的内容如果你阅读样本here(我至少会说前10个),并理解你可能会测试完全出乎意料的事情,比如计算a
constant
与实际总和,那就更好了。具体来说,我认为阅读this example和and this one about constant folding会让你受益匪浅