C -测量计算时间



是否有简单的方法来测量C中的计算时间?我在执行时尝试了time实用程序,但我需要测量程序的特定部分。

谢谢

您可以在<time.h>中使用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所需的时间,以小数秒为单位。

您可以尝试使用分析器"gprof"。更多信息请访问:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

您通常可以使用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()函数分辨率有限的情况下,您将得到更准确的答案。

@codebolt -谢谢!很好。在Mac OS X上,我添加了time.h的include,并粘贴了你的四行。然后打印start、stop(整数)和elapsed time的值。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 );

最新更新