秒表基准测试可以接受吗?

2022-08-31 12:55:42

有没有人曾经使用过秒表基准测试,或者应该始终使用性能工具?有没有好的免费工具可用于Java?您使用什么工具?

为了澄清我的担忧,秒表基准测试可能会因操作系统调度而出错。在给定的程序运行时,操作系统可能会在您正在计时的功能中间安排另一个(或多个)进程。在Java中,如果你试图对线程化应用程序进行计时,情况甚至会更糟一些,因为JVM调度程序会给混合带来更多的随机性。

在进行基准测试时,如何解决操作系统调度问题?


答案 1

秒表基准测试很好,只要你测量足够的迭代才有意义。通常,我需要一定数量的个位数秒的总运行时间。否则,您的结果很容易因调度和流程的其他 O/S 中断而明显失真。

为此,我使用了一小套很久以前构建的静态方法,这些方法基于 .System.currentTimeMillis()

对于分析工作,我已经使用jProfiler多年,并发现它非常好。我最近查看了YourKit,从网站上看它似乎很棒,但我个人根本没有使用它。

为了回答有关调度中断的问题,我发现在实现/观察到一致性之前进行重复运行可以在实践中清除流程调度中的异常结果。我还发现线程调度对 5 到 30 秒之间的运行没有实际影响。最后,在你通过几秒钟阈值后,根据我的经验,调度对结果的影响可以忽略不计 - 我发现5秒的运行一致地与时间/迭代的5分钟运行相同。

您可能还需要考虑预运行大约 10,000 次以“预热”JIT,具体取决于您希望测试的代码在现实生活中随时间推移运行的次数。


答案 2

只要您测量足够大的时间间隔,它就是完全有效的。我将执行 20-30 次运行您打算测试的内容,以便总运行时间超过 1 秒。我注意到基于System.currentTimeMillis()的时间计算往往是0ms或~30ms;我不认为你能得到比这更精确的东西。如果你真的需要测量一个小的时间间隔,你可能想试试System.nanoTime():


推荐