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
,它确实是这样做的:它 什么都不做 。最后一点是 a
和 b
必须由 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。
我从 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
,它确实是这样做的:它 什么都不做 。最后一点是 a
和 b
必须由 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。