【发布时间】:2013-07-04 08:19:09
【问题描述】:
我看到了很多关于这个的话题,甚至在stackoverflow上,例如:
How can I measure CPU time and wall clock time on both Linux/Windows?
我想同时测量 CPU 和挂墙时间。尽管在我发布的主题中回答问题的人建议使用gettimeofday 来测量挂墙时间,但我读到最好使用clock_gettime。所以,我写了下面的代码(可以吗,它真的是在测量墙上时间,而不是 CPU 时间吗?我问,因为我找到了一个网页:http://nadeausoftware.com/articles/2012/03/c_c_tip_how_measure_cpu_time_benchmarking#clockgettme 上面写着clock_gettime 测量 CPU 时间...... ) 真相是什么?我应该用哪一个来测量挂墙时间?
另一个问题是关于 CPU 时间的。我发现clock 的答案很好,所以我也为它写了一个示例代码。但这不是我真正想要的,因为我的代码显示了 0 秒的 cpu 时间。是否可以更精确地测量 CPU 时间(以秒为单位)?感谢您的帮助(目前,我只对 Linux 解决方案感兴趣)。
这是我的代码:
#include <time.h>
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
#include <stdlib.h>
int main()
{
int i;
double sum;
// measure elapsed wall time
struct timespec now, tmstart;
clock_gettime(CLOCK_REALTIME, &tmstart);
for(i=0; i<1024; i++){
sum += log((double)i);
}
clock_gettime(CLOCK_REALTIME, &now);
double seconds = (double)((now.tv_sec+now.tv_nsec*1e-9) - (double)(tmstart.tv_sec+tmstart.tv_nsec*1e-9));
printf("wall time %fs\n", seconds);
// measure cpu time
double start = (double)clock() /(double) CLOCKS_PER_SEC;
for(i=0; i<1024; i++){
sum += log((double)i);
}
double end = (double)clock() / (double) CLOCKS_PER_SEC;
printf("cpu time %fs\n", end - start);
return 0;
}
这样编译:
gcc test.c -o test -lrt -lm
它告诉我:
wall time 0.000424s
cpu time 0.000000s
我知道我可以进行更多迭代,但这不是重点;)
重要提示:
printf("CLOCKS_PER_SEC is %ld\n", CLOCKS_PER_SEC);
显示
CLOCKS_PER_SEC is 1000000
【问题讨论】:
-
@sashkello:我希望我可以,但我需要自己做 :)
-
如果您不将
clock()函数的结果除以CLOCKS_PER_SEC,您的分辨率可能会超过一秒,hrm? -
@mah:那它会给我一个正确的 cpu 时间吗?这里说,我需要划分它:chemie.fu-berlin.de/chemnet/use/info/libc/libc_17.html
-
@BrianBrown 当您将一个数字除以另一个数字时会发生什么,它会变得更准确还是更少?更简单的问题:它变大还是变小?是的,您链接的网站在其示例中进行了划分,但它取决于 您 来理解推理,毫无疑问,无论它有什么原因都不是为了提高分辨率。至于“确定正确的 cpu 时间”——如果 clock() 返回正确的 cpu 时间,那么当然不要修改它。永远不要输入你在随机位置找到的代码,而不考虑它首先实际做了什么。
-
“真相是什么,我应该用哪一个来测量墙上的时间?” - 事实上,有 许多 种不同的方法来测量挂墙时间。有些比其他的更精确。有些比其他的更便携。您可以选择并使用适合您的任何东西。我对您链接的问题的回答使用
gettimeofday(),因为这是对我来说足够好的第一件事。
标签: c performance time cpu