有人使用秒表基准测试吗?或者说性能工具总是应该被使用?是否有适用于Java的好的免费工具?你使用哪些工具呢?
为了澄清我的疑虑,秒表基准测试存在由于操作系统调度而产生的误差。在程序运行的某次中,操作系统可能会在你计时的函数执行期间调度另一个进程(或多个进程)。如果你尝试对线程化的Java应用程序进行计时,情况甚至会更加糟糕,因为JVM调度器会将一点不确定性添加到混合中。
在基准测试过程中,如何解决操作系统调度问题?
有人使用秒表基准测试吗?或者说性能工具总是应该被使用?是否有适用于Java的好的免费工具?你使用哪些工具呢?
为了澄清我的疑虑,秒表基准测试存在由于操作系统调度而产生的误差。在程序运行的某次中,操作系统可能会在你计时的函数执行期间调度另一个进程(或多个进程)。如果你尝试对线程化的Java应用程序进行计时,情况甚至会更加糟糕,因为JVM调度器会将一点不确定性添加到混合中。
在基准测试过程中,如何解决操作系统调度问题?
秒表基准测试很好,只要你测量了足够的迭代次数才具有意义。通常,我需要一段单位为几秒钟的总经过时间。否则,你的结果很容易受到调度和其他操作系统中断对进程的影响而产生显著偏差。
为此,我使用了一组我很久以前构建的小型静态方法,这些方法是基于System.currentTimeMillis()
。
在分析工作中,我多年来一直使用jProfiler,发现它非常好用。最近,我看过YourKit,从网站上看似乎很棒,但我个人还没有使用过。
回答有关调度中断的问题,我发现重复运行直到观察到一致性实践中可用于清除进程调度中异常结果。我也发现线程调度对于5到30秒的运行没有实际影响。最后,在你越过几秒钟阈值之后,我发现调度在我的经验中对结果的影响微不足道 - 我发现5秒的运行平均与5分钟的运行时间/迭代相同。
你也可以考虑预运行测试代码约10,000次以“热身”JIT,这取决于你期望测试代码在实际生产中运行的次数。
秒表实际上是最好的基准!
真正的端到端用户响应时间才是真正重要的时间。
通常情况下,使用现有工具无法获得此时间,例如大多数测试工具不包括浏览器呈现页面所需的时间,因此对于具有糟糕编写CSS的超复杂页面,测试工具将显示低于一秒的响应时间,但实际用户响应时间可能超过5秒。
这些工具非常适用于自动化测试和问题确定,但不要忘记您真正想要测量的内容。
性能分析器可以提供更加详细的信息,有助于诊断和解决性能问题。
就实际测量而言,秒表时间是用户所注意到的,因此如果您想要验证事物是否在可接受的限制范围内,秒表时间是可以的。
然而,当您真正想要解决问题时,性能分析器可以非常有帮助。
性能分析器可能会干扰计时,因此我建议使用秒表计时来识别整体性能问题,然后再使用性能分析器找出时间花费在哪里。如有需要,请重复该过程。
毕竟,它可能是第二受欢迎的基准测试形式,仅次于“无表观测基准测试”——我们说“这个活动似乎很慢,那个似乎很快。”
通常最重要的优化是干扰用户体验的任何因素——这往往取决于您执行操作的频率以及同时进行的其他操作。其他形式的基准测试通常只是帮助聚焦于这些问题。
我认为一个关键问题是操作的复杂性和时间长度。
有时候,我甚至使用物理秒表测量来判断某个操作需要几分钟、几小时、几天,甚至几周才能完成(我正在处理的应用程序中,运行时间长达数天并不罕见,尽管秒和分钟是最常见的时间跨度)。
然而,通过调用计算机上任何类型的时钟系统(如链接文章中提到的Java millis调用)所提供的自动化功能,显然比手动查看运行时间更优越。
分析器很好用,但当它们无法正常工作时,我就会遇到问题。我们的应用程序通常涉及动态代码生成、DLL的动态加载以及在应用程序的两种内置即时编译脚本语言中执行的工作。它们往往只能假设单一源语言和其他对于复杂软件不切实际的期望。