在 Win32 下抓取時間
回應 pesty 的這篇《在 Windows 計時》,順便把之前整理出來的東西,記成 blog 方便日後查閱。
只是要抓 tick 的話,用 GetTickCount() 即可,單位是 millisecond,可以這樣顯示:
DWORD start = GetTickCount();
// do something...
DWORD elapsed = GetTickCount() - start;
printf("elapsed: %d.%03ds\n", elapsed / 1000, elapsed % 1000);
若是需要真實時間的話,則用 GetSystemTime() 再搭配 SystemTimeToFileTime() 轉換成好處理的時間格式。但須注意兩點:
FILETIME的起始時間不是 epoch,而是 1601-01-01 UTC,需先整個轉成ULONGLONG後減去116444736000000000才是 100-nanoseconds since epoch;GetSystemTime()在 WinCE 裡,精確度只有到秒。
寫成程式碼如下:
DWORD GetMsSinceEpoch()
{
SYSTEMTIME st;
GetSystemTime(&st);
FILETIME ft;
SystemTimeToFileTime(&st, &ft);
// 100-nanoseconds since 1601
ULONGLONG ull = ((ULONGLONG)ft.dwHighDateTime << 32 )
+ (ULONGLONG)ft.dwLowDateTime;
// 100-nanoseconds since epoch
ull -= 116444736000000000;
DWORD ms = (ull / 10000); // 100-nano-seconds -> milliseconds
}
若要跨平台,在 BSD 下可以用 gettimeofday() 來實作 GetMsSinceEpoch()[1]。
- 查 manpage 得知 gettimeofday() 出現於 4.2BSD,目前不確定在 Linux 下是否也有得用。 ↩



Post a Comment