还有比计时更好的基准测试方法吗?



我正在编写一个小程序,它必须对一个大数组(多达400万个文本字符串)进行排序。似乎我在这方面做得很好,因为radixsort和归并排序的组合已经将原来的q(快速)排序执行时间缩短了不到一半。

执行时间是主要的点,因为这是我用来基准测试我的代码。

我的问题是:

是否有更好(即更可靠)的方法来对程序进行基准测试,而不仅仅是对执行时间进行计时?它可以工作,但是相同的程序(运行相同的后台进程)如果运行两次,通常会有稍微不同的执行时间。

这有点违背了检测小改进的目的。几个小的改进加起来就是一个大的改进……

提前感谢任何输入!

结果:

我设法让gprof在Windows下工作(使用gcc和MinGW)。与我的普通编译器(tcc)相比,GCC的表现很差(考虑到执行时间),但它给了我一些见解。

尝试分析工具,它还将显示程序在何处花费时间。gprof是经典的C分析工具,至少在Unix上是这样。

查看时间命令。它跟踪进程使用的CPU时间和挂钟时间。您还可以使用像gprof这样的工具来分析代码,以找到程序中实际花费时间最多的部分。您可以在代码中使用计时器进行低技术版本的分析。Boost有一个很好的定时器类,但是您自己也很容易使用。

我认为仅仅衡量一段代码的执行时间是不够的。您的环境是不断变化的,因此您必须采用统计方法来测量执行时间。

本质上,您需要采取N测量,丢弃异常值,并计算平均值,中位数和标准偏差运行时间,不确定度测量。

这里有一个很好的博客解释了为什么和如何这样做(用代码):http://blogs.perl.org/users/steffen_mueller/2010/09/your-benchmarks-suck.html

到目前为止,您使用什么来计时执行时间?首先,在time.h中有C89 clock()。在unix系统上,您可能会发现getitimer()对应ITIMER_VIRTUAL来测量进程CPU时间。有关详细信息,请参阅相应的手册页。

您还可以使用POSIX shell的times实用程序对进程及其子进程使用的处理器时间进行基准测试。分辨率依赖于系统,就像分析一样。试着把你的C代码包装在一个循环中,尽可能多地执行它,以减少基准测试报告时间内的"抖动"。

从测试工具中调用您的例程,因此它执行N + 1次。忽略第一次迭代的时间,然后取迭代1..N的平均值。忽略第一次的原因是,由于各种影响,例如虚拟内存、被分页的代码等,它通常会略微膨胀。平均N次迭代的原因是,您可以摆脱由其他进程,调度程序等引起的工件。

如果您运行在Linux或类似的系统上,您可能还希望使用taskset将代码固定到特定的CPU核心(假设它是单线程的),理想情况下不是核心0,因为这倾向于处理所有中断。

最新更新