2011-04-13 95 views
7

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

感谢

+1

你的意思是你想分析你的代码吗?如果是这样,看看这个问题:http://stackoverflow.com/questions/1794816/recommendations-for-c-profilers – Naveen 2011-04-13 05:18:53

+0

这取决于所使用的操作系统和工具链。请添加适当的标签。 – wallyk 2011-04-13 05:23:05

回答

11

可以与宏CLOCKS_PER_SEC一起使用clock功能<time.h>

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,分数秒的时间。

+1

这里唯一的问题是'CLOCKS_PER_SEC',但值通常是60或100,所以时序不是很精确。如果您的处理器具有多个内核并以3 GHz运行,则可以在10或17毫秒内完成很多操作。 – 2011-04-13 05:31:40

+1

确实如此,但我确信这是使用纯ANSI C获得的最佳选择。在Windows上,您可以使用timeGetTime或QueryPerformanceCounter来做更好的工作。 – 2011-04-13 05:37:14

+2

如果'do_some_work()'非常快,可能需要将它放在一个循环中,循环会多次重复它,例如10,000,000,并用相同的数字来划分已用时间,以计算一个工作单元的时间。 – wallyk 2011-04-13 05:49:51

2

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

+1

他可以尝试,但他可能不喜欢它。 [见这里。](http://stackoverflow.com/questions/4981121/how-exactly-does-gprof-work/5046039#5046039) – 2011-04-13 12:30:39

+0

@Mike,我从来不知道递归问题。感谢您指出了这一点。 – BiGYaN 2011-04-13 13:45:36

0

@codebolt - 谢谢!非常好。在Mac OS X上,我添加了一个time.h,并粘贴在四行中。然后我打印开始,停止(整数)和经过时间的值。 1mS分辨率。

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); 
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()函数的分辨率有限,您将得到更准确的答案。