在 C++ 中是否有任何方法可以计算在 CPU 时间中运行给定程序或例程需要多长时间?
我使用在 Windows 7 上运行的 Visual Studio 2008。
最佳答案
如果你想知道一个进程使用的 CPU 时间总量,clock
和 rdtsc
(直接或通过编译器内部)都不是最好的选择,至少是海事组织。如果你需要代码是可移植的,你能做的最好的事情就是使用 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/