C - 测量计算时间
可以与宏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
,分数秒的时间。
这里唯一的问题是'CLOCKS_PER_SEC',但值通常是60或100,所以时序不是很精确。如果您的处理器具有多个内核并以3 GHz运行,则可以在10或17毫秒内完成很多操作。 – 2011-04-13 05:31:40
确实如此,但我确信这是使用纯ANSI C获得的最佳选择。在Windows上,您可以使用timeGetTime或QueryPerformanceCounter来做更好的工作。 – 2011-04-13 05:37:14
如果'do_some_work()'非常快,可能需要将它放在一个循环中,循环会多次重复它,例如10,000,000,并用相同的数字来划分已用时间,以计算一个工作单元的时间。 – wallyk 2011-04-13 05:49:51
您可以尝试探查器“gprof”。更多的信息在这里:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
他可以尝试,但他可能不喜欢它。 [见这里。](http://stackoverflow.com/questions/4981121/how-exactly-does-gprof-work/5046039#5046039) – 2011-04-13 12:30:39
@Mike,我从来不知道递归问题。感谢您指出了这一点。 – BiGYaN 2011-04-13 13:45:36
@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);
通常你可以使用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()
函数的分辨率有限,您将得到更准确的答案。
你的意思是你想分析你的代码吗?如果是这样,看看这个问题:http://stackoverflow.com/questions/1794816/recommendations-for-c-profilers – Naveen 2011-04-13 05:18:53
这取决于所使用的操作系统和工具链。请添加适当的标签。 – wallyk 2011-04-13 05:23:05