【问题标题】:C - measuring computing timeC - 测量计算时间
【发布时间】:2011-08-04 10:08:51
【问题描述】:

有什么简单的方法可以测量 C 中的计算时间吗?我在执行时尝试了时间实用程序,但我需要测量程序的特定部分。

谢谢

【问题讨论】:

  • 你的意思是你想分析你的代码?如果是这样,看看这个问题:stackoverflow.com/questions/1794816/…
  • 取决于使用的操作系统和工具链。请添加适当的标签。

标签: c profiling


【解决方案1】:

您通常可以使用clock() 函数来获取对正在测试的函数的单个调用的开始时间和结束时间。但是,如果 do_some_work() 速度特别快,则需要将其放入循环中,并考虑循环本身的成本,例如:

#define COUNT 10000

// Get cost of naked loop.

clock_t start_base = clock();
for (int i = count; i > 0; i--)
    ;
clock_t end_base = clock();

// Get cost of loop plus work.

clock_t start = clock();
for (int i = count; i > 0; i--)
    do_some_work() ;
clock_t end = clock();

// Calculate cost of single call.

double elapsed_time = end - start - (end_base - start_base);
elapsed_time = elapsed_time / CLOCKS_PER_SEC / COUNT;

这至少有两个优点:

  • 您将获得更能代表实际所需时间的平均时间;和
  • clock() 函数的分辨率有限的情况下,您会得到更准确的答案。

【讨论】:

    【解决方案2】:

    @codebolt - 谢谢!很不错。在 Mac OS X 上,我添加了 time.h 的包含,并粘贴在您的四行中。然后我打印了开始、停止(整数)和经过时间的值。 1 毫秒分辨率。

    output:
    3 X: strcpy .name, .numDocks: start 0x5dc   end 0x5e1   elapsed: 0.000005 
    calloc: start 0x622   end 0x630   elapsed: 0.000014 
    

    在我的 foo.c 程序中

    #include <libc.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    

    但它可以在没有明确包含 time.h 的情况下工作。其他人必须把它带进来。

    实际代码:

    clock_t start = clock() ;
    
    strcpy( yard2.name, temp );  /* temp is only persistant in main... */
    strcpy( yard1.name, "Yard 1");
    strcpy( yard3.name, "3 y 3 a 3 r 3 d 3");
    yard1.numDocks = MAX_DOCKS; /* or so I guess.. */
    yard2.numDocks = MAX_DOCKS; /* or so I guess.. */
    yard3.numDocks = MAX_DOCKS; /* or so I guess.. */
    
    clock_t end = clock() ;
    double elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ;
    printf("3 X: strcpy .name, .numDocks: start 0x%x   end 0x%x   elapsed: %-12:8f \n", start, end, elapsed_time );
    
    
    start = clock() ;
    arrayD = calloc( yard2.numDocks, sizeof( struct dock ) );   /* get some memory, init it to 0 */
    end = clock() ;
    
    elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ;
    printf("calloc: start 0x%x   end 0x%x   elapsed: %-12:8f \n", start, end, elapsed_time );
    

    【讨论】:

      【解决方案3】:

      您可以尝试分析器“gprof”。更多信息在这里:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

      【讨论】:

      • 他可以试试,但他可能不喜欢。 See here.
      • @Mike,我从来不知道递归问题。感谢您指出这一点。
      【解决方案4】:

      您可以在&lt;time.h&gt; 中使用clock 函数以及宏CLOCKS_PER_SEC

      clock_t start = clock() ;
      do_some_work() ;
      clock_t end = clock() ;
      double elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ;
      

      现在elapsed_time 保存调用do_some_work 所花费的时间,以秒为单位。

      【讨论】:

      • 这里唯一的问题是CLOCKS_PER_SEC,但是值一般是60或者100,所以计时不是很精确。如果您的处理器有多个内核并以 3 GHz 运行,您可以在 10 或 17 毫秒内完成很多工作。
      • 没错,但我很确定这是使用纯 ANSI C 可以获得的最佳效果。在 Windows 上,您可以使用 timeGetTime 甚至 QueryPerformanceCounter 做得更好。
      • 如果do_some_work() 非常快,可能需要将它放在一个循环中重复多次,例如 10,000,000 并将经过的时间除以相同的数字来计算一个单位的时间工作。
      猜你喜欢
      • 2013-07-12
      • 2013-02-21
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      相关资源
      最近更新 更多