環境: target =wince 5.0 , use VC 2005
問題.需求: 計算程式執行所需時間
解決: 使用 CTime, CTimeSpan, GetCurrentTime()
所需 header file為 atltime.h
CTime ct_start, ct_end;
CTimeSpan ts;
int seconds;
ct_start = CTime::GetCurrentTime();
... 想計算執行時間的程式碼 ...;
ct_end = CTime::GetCurrentTime();
ts = ct_end - ct_start;
seconds = ts.GetTotalSeconds(); //將執行時間換算成秒數
程式在wince上跑量出來的秒數不準, 會有變多的情況.
改用GetTickCount()解決.
GetTickCount返回從操作系統啟動到現在所經過(elapsed)的毫秒數,它的返回值是DWORD。
(WinCE SDK) DWORD在 windef.h裡定義 (windows.h會包含windef.h, 所以只要包含windows.h)
typedef unsigned long DWORD;
它能表示的最大值為2^32=4,294,967,295,而一天有24*60*60*1000=86,400,000ms, 所以4,294,967,295/86,400,000 = 49.71,所以若系統持續運行49.71天,這個數會overflow繞回到零。
sample code:
DWORD dwStart, dwStop;
dwStart = GetTickCount();
//計算執行時間的程式碼;
dwStop = GetTickCount();
cout << "程式執行時間:" << (dwStop - dwStart)/1000 << "秒\n";
由於GetTickCount返回的型別是DWORD(以wince sdk裡即unsigned long), 所以我們計時最多也只能49.71天超過的話就overflow了。
以下的程式例子說明: 當dwA加1後即overflow繞回為0, 但是計算相差多少時(大數減小數)結果不會影響。可是如果相差4294967296之後 相減的結果便開始是錯誤的。
DWORD dwA, dwB, dwD, dwE, dwF;
dwA = 4294967295;
dwB = dwA + 1;
dwD = dwA + 4294967295;
dwE = dwA + 4294967296;
dwF = dwA + 4294967297;
cout<<"dwA=" << dwA <<"\n";
cout<<"dwB=" << dwB <<"\n";
cout<<"dwD=" << dwD <<"\n";
cout<<"dwB-dwA=" << dwB-dwA <<"\n";
cout<<"dwD-dwA=" << dwD-dwA <<"\n";
cout<<"dwE-dwA=" << dwE-dwA <<"\n";
cout<<"dwF-dwA=" << dwF-dwA <<"\n";
輸出結果:
dwA=4294967295
dwB=0
dwD=4294967294
dwB-dwA=1
dwD-dwA=4294967295 //相減的結果還是對的
dwE-dwA=0 //相減的結果超過4294967295 即overflow了
dwF-dwA=1 //overflow
This entry was posted
on 2009年4月6日 星期一
at 下午3:04
and is filed under
程式設計
. You can follow any responses to this entry through the
comments feed
.