直接上代码吧:
__int64 FileTimeToQuadWord(PFILETIME pFileTime)
{
__int64 qw;
qw = pFileTime->dwHighDateTime;
qw <<= 32;
qw |= pFileTime->dwLowDateTime;
return (qw);
}
PFILETIME QuadWordToFileTime(__int64 qw,PFILETIME pFileTime)
{
pFileTime->dwHighDateTime = (DWORD)(qw >> 32);
pFileTime->dwLowDateTime = (DWORD)(qw & 0xFFFFFFFF);
return (pFileTime);
}
class CThreadTime
{
public:
void BeginGetElapsedTime();
__int64 EndGetElapsedTime();
private:
__int64 FileTimeToQuadWord(PFILETIME pft);
private:
FILETIME ftKernelTimeStart;
FILETIME ftKernelTimeEnd;
FILETIME ftUserTimeStart;
FILETIME ftUserTimeEnd;
FILETIME ftDummy;
};
// Get the time elapsed since the thread start
inline void CThreadTime::BeginGetElapsedTime()
{
GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy, &ftKernelTimeStart, &ftUserTimeStart);
}
// Calculate the time elapsed
inline __int64 CThreadTime::EndGetElapsedTime()
{
GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy, &ftKernelTimeEnd, &ftUserTimeEnd);
__int64 qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) - FileTimeToQuadWord(&ftKernelTimeStart);
__int64 qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) - FileTimeToQuadWord(&ftUserTimeStart);
// Get total time duration by adding the kernel and user times.
// the default is 100ns, so we convert it to ms
//return (qwKernelTimeElapsed + qwUserTimeElapsed) / 10000;
return (qwKernelTimeElapsed + qwUserTimeElapsed) / 10;
}
inline __int64 CThreadTime::FileTimeToQuadWord(PFILETIME pft)
{
return (Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
class CStopwatch
{
public:
CStopwatch()
{
QueryPerformanceFrequency(&m_liPerfFreq);
Start();
}
void Start()
{
QueryPerformanceCounter(&m_liPerfStart);
}
__int64 Now() const
{
//Returns # of milliseconds since
//Start was called
LARGE_INTEGER liPerfNow;
QueryPerformanceCounter(&liPerfNow);
return (((liPerfNow.QuadPart -
m_liPerfStart.QuadPart) * 1000)/
m_liPerfFreq.QuadPart);
}
private:
//Counts per second
LARGE_INTEGER m_liPerfFreq;
//Starting count
LARGE_INTEGER m_liPerfStart;
};
boost::posix_time::ptime ptNow = boost::posix_time::microsec_clock::universal_time()
+ boost::posix_time::hours(8);
// 2
CThreadTime ElapsedTime;
ElapsedTime.BeginGetElapsedTime();
// 3
FILETIME ftKernelTimeStart,ftKernelTimeEnd;
FILETIME ftUserTimeStart,ftUserTimeEnd;
FILETIME ftDummy,ftTotalTimeElapsed;
__int64 qwKernelTimeElapsed,qwUserTimeElapsed,iElapse;
///Get starting times.
GetThreadTimes(GetCurrentThread(),&ftDummy,&ftDummy,
&ftKernelTimeStart,&ftUserTimeStart);
// 4
CStopwatch spWatch;
//5
ACE_Profile_Timer profile_timer;
profile_timer.start();
//dosomething 。。。。。。。。
boost::posix_time::ptime ptNow2 = boost::posix_time::microsec_clock::universal_time()
+ boost::posix_time::hours(8);
int iElapse = ptNow2.time_of_day().total_microseconds() - ptNow.time_of_day().total_microseconds();
//2
int iElapse = ElapsedTime.EndGetElapsedTime();
// 3
GetThreadTimes(GetCurrentThread(),&ftDummy,&ftDummy,
&ftKernelTimeEnd,&ftUserTimeEnd);
Get the elapsed kernel and User time
qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd)-
FileTimeToQuadWord(&ftKernelTimeStart);
qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd)-
FileTimeToQuadWord(&ftUserTimeStart);
you may choice this time style.
iElapse = (qwKernelTimeElapsed + qwUserTimeElapsed)/10;
//4
__int64 iElapse = spWatch.Now();
// 5
profile_timer.stop();
ACE_Profile_Timer::ACE_Elapsed_Time et;
profile_timer.elapsed_time (et);
int iElapse = (et.system_time + et.user_time)*1000*1000;
其中boost的是计算相对时间,其他是计算绝对时间。cpu占用系统加用户。
记录以便使用。仅供参考。