回應 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() 轉換成好處理的時間格式。但須注意兩點:

  1. FILETIME 的起始時間不是 epoch,而是 1601-01-01 UTC,需先整個轉成 ULONGLONG 後減去 116444736000000000 才是 100-nanoseconds since epoch;
  2. 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]


  1. 查 manpage 得知 gettimeofday() 出現於 4.2BSD,目前不確定在 Linux 下是否也有得用。