JMH 给出繁忙的吞吐量值
JMH gives hectic throughput values
我 运行宁 some benchmarks 和 JMH 在一起,我得到每次迭代的繁忙吞吐量值,有时会有 +/- 50% 的差异。 (i7 4770K,Windows 7 x64,Java 1.8u31,JMH 0.9 - 无法升级)。由于对整数进行装箱和拆箱并且大量使用同步块,基准测试会产生大量垃圾。将迭代 运行 时间从 1 秒增加到 5 秒会产生更小的方差。
我的问题是:
- 我怎样才能发现这种差异的来源?
- 为什么我有时会在预热期间获得明显更高的吞吐量值?
如果你可以使用 0.9.1+ 版本,你应该看看添加到 JMH 的 perfasm
分析器。它允许您将代码的汇编映射到每条指令所花费的时间。但是,它会要求您使用 Linux 框,因为它使用 perf
命令。
除此之外,您的基准测试允许进行相当多的优化,但我认为这是有意为之的。您不会通过黑洞消耗最终结果,但您选择在某些处理之间消耗数据位。这种方法很容易出错,因此我建议您无论如何都要真正查看它产生的汇编代码,这样您就可以知道您正在测量的是什么!
我 运行宁 some benchmarks 和 JMH 在一起,我得到每次迭代的繁忙吞吐量值,有时会有 +/- 50% 的差异。 (i7 4770K,Windows 7 x64,Java 1.8u31,JMH 0.9 - 无法升级)。由于对整数进行装箱和拆箱并且大量使用同步块,基准测试会产生大量垃圾。将迭代 运行 时间从 1 秒增加到 5 秒会产生更小的方差。
我的问题是:
- 我怎样才能发现这种差异的来源?
- 为什么我有时会在预热期间获得明显更高的吞吐量值?
如果你可以使用 0.9.1+ 版本,你应该看看添加到 JMH 的 perfasm
分析器。它允许您将代码的汇编映射到每条指令所花费的时间。但是,它会要求您使用 Linux 框,因为它使用 perf
命令。
除此之外,您的基准测试允许进行相当多的优化,但我认为这是有意为之的。您不会通过黑洞消耗最终结果,但您选择在某些处理之间消耗数据位。这种方法很容易出错,因此我建议您无论如何都要真正查看它产生的汇编代码,这样您就可以知道您正在测量的是什么!