有没有办法找出使用MFC / Win32的CPU内部线程花费的实际时间?实际时间,我的意思是我不想计算线程在“运行”以外的状态所花费的时间。我在Win32 SDK中尝试了GetThreadTimes()方法,但无法获得正确的值。我想这样做是因为我想检查在其调度上设置ThreadPriority的效果,即如果我将线程优先级设置为THREAD_PRIORITY_BELOW_NORMAL而不是THREAD_PRIORITY_NORMAL会产生多大的差异?
以下是实际代码:
#include<iostream>
#include <afxwin.h>
#include <afxmt.h>
#include <time.h>
bool bStop = false;
long k1 = 0;
long k2 = 0;
UINT run1(LPVOID param)
{
while(!bStop)
{
for(int i = 0; i < 10; ++i)
{
++k1;
}
}
return 0;
}
UINT run2(LPVOID param)
{
while(!bStop)
{
for(int i = 0; i < 10; ++i)
{
++k2;
}
}
return 0;
}
void main(int argc,char *argv[])
{
CWinThread* pThread1 = AfxBeginThread(&run1, NULL, THREAD_PRIORITY_NORMAL);
CWinThread* pThread2 = AfxBeginThread(&run2, NULL, THREAD_PRIORITY_BELOW_NORMAL );
Sleep(3 * 1000);
bStop = TRUE;
FILETIME f1,f2,f3,f4;
GetThreadTimes(*pThread1, &f1,&f2,&f3,&f4);
CTime t1(f4);
std::cout<<"K1="<<k1<<"\n";
std::cout<<"K2="<<k2<<"\n";
std::cout<<"Thread1 Time="<<t1.GetSecond()<<"sec\n";
std::cout<<"Exit\n";
}
答案 0 :(得分:1)
GetThreadTimes()将为您提供正确的值。问题是它在FILETIME结构中给出了它。您必须将FILETIME结构转换为易于向用户显示的时间。您可以使用API FileTimeToSystemTime执行此操作:
SYSTEMTIME stUTC;
FileTimeToSystemTime(&f4, &stUTC);
std::cout<<"Thread1: Hour:"<<stUTC.wHour<<" Min:"<<stUTC.wMinute<<" Sec:"<<stUTC.wSecond<<" millSec:"<<stUTC.wMilliseconds<<std::endl;
在我的机器中,输出为:Thread1: Hour:0 Min:0 Sec:3 millSec:0
请忽略年份\天详细信息,因为FILETIME包含一个64位值,表示自1601年1月1日(UTC)以来100纳秒间隔的数量。
不要忘记添加kernerl时间和用户时间来获得总时间。