JMH实验什么时候应该设置GC为True?

When should GC be set True in JMH experiments?

我从 Whosebug post 了解到不建议将 GC 设置为 true,因为它会删除 GC 试探法。但是我想知道 GC 应该设置为 True 的场景。

例如,我有一个基准方法如下

@Benchmark
public int test(int a, int b){
   return a + b
}

如果我想专门测量test(5,6)的执行情况。为了避免 JIT 记住相同输入的结果,我将 GC 设置为 True,以便在每次迭代后强制 GC 擦除 return 值。

这是设置 GC True 的有效方案吗?


非常感谢您指出示例无法 运行。是的,我只是编造了一个开始转换来谈谈什么是开启GC的有效场景。 我不打算使用“@State”,因为我可能还想测量 test(665,666)。我愿意将它们声明为参数并从 Java CLI 中获取它们的值。

由于这个虚构的例子,转换被拖离了主题。所以它是这样的:应该打开GC的JMH实验是什么?

你想做的事情并不像你想的那样有效,也与 GC 没有任何关系。在您的情况下,JIT 优化和 GC 不相关。我想你最好的办法是了解你犯了什么错误,以及如何通过 JMH 的样本。有关有趣的内容,请参阅 this,它解释了错误的基准代码设置如何导致错误的结果,它以某种方式触及了您的观点。

如果你想衡量 a + b 需要什么,而没有 JIT 的偏见,那么你要做的就是正确设置 JMH 而不是禁用垃圾收集,无论如何都无济于事。

通常,您应该在测试中考虑 GC 时间,imo - 因为无论暂停(如果有的话),由于您的分配,它本身就是基准测试的一部分。另一方面,如果您想在没有任何 GC 影响的情况下测量时间,请查看 Epsilon GC,它确实是这样做的:它 什么都不做 。最后一点是 ab 必须由 JMH 框架传递给您的 @Benchmark 方法:阅读更多关于 @State.[=26 的内容=]

如果你能阅读示例就更好了 here (I would say at least the first 10 of them) and understand that you might test entirely unexpected things, like computation of a constant versus a real summation. Specifically, I think that you will benefit reading this example and and this one about constant folding