0

我正在尝试优化朋友给我的一段代码,但我的平均执行时间基准非常不稳定,我不知道为什么/如何修复它。

代码:

#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 内存
  • 英特尔酷睿 i7-3770 CPU @ 3.40GHz x 8
  • GeForce GT 620/PCIe/SSE2

编辑

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

4

2 回答 2

5

您的线路int ret = tv.tv_usec; /* Finishing time */没有给您完成时间,它仍然是开始时间。你应该做第二个struct timeval,用那个打电话gettimeofday并比较两者。

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

于 2013-04-17T22:40:38.373 回答
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

于 2013-04-17T22:41:52.433 回答