《Windows via C/C++》学习笔记 —— 线程的执行时间

  有的时候,想要获得线程执行一个任务的所花费的时间,你可以使用GetTickCount()(32位Windows环境,不包括Windows Vista)或者GetTickCount64()(Windows Vista环境)函数来获得当前的时间。两次执行该函数,并作差运算即可。但是这需要在线程不被打断的情况下才是有效的。

 

  可以使用GetThreadTimes函数来获得一个线程的运行时间。

BOOL GetThreadTimes(
     HANDLE hThread,
     PFILETIME pftCreationTime,
     PFILETIME pftExitTime,
     PFILETIME pftKernelTime,
     PFILETIME pftUserTime);

  该函数取得指定线程的4个时间:

1、创建时间:绝对数值,单位100ns,指明线程创建的时间

2、退出时间:绝对数值,单位100ns,指明线程退出的时间

3、内核时间:相对数值,单位100ns,指明线程运行操作系统代码花费的时间

4、用户时间:相对数值,单位100ns,指明线程运行用户代码花费的时间

 

  可以如下使用该函数:

GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
               
&ftKernelTimeStart, &ftUserTimeStart);    //取得开始时间

//这里可以执行特定的任务和算法

GetThreadTimes(GetCurrentThread(), 
&ftDummy, &ftDummy,
               
&ftKernelTimeEnd, &ftUserTimeEnd);    //取得结束时间

  上面的代码两次呼叫GetThreadTimes函数获得当前线程运行的时间,只要将“内核时间”和“用户时间”的参数由FILETIME类型转换为ULONGLNOG类型,然后作差运算即可。

 

  也可以取得一个“进程”运行的相关时间。

BOOL GetProcessTimes(
HANDLE hProcess,
PFILETIME pftCreationTime,
PFILETIME pftExitTime,
PFILETIME pftKernelTime,
PFILETIME pftUserTime);

  该函数个参数的意义同GetThreadTimes函数。该函数返回一个进程中所有线程花费的时间,比如所有线程运行内核代码所花费的时间的总和。

  上面两个函数对于高精度的需求来说并不是很好。为了得到高精度的时间统计信息,你可以使用下面两个函数: 

BOOL QueryPerformanceFrequency(LARGE_INTEGER* pliFrequency);
BOOL QueryPerformanceCounter(LARGE_INTEGER
* pliCount);


  本书中,作者用了一个类把这两个函数封装在了里面,这里,我提供一般的方法:

LARGE_INTEGER liPerfFreq;   // Counts per second(每秒计数)
LARGE_INTEGER liPerfStart;  // Starting count(开始时候的计数)

LARGE_INTEGER liPerfNow;   
// Now count(结束时候的计数)

QueryPerformanceFrequency(
&liPerfFreq);   // 取得计数频率
QueryPerformanceCounter(&liPerfStart);    // 取得开始时候的计数

// 这里执行特定的任务和算法


QueryPerformanceCounter(
&liPerfNow);      // 取得结束时候的计数

 

//得到的毫秒数为:
(liPerfNow.QuadPart - liPerfStart.QuadPart) * 1000 / m_liPerfFreq.QuadPart;

//得到微秒数为:
(liPerfNow.QuadPart-liPerfStart.QuadPart)*1000000 / m_liPerfFreq.QuadPart;

 

posted on 2008-08-02 23:33  小虎无忧  阅读(2454)  评论(0编辑  收藏  举报

导航