是否有人曾经使用秒表基准测试,还是应该一直使用性能工具?是否有适用于Java的良好免费工具?您使用什么工具?
为了澄清我的担忧,秒表基准测试会因操作系统调度而出错。在给定的程序运行中,操作系统可能会在您要计时的功能中间安排另一个(或几个)进程。在Java中,如果您想定时一个线程化的应用程序,情况会变得更糟,因为JVM调度程序将更多的随机性引入了混合中。
基准测试时如何处理操作系统调度?
Answers:
只要您测量足够有意义的迭代,秒表基准测试就可以了。通常,我需要的总经过时间为几位数的秒数。否则,您的结果很容易因计划安排和流程的其他O / S中断而明显偏斜。
为此,我使用了很久以前基于的一些静态方法System.currentTimeMillis()
。
对于分析工作,我使用jProfiler已经很多年了,并且发现它非常好。最近,我查看了YourKit,它在WebSite上看起来不错,但是我个人还没有使用过它。
为了回答有关计划中断的问题,我发现重复执行直到达到一致性/在实践中观察到的工作才能清除流程计划中的异常结果。我还发现线程调度对于5到30秒的运行没有实际影响。最后,根据我的经验,经过几秒钟后,阈值计划对结果的影响可以忽略不计-我发现5秒钟的运行时间和迭代5分钟的运行时间平均相同。
您可能还需要考虑将测试的代码预运行约10,000次以“热身” JIT,具体取决于您希望测试的代码在现实生活中随着时间的推移而运行的次数。
只要您测量足够大的时间间隔,它就完全有效。我将执行20-30次您打算测试的运行,以使总经过时间超过1秒。我注意到基于System.currentTimeMillis()的时间计算通常为0ms或〜30ms;我认为您没有比这更精确的方法了。如果您确实需要测量一个小的时间间隔,则可能需要尝试System.nanoTime():
探查器为您提供了更详细的信息,可以帮助诊断和修复性能问题。
就实际测量而言,秒表时间是用户注意到的,因此,如果您要验证事情是否在可接受的范围内,秒表时间就可以了。
但是,当您要实际解决问题时,探查器可能会非常有用。
我认为关键问题是手术的复杂性和时间长度。
有时,我什至使用物理秒表测量来查看是否需要花费几分钟,几小时,几天甚至几周的时间来计算(我正在使用的应用程序即使在数秒和数分钟的时间里也不会闻闻几天的运行时间最常见的时间跨度)。
但是,通过调用计算机上任何类型的时钟系统(如链接的文章中提到的java millis调用)所提供的自动化明显优于手动查看某项运行了多长时间。
探查器在工作时很好用,但是我在将它们应用到我们的应用程序时遇到了问题,通常涉及动态代码生成,DLL的动态加载以及使用两种内置的即时编译脚本语言进行的工作。我的应用程序。它们通常仅限于假设单一的源语言以及对复杂软件的其他不切实际的期望。
今天,我运行了一个程序,该程序从一堆dBase文件中搜索并收集了信息,运行只花了一个多小时。我看了一下代码,对瓶颈问题进行了有根据的猜测,对算法进行了小幅改进,然后重新运行了程序,这次它在2.5分钟内完成了。
我不需要任何精美的性能分析工具或基准套件就可以告诉我新版本是一项重大改进。如果需要进一步优化运行时间,我可能会做一些更复杂的分析,但这不是必需的。我发现在许多情况下,这种“秒表基准测试”是可以接受的解决方案,在这些情况下,诉诸更高级的工具实际上会更加耗时。