GetTickCount返回(retrieve)從作業系統啟動到現在所經過(elapsed)的毫秒數,它的傳回值是DWORD。
如: DWORD time;
time = GetTickCount();
但是
GetTickcount函數:它返回從作業系統啟動到當前所經過的毫秒數,常常用來判斷某個方法執行的時間,其函數原型是DWORD GetTickCount(void),傳回值以32位的雙字類型DWORD儲存,因此可以儲存的最大值是2^32 ms約為49.71天,因此若系統已耗用時間超過49.71天時,這個數就會歸0,MSDN中也明確的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是編寫伺服器端程式,此處一定要萬分注意,避免引起意外的狀況。特別注意:這個函數並非即時發送,而是由系統每18ms發送一次,因此其最小精度為18ms。當需要有小於18ms的精度計算時,應使用StopWatch方法進行。也就是說使用這個函數,精度不高。為了擷取精確的時間,從而獲得精確的效率測量可以使用QueryPerformanceCounter(&ticks)函數樣本程式可以這樣用:
////////////variables definition//////////// DWORD time1,time2,time3;//計算時間用 LARGE_INTEGER frequency;//高效能計數器的頻率 LARGE_INTEGER start,end; start.QuadPart=0; end.QuadPart=0; frequency.QuadPart=0; long ticks=0; QueryPerformanceFrequency(&frequency);
///////////////////processing ///////////#ifdef DEBUGTIME time1 = GetTickCount(); QueryPerformanceCounter(&start); #endif
#ifdef DEBUGTIME time2 = GetTickCount(); QueryPerformanceCounter(&end); ticks = (long)(end.QuadPart-start.QuadPart); double millsecond=(double)ticks*1000.0/(double)frequency.QuadPart; printf("noninterpolating wasted time is %ld number %ld ticks %lf\n",time2-time1,arrayindex,millsecond);#endif
這是一位名叫softman11,csdn論壇裡這位作者提供的c++ 類實現
#pragma once#include<Windows.h> ///本類採用高解析度高效能計數器實現///在我的Intel T7500機器上,解析度大約是279毫微秒class StopWatch{public: StopWatch(void); ~StopWatch(void);private: LARGE_INTEGER beginticks; LARGE_INTEGER endticks ; LARGE_INTEGER frequency;//高效能計數器的頻率:每秒357,9545個tick 我的INTEL T7500public: void Start(); void Stop(); double GetCostMillisecond(); unsigned long long GetFrequency();}; #include "StdAfx.h"#include "StopWatch.h"#include <Windows.h>#include<iostream>using namespace std; StopWatch::StopWatch(void){ beginticks.QuadPart=0; endticks.QuadPart=0; frequency.QuadPart=0; QueryPerformanceFrequency(&frequency);} StopWatch::~StopWatch(void){} void StopWatch::Start(){ //beginticks=GetTickCount(); QueryPerformanceCounter(&beginticks); }void StopWatch::Stop(){ QueryPerformanceCounter(&endticks); }double StopWatch::GetCostMillisecond(){ unsigned long long cost=(unsigned long long)(endticks.QuadPart-beginticks.QuadPart); double millsecond=(double)cost*1000.0/(double)frequency.QuadPart; return millsecond;}unsigned long long StopWatch::GetFrequency(){ return (unsigned long long)frequency.QuadPart;}
上一篇:C語言 記憶體管理詳解
下一篇:typedef的四個用途和兩個陷阱