c++ - 在 Windows 上用 C++ 计算 CPU 时间

标签 c++ performance visual-studio-2008 windows-7 cpu-usage

在 C++ 中是否有任何方法可以计算在 CPU 时间中运行给定程序或例程需要多长时间?

我使用在 Windows 7 上运行的 Visual Studio 2008。

最佳答案

如果你想知道一个进程使用的 CPU 时间总量,clockrdtsc(直接或通过编译器内部)都不是最好的选择,至少是海事组织。如果你需要代码是可移植的,你能做的最好的事情就是使用 clock,尽可能在系统静止的情况下进行测试,并希望得到最好的结果(但如果你这样做,请注意clock 的分辨率是 CLOCKS_PER_SEC,它可能是 1000,也可能不是 1000,即使是,您的实际计时分辨率通常也不会那么好——它可能会给你以毫秒为单位计时,但至少通常一次提前几十毫秒)。

但是,由于您似乎并不介意特定于 Windows 的代码,因此您可以做得更好。至少如果我对你正在寻找的东西的理解是正确的,那么你真正想要的可能是 GetProcessTimes ,它将(分别)告诉您进程的内核模式和用户模式 ​​CPU 使用情况(以及开始时间和退出时间,如果您愿意,您可以从中计算使用的挂钟时间)。还有 QueryProcessCycleTime ,它将告诉您进程使用的 CPU 时钟周期总数(所有线程中用户模式和内核模式的总数)。就个人而言,我很难想象后者有多大用处——计算单个时钟周期对于需要进行密集优化的代码部分可能很有用,但我不太确定你如何d 将它应用到一个完整的过程中。 GetProcessTimes 使用 FILETIME 结构,它支持 100 纳秒的分辨率,但实际上大多数时候你会看到调度程序时间片的倍数(它随 windows 版本而变化,但在顺序上几毫秒到几十毫秒)。

无论如何,如果您真的想要从头到尾的时间,GetProcessTimes 将允许您这样做——如果您生成程序(例如,使用 CreateProcess) ,您将获得该进程的句柄,该句柄将在子进程退出时发出信号。然后,您可以在该句柄上调用 GetProcessTimes,并检索时间,即使子进程已经退出也是如此——只要该进程的至少一个句柄保持打开状态,该句柄就会保持有效。

关于c++ - 在 Windows 上用 C++ 计算 CPU 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606033/

相关文章:

visual-studio-2008 - 编译CUDA Visual Studio 2008

c++ - 为什么编译器报告 "operator<< and operator>> recursive on all control paths will cause stack overflow "?

c++ - 如何在 C++ 的 map 映射中使用 cout 探测特定值

c++ - operator+ 的模糊重载

c++ - 编写此算法的更有效方法?

performance - 一系列 x86 call/ret 指令是否形成依赖链?

node.js - 文件较小的 node.js HTTP 服务器响应速度慢得多

WPF ShowDialog 立即返回

c# - 调试时如何启动带有参数的程序?

php - 使用 zeromq 实现 Task Farm 消息传递模式