【问题标题】:How to measure execution time of several functions in a loop in C如何测量C循环中几个函数的执行时间
【发布时间】:2014-01-23 16:49:36
【问题描述】:

我希望找到一种方法来测量C中for循环中几个函数的执行时间。例如,有这样的代码:

for(;;)
{
    func1();
    func2();
    func3();
}

我想知道程序在 func1()(或 func2、func3)上总共花费了多少时间。

我知道我可以使用 clock() 来测量时间。但是,在这种情况下,如果我编写如下代码:

for(;;)
{
    a = clock();
    func1();
    b = clock();
    time_func1 += (b-a);
    a = clock();
    func2();
    b = clock();
    time_func2 += (b-a);
    a = clock();
    func3();
    b = clock();
    time_func3 += (b-a);
}

看起来太笨了,结果也不准确。

【问题讨论】:

    标签: c performance-testing


    【解决方案1】:

    如果您使用的是 Linux,我建议您使用 clock_gettime。这样就可以使用多个时钟进行精确的时间测量,而且分辨率也很高。 clock 本身分辨率很低。

    也许是关于它的使用的一句话:

    timespec t1, t2;
    
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t1);
    /* CODE TO BE MEASURED */
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t2);
    

    【讨论】:

      【解决方案2】:

      clock() 的分辨率非常低。根据您的操作系统,有更准确的功能。

      在 Windows 中有 QueryPerformanceCounters

      【讨论】:

        【解决方案3】:

        如果存在多线程代码,clock() 也不会给出真正的执行时间。

        【讨论】:

          【解决方案4】:

          塞巴斯蒂安是对的,

          根据手册页,POSIX 函数 clock() 返回程序使用的时钟滴答的近似值(近似值是什么意思?)。您必须除以每秒的时钟数才能获得执行时间。 这是由以下人员完成的:

          int main() {
              clock_t start;
              clock_t end;
              double cpu_time_used;
          
              start = clock();
              # do some computations
              end = clock();
          
              cpu_time_used = ((double) (end-start)) / CLOCKS_PER_SEC;
          }
          

          它易于使用,您可以获得调用进程的 CPU 滴答声,但精度以毫秒为单位。

          如果您需要更高的精度,POSIX 函数 clock_gettime() 精度为纳秒级。您可以指定检索系统范围、每个进程或线程特定的经过时间。这是一个例子:

          int main() {    
              timespec start;
              timespec end;
          
              double cpu_time_used;
          
              clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
              # do some computations
              clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
          
              cpu_time_used = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.0;
          }
          

          【讨论】:

            【解决方案5】:

            如果您想测量时间并进一步优化这些功能以更好地使用 oprofile 之类的分析工具,您将了解哪个功能花费了多少时间。使用“opannotate”您会以更好的方式了解

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-10-04
              • 2020-07-08
              • 2023-03-09
              • 1970-01-01
              • 1970-01-01
              • 2022-07-05
              相关资源
              最近更新 更多