微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在C ++中获得一段代码的执行时间?

我正在尝试对一段代码进行基准testing。 它基于这里的代码,基本上看起来像这样的有趣的部分:

auto t0 = std::chrono::high_resolution_clock::Now(); ... auto t1 = std::chrono::high_resolution_clock::Now(); std::cout << secs(t1-t0).count() << " sn";

问题是我在一台共享的机器上,这给了我很多时间,所以我的结果并没有给我任何一致的结果。 我真正需要的是某种秒表工具,它可以让我得到我的代码运行的时间,而不是花时间。 有什么select? 如果涉及系统特定的调用,我在Linux机器上,但是如果可能的话,我宁愿保持这个代码的便携性。

我已经看过其他问题,如这个和这个,但他们似乎都提供墙上的时间解决scheme。

理解Apache平台每秒的请求

这里的任何人都已经testing了英特尔C ++编译器和GCC?

Windows(64位)上的Python 2.7.8(64位)在Ubuntu(64位)上的速度是2.7.8(64位)的一半,

如何编写testing应用程序来完全加载cpu

如何衡量远程桌面性能

Linux调度程序中的上下文切换的基准

通过unix socket vs tcp与ab和wrk对PHP进行基准testing

如何衡量在Linux中的命令的IOPS?

如何禁用dynamic频率缩放?

如何提高编译SSE和AVX的性能

如果在您的操作系统上可用,您可以使用时间API来获得与内置time命令类似的结果。

#include <sys/times.h> ... struct tms start,end; times(&start); //Do command times(&end); clock_t usr_time = end->tms_utime - start->tms_utime; clock_t sys_time = end->tms_stime - start->tms_stime;

为了100%完成,你应该检查时间的结果不等于-1 ,否则检查errno代码

理想情况下,正如您提到的问题中的注释,您应该隔离您正在测试的代码片段,并使用unix time命令行工具来报告user和system时间。

如果您无法做到这一点,请考虑查看源代码的time并可能使用相同的技术来测试您的代码

我认为你需要使用clock_gettime()以下时钟CLOCK_PROCESS_cpuTIME_ID或CLOCK_THREAD_cpuTIME_ID 。 他们提供了一个进程/线程所消耗的cpu时间。

CLOCK_PROCESS_cpuTIME_ID High-resolution per-process timer from the cpu. CLOCK_THREAD_cpuTIME_ID Thread-specific cpu-time clock.

参考:

http://linux.die.net/man/3/clock_gettime

了解clock_gettime()的不同时钟

http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

我认为merlin2011的建议在许多情况下是不可行的,因为隔离可能需要很多努力,而在clock_gettime()添加两行代码是非常实用的。 你甚至可以在一个类中调用clock_gettime() 。

对于Linux

#include <time.h> #include <stdio.h> double theseSecs = 0.0; double startSecs = 0.0; double secs; double cpusecs = 0.0; double cpuutilisation = 0.0; double answer = 0; clock_t starts; void start_cpu_time() { starts = clock();; return; } void end_cpu_time() { cpusecs = (double)(clock() - starts)/(double)CLOCKS_PER_SEC; return; } struct timespec tp1; void getSecs() { clock_gettime(CLOCK_REALTIME,&tp1); theseSecs = tp1.tv_sec + tp1.tv_nsec / 1e9; return; } void start_time() { getSecs(); startSecs = theseSecs; return; } void end_time() { getSecs(); secs = theseSecs - startSecs; return; } void calculate() { int i,j; for (i=1; i<100001; i++) { for (j=1; j<10001; j++) { answer = answer + (float)i / 100000000.0; } } } void main() { start_time(); start_cpu_time(); calculate(); end_time(); end_cpu_time(); cpuutilisation = cpusecs / secs * 100.0; printf("n Answer %10.1f,Elapsed Time %7.4f,cpu Time %7.4f,cpu Ut %3.0f%n",answer,secs,cpusecs,cpuutilisation); }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐