在C++中有任何方法来计算在CPU time中运行给定程序或例程需要多长时间吗?
我使用运行在Windows 7上的Visual 2008。
发布于 2012-09-27 04:11:15
如果您想知道进程使用的CPU总时间,那么clock或rdtsc (直接或通过编译器内部)实际上都不是最佳选择,至少IMO是这样的。如果您需要代码是可移植的,那么最好的方法是使用clock,尽可能地在系统中进行测试,并希望得到最好的结果(但如果需要,请注意clock的分辨率是CLOCKS_PER_SEC,它可能是1000,也可能不是1000,即使是这样,您的实际定时分辨率通常不会那么好-它可能以毫秒为单位,但至少在一次中会提前数十毫秒)。
但是,由于您似乎并不介意特定于Windows的代码,所以您可以做得更好。至少,如果我对您正在寻找的内容的理解是正确的,那么您真正想要的可能是GetProcessTimes,它将(分别)告诉您进程的内核模式和用户模式CPU的使用情况(以及启动时间和退出时间,如果您关心的话,可以从中计算使用的墙壁时间)。还有QueryProcessCycleTime,它将告诉您进程使用的CPU时钟周期的总数(所有线程中用户模式和内核模式的总数)。就我个人而言,我很难想象后者有多大用处--计数单个时钟周期对于需要进行密集优化的小部分代码是有用的,但我不太确定如何将其应用于一个完整的过程。GetProcessTimes使用FILETIME结构,它支持100纳秒的分辨率,但实际上,在大多数情况下,您将看到调度器的时间片的倍数(随windows版本的不同而变化,但大约在毫秒到几十毫秒之间)。
在任何情况下,如果您真的希望从头到尾都需要时间,GetProcessTimes将允许您这样做--如果您生成程序(例如,使用CreateProcess),您将得到进程的句柄,当子进程退出时,该句柄将被发出信号。然后,您可以对该句柄调用GetProcessTimes,并检索时间,即使子句柄已经退出--只要进程的至少一个句柄仍处于打开状态,该句柄仍然有效。
发布于 2012-09-26 17:01:39
这里有一条路。它测量例程解释时间,以毫秒为单位。
clock_t begin=clock();在执行路由之前启动,而clock_t end=clock();则在例程退出之后立即启动。
然后两个时间集互相减去,结果是一个毫秒值。
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;
double get_CPU_time_usage(clock_t clock1,clock_t clock2)
{
    double diffticks=clock1-clock2;
    double diffms=(diffticks*1000)/CLOCKS_PER_SEC;
    return diffms;
} 
void test_CPU_usage()
{
  cout << "Standby.. measuring exeution time:  ";
  for (int i=0; i<10000;i++)
  {
        cout << "\b\\" << std::flush;
        cout << "\b|" << std::flush;
        cout << "\b/" << std::flush;
        cout << "\b-" << std::flush;
  }
  cout << " \n\n";
}
int main (void)
{
    clock_t begin=clock();
    test_CPU_usage();
    clock_t end=clock();
    cout << "Time elapsed: " << double(get_CPU_time_usage(end,begin)) << " ms ("<<double(get_CPU_time_usage(end,begin))/1000<<" sec) \n\n";
    return 0;
}发布于 2012-09-26 17:09:13
__rdtscp内部特性将给您在CPU周期中的时间,并附带一些注意事项。这是MSDN文章
这真的取决于你想要测量什么。为了获得更好的结果,平均需要几百万次(如果不是十亿次)迭代。
https://stackoverflow.com/questions/12606033
复制相似问题