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

Vic*_*ent 6 c++ performance cpu-usage visual-studio-2008 windows-7

在C++中有什么方法可以计算在CPU时间内运行给定程序或例程需要多长时间

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

Jer*_*fin 6

如果你想知道的CPU时间的过程中使用的总量,既不clock也不rdtsc(直接或通过编译器的内部)确实是一个不错的选择,至少IMO.如果您需要可移植的代码,那么您可以做的最好是使用clock,尽可能使用系统进行测试,并希望获得最佳效果(但如果您这样做,请注意分辨率clockCLOCKS_PER_SEC,可能或可能不是1000,即使它是,你的实际定时分辨率往往不会那么好 - 它可能给你几毫秒的时间,但至少通常一次提前几十毫秒).

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

在任何情况下,如果你真的想要从开始到结束的时间,那么GetProcessTimes就让你这样做 - 如果你产生程序(例如,带有CreateProcess),你将得到一个过程的句柄,当子进程退出时将发出信号.然后GetProcessTimes,您可以调用该句柄,并检索时间,即使子项已经退出 - 只要该进程的至少一个句柄保持打开,句柄将保持有效.