我看到很多关于此的主题,即使在stackoverflow上,例如:
如何在Linux / Windows上测量CPU时间和挂钟时间?
我想测量cpu和wall时间。 虽然在我发布的主题中回答了问题的人建议使用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解决方案感兴趣)。
inheritance我的代码:
#include #include /* printf */ #include /* sqrt */ #include 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 %fsn", 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 %fsn", end - start); return 0; }
像这样编译它:
gcc test.c -o test -lrt -lm
它告诉我:
wall time 0.000424s cpu time 0.000000s
我知道我可以做更多的迭代,但这不是重点;)
重要:
printf("CLOCKS_PER_SEC is %ldn", CLOCKS_PER_SEC);
节目
CLOCKS_PER_SEC is 1000000
根据我关于clock
手册页,它说
POSIX要求CLOCKS_PER_SEC等于1000000,与实际分辨率无关。
当增加计算机上的迭代次数时,测量的cpu-time开始显示在100000次迭代上。 从返回的数字看,分辨率实际上是10毫秒。
请注意,当您优化代码时,整个循环可能会消失,因为sum
是一个死值。 也没有什么可以阻止编译器在循环中移动clock
语句,因为它们之间没有真正的依赖关系。
让我详细说明代码性能的微观测量。 测量性能的天真和诱人的方法确实是通过添加clock
语句来完成的。 但是,由于时间不是C中的概念或副作用,编译器通常可以随意移动这些clock
调用。 为了解决这个问题,很容易让这种clock
调用产生副作用,例如让它访问volatile
变量。 但是,这仍然不会禁止编译器通过调用移动高度无副作用的代码。 想想访问常规局部变量的例子。 但更糟糕的是,通过使clock
调用看起来对编译器来说非常可怕,您实际上会对任何优化产生负面影响。 因此,仅仅测量性能会以负面和不合需要的方式影响性能。
如果您使用分析,正如某人已经提到的那样,您可以对优化代码的性能进行非常好的评估,尽管总体时间当然会增加。
测量性能的另一个好方法是让编译器报告一些代码将采用的周期数。 对于许多体系结构,编译器对此有非常准确的估计。 然而,最值得注意的是奔腾架构并不是因为硬件做了很多很难预测的调度。
虽然这不是常规实践,但我认为编译器应该支持标记要测量的function的pragma
。 然后,编译器可以在函数的序言和结尾中包括高精度非侵入式测量点,并禁止任何内联函数。 根据架构,它可以选择高精度时钟来测量时间,最好是在OS的支持下仅测量当前过程的时间。
需要了解更多c/c++开发分享如何测量cpu时间和挂钟时间?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如何测量cpu时间和挂钟时间?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979339.html