有没有人使用秒表基准测试,还是应该始终使用性能工具?有没有适合Java的免费工具?你使用什么工具?
为了澄清我的担忧,由于操作系统调度,秒表基准测试会出错。在程序的给定运行中,操作系统可能会在您正在计时的函数中间安排另一个(或几个)进程。在Java中,如果您尝试为线程化应用程序计时,事情会更糟糕,因为JVM调度程序会在混合中投入更多随机性。
在基准测试时如何解决操作系统调度问题?
答案 0 :(得分:48)
如果你测量足够的迭代是有意义的,那么秒表基准测试就没问题了。通常,我需要一些单位数秒的总经过时间。否则,您的结果很容易因计划安排以及您的流程的其他操作系统中断而受到严重影响。
为此,我使用了很久以前构建的一组静态方法,这些方法基于System.currentTimeMillis()
。
对于我使用jProfiler多年的分析工作并发现它非常好。我最近查看了YourKit,这在网站上看起来很棒,但我个人并没有使用它。
为了回答关于调度中断的问题,我发现重复运行直到实现/观察到一致性,在实践中用于清除过程调度的异常结果。我还发现线程调度对5到30秒之间的运行没有实际影响。最后,根据我的经验,在经过几秒钟后,阈值调度对结果的影响可以忽略不计 - 我发现5秒运行的时间和迭代的运行时间平均为5分钟。
您可能还需要考虑预先运行测试代码大约10,000次以“预热”JIT,具体取决于您希望测试代码在现实生活中随时间运行的次数。
答案 1 :(得分:6)
只要您测量足够大的时间间隔,它就完全有效。我会执行20-30次运行您想要测试的内容,以便总耗用时间超过1秒。我注意到基于System.currentTimeMillis()的时间计算往往是0ms或~30ms;我认为你不能得到更精确的东西。如果您确实需要测量一小段时间间隔,可能需要尝试使用System.nanoTime():
答案 2 :(得分:5)
分析器为您提供更详细的信息,有助于诊断和修复性能问题。
在实际测量方面,秒表时间是用户注意的,所以如果你想验证物品是否在可接受的范围内,秒表时间就可以了。
但是,当您想要实际修复问题时,分析器可能非常有用。
答案 3 :(得分:5)
秒表实际上是最好的基准!
真正的最终用户响应时间是实际重要的时间。
使用可用的工具并不总是可以获得这个时间,例如大多数测试工具不包括浏览器呈现页面所需的时间,因此具有写得不好的css的过复杂页面将显示次秒响应时间到测试工具,但是,5秒加上对用户的响应时间。
这些工具非常适合自动化测试和问题确定,但不会忽视您真正想要测量的内容。
答案 4 :(得分:4)
您需要测试实际的迭代次数,因为您将根据测试时间的方式得到不同的答案。如果您只执行一次操作,那么采用多次迭代的平均值可能会产生误导。如果您想知道JVM预热后所花费的时间,您可能会运行许多(例如10,000次)迭代,这些迭代不会包含在时间中。
我还建议您使用System.nanoTime()
,因为它更准确。如果您的测试时间大约为10微秒或更短,您不希望过于频繁地调用它,或者它可能会改变您的结果。 (例如,如果我测试的话说5秒,我想知道这个时间到了,我每1000次迭代只得到nanoTime,如果我知道迭代很快的话)
答案 5 :(得分:2)
Profilers会妨碍时间安排,所以我会结合使用秒表计时来识别整体性能问题,然后使用分析器来确定花费时间的地方。根据需要重复该过程。
答案 6 :(得分:2)
在基准测试时如何解决操作系统调度问题?
在代表您将使用的机器的系统上足够长的基准。如果您的操作系统减慢了您的应用程序,那么这应该是结果的一部分。
没有必要说,如果我没有操作系统,我的程序会更快。
如果您使用的是Linux
,则可以使用numactl
,chrt
和taskset
等工具来控制CPU的使用方式和日程安排。
答案 7 :(得分:1)
我今天运行了一个程序,搜索并从一堆dBase文件中收集信息,运行时间超过一小时。我查看了代码,对瓶颈是什么进行了有根据的猜测,对算法进行了一些小改进,并重新运行程序,这次它在 2.5分钟完成。
我不需要任何花哨的分析工具或基准测试套件来告诉我新版本是一个重大改进。如果我需要进一步优化运行时间,我可能会做一些更复杂的分析,但这不是必需的。我发现这种“秒表基准测试”在很多情况下都是可接受的解决方案,在这些情况下使用更高级的工具实际上会更耗时。
答案 8 :(得分:1)
毕竟,它可能是第二种最受欢迎的基准测试形式,就在“不看基准测试”之后 - 我们说“这项活动似乎很慢,看起来很快。”
通常,优化最重要的是干扰用户体验的任何因素 - 这通常取决于您执行操作的频率,以及同时发生的其他任何事情。其他形式的基准测试通常只能帮助实现这些目标。
答案 9 :(得分:1)
我认为一个关键问题是操作的复杂性和时间长短。
我有时甚至会使用物理秒表测量来查看是否需要几分钟,几小时,几天甚至几周的时间来计算(我正在使用一个应用程序,其中几天的订单运行时间并非闻所未闻,即使秒数分钟是最常见的时间跨度)。
然而,通过调用计算机上任何类型的时钟系统所提供的自动化,如链接文章中提到的java millis调用,显然优于手动查看某些内容的运行时间。
Profilers很好,当它们工作时,但我在将它们应用到我们的应用程序时遇到了问题,这通常涉及动态代码生成,DLL的动态加载以及在两个内置的即时编译中执行的工作我的应用程序的脚本语言。它们通常仅限于假设单一源语言和对复杂软件的其他不切实际的期望。
答案 10 :(得分:0)
我总是使用秒表基准测试,因为它更容易。但结果并不一定非常准确。如果您需要准确的结果,则不应使用秒表基准测试。
答案 11 :(得分:0)
我不认为秒表基准测试太可怕,但如果你可以进入Solaris或OS X机器,你应该检查DTrace。我用它来获取有关我的应用程序中的时序的一些很好的信息。
答案 12 :(得分:0)
我一直这样做。我更倾向于使用分析器,但我正在使用的特定领域语言的供应商不提供分析器。