C函数的平均执行时间不稳定

时间:2013-04-17 22:34:46

标签: c linux time execution-time

我试图优化朋友给我的一大块代码,但我的平均执行时间的基线非常不稳定,我迷失了为什么/如何修复它。

代码:

#include <sys/time.h>
#include <time.h>
#include <stdio.h>
#include "wall.h" /* Where his code is */

int main()
{
    int average;
    struct timeval tv;
    int i;

    for(i = 0; i < 1000; i++) /* Running his code 1,000 times */
    {
        gettimeofday(&tv, NULL); /* Starting time */ 

        start(); /* Launching his code */ 

        int ret = tv.tv_usec; /* Finishing time */ 
        ret /= 1000; /* Converting to milliseconds */ 
        average += ret; /* Adding to the average */ 
    }
    printf("Average execution time: %d milliseconds\n", average/1000);  
    return 0;
}

输出5个不同的运行:

  • 804毫秒
  • 702毫秒
  • 394毫秒
  • 642毫秒
  • 705毫秒

我尝试了多种不同的方法来获得平均执行时间,但每个方法都没有给我一个足够精确的答案或给我一个完全不稳定的答案。我迷失了现在该做什么,任何帮助都将不胜感激!

我知道这些类型的基准测试非常依赖于系统,所以我在下面列出了我的系统规格:

  • Ubuntu 12.10 x64
  • 7.8 GiB RAM
  • Intel Core i7-3770 CPU @ 3.40GHz x 8
  • GeForce GT 620 / PCIe / SSE2

修改

谢谢大家的意见,但我决定选择gprof而不是构建自己的。再一次谢谢你!

2 个答案:

答案 0 :(得分:5)

你的专栏int ret = tv.tv_usec; /* Finishing time */没有给你完成时间,它仍然是开始时间。你应该再做一次struct timeval,用它来调用gettimeofday并比较两者。

但是,使用clock()可能更容易。当然,如果您想真正分析代码的性能,请使用profiler

答案 1 :(得分:1)

这里有几个问题,包括你正在进行基准测试的代码的零细节,以及你正在使用“gettimeofday()”错误(并且可能是不恰当的)。

SUGGESTIONS:

1)不要使用“gettimeofday()”:

http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time

2)用gprof补充你的“经过的时间”:

http://www.cs.duke.edu/~ola/courses/programming/gprof.html