GetTickCount() 精度僅 ~15ms(系統時鐘中斷周期),無法滿足毫秒級計時需求。本文對比三種方案:clock()、GetTickCountCalibrate()(系統時間校準)、QueryPerformanceCounter(高精度計數器),並給出測試數據。
每隔 50ms 采樣 1000 次,統計與理論值 50ms 的偏差:
| 方法 | 最大偏差 | 最小偏差 | 平均偏差 | 結論 |
|---|---|---|---|---|
| GetTickCount | 13ms | 3ms | 5.08ms | 不可用 |
| clock() | 2ms | 0ms | 0.004ms | 可用,但計算 CPU 時間 |
| GetTickCountCalibrate | 1ms | 0ms | 0.003ms | 推薦,牆鐘時間,兼容 GetTickCount 接口 |
ULONG GetTickCountCalibrate() {
static ULONG firstTick = 0;
static LONGLONG firstTickMS = 0;
SYSTEMTIME st; FILETIME ft;
GetLocalTime(&st); SystemTimeToFileTime(&st, &ft);
LARGE_INTEGER li; li.HighPart=ft.dwHighDateTime; li.LowPart=ft.dwLowDateTime;
LONGLONG nowMS = li.QuadPart / 10000;
if (!firstTick) firstTick = GetTickCount();
if (!firstTickMS) firstTickMS = nowMS;
return firstTick + (ULONG)(nowMS - firstTickMS);
}
優點:牆鐘時間、毫秒精度、返回類型兼容 GetTickCount、無需鏈接額外庫。缺點:首次調用較慢(系統調用)。