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

问题描述 投票:70回答:13

有没有人使用秒表基准测试,还是应该总是使用性能工具?有没有适合Java的免费工具?你用什么工具?

为了澄清我的担忧,由于操作系统调度,秒表基准测试会出错。在程序的给定运行中,操作系统可能会在您正在计时的函数中间安排另一个(或几个)进程。在Java中,如果您尝试为线程化应用程序计时,事情会更糟糕,因为JVM调度程序会在混合中引入更多随机性。

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

java benchmarking
13个回答
48
投票

如果您测量足够的迭代以使其有意义,则秒表基准测试很好。通常,我需要一些单位数秒的总经过时间。否则,您的结果很容易因计划和您的流程的其他操作系统中断而严重扭曲。

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

对于剖析工作,我使用jProfiler多年,并发现它非常好。我最近查看了YourKit,这在网站上看起来很棒,但我个人并没有使用它。

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

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


1
投票

我今天运行了一个程序,搜索并从一堆dBase文件中收集信息,运行了一个多小时。我查看了代码,对瓶颈是什么进行了有根据的猜测,对算法进行了微小的改进,并重新运行程序,这次它在2.5分钟内完成。

我不需要任何花哨的分析工具或基准测试套件来告诉我新版本是一个重大改进。如果我需要进一步优化运行时间,我可能会做一些更复杂的分析,但这不是必需的。我发现这种“秒表基准测试”在很多情况下都是可接受的解决方案,在这些情况下使用更高级的工具实际上会更耗时。


0
投票

我不认为秒表基准测试太可怕,但如果你可以进入Solaris或OS X机器,你应该检查DTrace。我用它来获取有关我的应用程序中的时序的一些很好的信息。


0
投票

我总是使用秒表基准测试,因为它更容易。但结果并不一定非常准确。如果您需要准确的结果,那么您不应该使用秒表基准测试。


0
投票

我一直这样做。我更倾向于使用分析器,但我正在使用的特定于域的语言的供应商不提供分析器。


6
投票

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


5
投票

分析器为您提供更详细的信息,有助于诊断和修复性能问题。

在实际测量方面,秒表时间是用户注意到的,因此如果您想验证物品是否在可接受的范围内,秒表时间就可以了。

但是,当您想要实际修复问题时,分析器可能非常有用。


5
投票

秒表实际上是最好的基准!

真正的端到端用户响应时间是实际重要的时间。

使用可用的工具并不总是能够获得这个时间,例如,大多数测试工具不包括浏览器呈现页面所需的时间,因此具有错误编写的css的过复杂页面将显示测试的次秒响应时间工具,但是,5秒钟加上对用户的响应时间。

这些工具非常适合自动化测试和问题确定,但不会忽视您真正想要测量的内容。


4
投票

您需要测试实际的迭代次数,因为您将获得不同的答案,具体取决于您测试时间的方式。如果您只执行一次操作,那么采用多次迭代的平均值可能会产生误导。如果您想知道JVM预热后所花费的时间,您可能会运行许多(例如10,000次)迭代,这些迭代不包含在时序中。

我还建议你使用System.nanoTime(),因为它更准确。如果您的测试时间大约为10微秒或更短,您不希望过于频繁地调用它,或者它可能会改变您的结果。 (例如,如果我测试5秒,我想知道这个时间到了,我只会每1000次迭代得到nanoTime,如果我知道迭代非常快)


2
投票

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

在代表您将使用的机器的系统上进行足够长的基准测试。如果您的操作系统减慢了您的应用程序,那么这应该是结果的一部分。

没有必要说,如果我没有操作系统,我的程序会更快。

如果您使用的是Linux,则可以使用numactlchrttaskset等工具来控制CPU的使用方式和调度。


2
投票

分析器可以妨碍时间安排,因此我会使用秒表计时的组合来识别整体性能问题,然后使用分析器来确定花费时间的位置。根据需要重复此过程。


1
投票

毕竟,它可能是第二种最受欢迎​​的基准测试形式,就在“不看基准测试”之后 - 我们说“这项活动似乎很慢,看起来似乎很快”。

通常,优化最重要的是干扰用户体验的任何因素 - 这通常取决于您执行操作的频率,以及同时发生的其他任何事情。其他形式的基准测试通常只能帮助实现这些目标。


1
投票

我认为一个关键问题是操作的复杂性和时间长短。

我有时甚至会使用物理秒表测量来查看是否需要花费几分钟,几小时,几天甚至几周来计算(我正在使用一个应用程序,其中几天的订单运行时间并非闻所未闻,即使秒和分钟是最常见的时间跨度)。

但是,通过调用计算机上任何类型的时钟系统所提供的自动化,如链接文章中提到的java millis调用,显然优于手动查看某些内容运行的时间。

分析器很好,当它们工作时,但我在将它们应用到我们的应用程序时遇到了问题,这通常涉及动态代码生成,DLL的动态加载以及在两种内置的即时编译脚本语言中执行的工作。我的应用程序。它们通常仅限于假设单一源语言和对复杂软件的其他不切实际的期望。

© www.soinside.com 2019 - 2024. All rights reserved.