2013-04-17 42 views
0

我想优化一个朋友给我的代码块,但是我的平均执行时间的基线非常不稳定,我失去了为什么/如何修复它。C函数的平均执行时间不稳定

代码:

#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 64
  • 7.8吉布RAM
  • 英特尔酷睿i7-3770 CPU @ 3.40GHz×8
  • 的GeForce GT 620 /的PCIe/SSE2

编辑

谢谢大家的意见,但我决定用gprof来代替构建我自己的。再一次感谢你!

+1

虽然测试基准确实是针对您所运行的硬件和操作系统的,但它更依赖于您所使用的代码 评估。在这种情况下,我们无法看到该代码。我会问,是否有任何文件IO发生。 –

+1

整个循环的时间如何? – nhahtdh

+5

'timeval'结构的'tv_usec'成员包含当前时间的微秒部分,而不是自Epoch起的微秒数。您不是在测量执行时间,而是在采样微秒部分。观察到的价值分布是非常正常的(没有双关意图)。 –

回答

1

这里有几个问题,包括零基准测试代码的详细信息,以及您使用“gettimeofday()”的错误(也许不正确)。

几点建议:

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

+0

感谢您使用gprof指向正确的方向! :) – centip3de

5

你的线路int ret = tv.tv_usec; /* Finishing time */不会给你完成时间,它仍然是开始时间。你应该做第二个struct timeval,请拨打gettimeofday并比较两者。

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

+0

我只是点击“提交”...发现你也发布了,基本上说完全一样的东西。 +1:我完全同意所有观点。恕我直言... – paulsm4

+0

尽管如此,发现gettimeofday()的文章令人沮丧。 ;) – Kninnug

+0

使用'clock()'可能有点棘手,因为结果取决于操作系统。在大多数Unix系统上,它返回使用的CPU时间,而不是经过的挂钟时间,但在Windows上它返回挂钟时间。因此,我们应该使用'clock_gettime(CLOCK_REALTIME,&tp);'',其中'tp'是'struct timespec'。 –