2010-08-16 23 views
2

我有一個自己的GetTickCount()函數返回一個unsigned int(計數翻轉爲零上爲0xFFFFFFFF)經過時間與無符號計時單元計數/包裝

我不能測量的經過時間在:

unsigned int elapsed; 
unsigned int start = GetTickCount(); 
LongOperation(); 
unsigned int stop = GetTickCount(); 

if (stop >= start) 
    elapsed = stop - start; 
else 
    elapsed = (INT_MAX - start) + stop; 

這是一樣的,如果我做一個演員簽名(時間跨度我措施總是少於什麼可以表示在一個有符號的整數 - 我想約24天)? :

int start = (int)GetTickCount(); 
LongOperation(); 
int elapsedTime = (int)GetTickCount() - start; 
如果我看看.NET Environmet.TickCount屬性

計時單位計數將增加從零到的Int32 .. :: MaxValue的約24.9天,然後跳轉到的Int32。 。::。MinValue是一個負數,然後在接下來的24.9天內遞增到零。

所以,當我投我的GetTickCount()函數符號整數,我應該得到的.NET的行爲(發生在0x7FFFFFFF->爲0x80000000包裝)?

這個應該可以做測量經過時間如下(在另一篇文章中看到的):

int start = Environment.TickCount; 
DoLongRunningOperation(); 
int elapsedTime = Environment.TickCount - start; 
+0

編號。流逝的時間可能適合整數,但爲'start'和'end'強制轉換爲有符號整數可能會給出錯誤的值。 – Chubsdad 2010-08-16 06:32:15

回答

0

在C++中,如果你堅持使用無符號代碼將工作:

unsigned int start = gettickcount(); 
DoLongRunningOperation(); 
unsigned int elapsedTime = static_cast<unsigned int>(gettickcount()) - start; 

你想堅持使用無符號的原因是無符號算術需要使用模數算術,這是你想在這種情況下。

3

的原型的GetTickCount()在C++在Windows中是一個很好的例子: DWORD WINAPI的GetTickCount(無效);

所以我想這(類似於其他的答案)代碼時:

DWORD start = GetTickCount(); 
dosomething(); 
DWORD elapsed = GetTickCount() - start; 

將測量的經過時間達到最大數量DWORD可以代表。

正如其他人說,無符號運算,你不需要圍繞擔心計數器歸零 - 自己嘗試一下......

還要檢查GetTickCount64和QueryPerformanceCounter的/ QueryPerformanceFrequency的。 GetTickCount64將允許您測量更長的時間間隔,但不支持所有版本的Windows,而QueryPerformanceCounter允許您測量更高的分辨率和準確性。例如,在某些Windows版本中,GetTickCount()可能僅準確到18ms,而QueryPerformanceCounter會比1us好。