首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Windows环境下计算C++中的CPU时间

在Windows环境下计算C++中的CPU时间
EN

Stack Overflow用户
提问于 2012-09-26 15:55:36
回答 5查看 12.8K关注 0票数 6

在C++中有任何方法来计算在CPU time中运行给定程序或例程需要多长时间吗?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-27 04:11:15

如果您想知道进程使用的CPU总时间,那么clockrdtsc (直接或通过编译器内部)实际上都不是最佳选择,至少IMO是这样的。如果您需要代码是可移植的,那么最好的方法是使用clock,尽可能地在系统中进行测试,并希望得到最好的结果(但如果需要,请注意clock的分辨率是CLOCKS_PER_SEC,它可能是1000,也可能不是1000,即使是这样,您的实际定时分辨率通常不会那么好-它可能以毫秒为单位,但至少在一次中会提前数十毫秒)。

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

在任何情况下,如果您真的希望从头到尾都需要时间,GetProcessTimes将允许您这样做--如果您生成程序(例如,使用CreateProcess),您将得到进程的句柄,当子进程退出时,该句柄将被发出信号。然后,您可以对该句柄调用GetProcessTimes,并检索时间,即使子句柄已经退出--只要进程的至少一个句柄仍处于打开状态,该句柄仍然有效。

票数 6
EN

Stack Overflow用户

发布于 2012-09-26 17:01:39

这里有一条路。它测量例程解释时间,以毫秒为单位。

clock_t begin=clock();在执行路由之前启动,而clock_t end=clock();则在例程退出之后立即启动。

然后两个时间集互相减去,结果是一个毫秒值。

代码语言:javascript
运行
复制
#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;
}
票数 4
EN

Stack Overflow用户

发布于 2012-09-26 17:09:13

__rdtscp内部特性将给您在CPU周期中的时间,并附带一些注意事项。这是MSDN文章

这真的取决于你想要测量什么。为了获得更好的结果,平均需要几百万次(如果不是十亿次)迭代。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12606033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档