C中的性能/分析测量

时间:2010-01-13 09:43:23

标签: c performance profiling

我正在用C做一些原型制作工作,我想比较一个程序完成各种小修改所需的时间。

我一直在使用clock;来自K& R:

  

clock返回自执行开始以来程序使用的处理器时间,如果不可用则返回-1

这对我来说似乎很明智,并且一直在给出与我的期望大致相符的结果。但是,有什么更好的方法可以用来查看哪些修改会改善/恶化我的代码效率?

更新:我对Windows和Linux感兴趣;对两者都有效的东西是理想的。

更新2:我对分析复杂问题不感兴趣,而不是从开始到结束用于简单程序的总运行时间/时钟周期 - 我已经知道程序的哪些部分很慢。 clock似乎符合这个法案,但我不知道它有多么容易受到攻击,例如,在后台运行的其他进程和占用处理器的时间。

5 个答案:

答案 0 :(得分:4)

忘记time()函数,你需要的是:

<强> Valgrind!

而KCachegrind是用于检查callgrind性能分析统计数据的最佳gui。在过去,我已经将应用程序移植到linux 只是,所以我可以使用这些工具进行分析。

答案 1 :(得分:2)

对于整体运行时间的粗略测量,有time ./myprog

但对于性能测量,您应该使用分析器。对于海湾合作委员会,有gprof

这是假设Unix-ish环境。我确信Windows有类似的工具,但我不熟悉它们。

编辑:为了澄清:我建议您使用代码中的任何gettime()样式函数来提示 。 Profilers已经发展了数十年,可以完成五行代码所要完成的工作,并提供更强大,通用,有价值且更加万无一失的方法来查找代码在其周期中所花费的位置。

答案 2 :(得分:1)

在POSIX中(例如在Linux上),您可以使用gettimeofday()来获得更高精度的计时值(微秒)。

在Win32中,QueryPerformanceCounter()很受欢迎。

请注意CPU时钟更改效果,如果CPU在测试期间决定倒计时,结果可能会出现偏差。

答案 3 :(得分:1)

我发现计时程序和寻找优化的东西是两个不同的问题,对于他们两个我个人更喜欢低技术。

对于计时,诀窍是通过在其周围缠绕循环使其花费足够长的时间。例如,如果您将操作迭代1000次并使用秒表计时,则在移除循环时秒将变为毫秒。

为了找到要优化的东西,有一些代码(终端指令和函数调用)负责各个时间段。在此期间,它们暴露在堆栈中。因此,您可以在程序周围循环以使其花费足够长的时间,然后使用stackshots。优化的代码会跳出来。

答案 4 :(得分:0)

如果您可以使用POSIX功能,请查看clock_gettime。我在快速谷歌搜索中找到了an example如何使用它。要测量程序所用的处理器时间,如果系统支持,则需要将CLOCK_PROCESS_CPUTIME_ID作为clock_gettime的第一个参数传递给clock_gettime。由于{{1}}使用struct timespec,您可能会获得有用的纳秒分辨率。

正如其他人所说,对于任何严肃的剖析工作,您将需要使用专用的剖析器。