我希望找到一种方法来测量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);
}
看起来太傻了,结果不准确。
答案 0 :(得分:3)
如果您使用的是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);
答案 1 :(得分:1)
clock()
的分辨率非常低。根据您的操作系统,有更准确的功能。
在Windows中有QueryPerformanceCounters。
答案 2 :(得分:1)
clock()
也不会给出真正的执行时间。
答案 3 :(得分:0)
塞巴斯蒂安是对的,
根据手册页,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;
}
答案 4 :(得分:0)
如果你想测量时间并进一步想要更好地优化这些功能以配合像oprofile这样的分析工具那么你就会知道哪个功能需要花费多少时间。用'opannotate'你会更好地了解