在 Windows 程式開發中,時間相關操作無處不在:衡量函式執行效能、實作定時器、多媒體同步、遊戲主迴圈等。編譯器與作業系統提供了多種時間函式,但精度、適用場景各異。選用不當會導致延遲誤差大、定時不準,甚至影響系統效能。本文系統整理 Windows 下 10 種常見時間函式,涵用法、原理、精度與適用場景,助你精準掌控時間。
Sleep(1000); // Windows 下單位為毫秒,即 1 秒
原理:呼叫 Sleep 的執行緒主動放棄時間片,進入休眠狀態;時間到後由排程器重新喚醒。
精度:極低(約 10~15 ms),受系統負載、執行緒優先權影響大。忙碌時睡 1 秒可能要 3 秒才醒來。
適用:不需精準的簡單延遲、讓出 CPU 時間片(Sleep(0))。
SetTimer(0, 100, NULL); // 100 ms 間隔 // 在 OnTimer() 回呼中處理
原理:本質同 Sleep,但封裝為定時器,支援回呼函式(預設 OnTimer)。
精度:毫秒級,但系統忙碌時精度下降。
適用:GUI 程式週期性 UI 更新、簡單定時任務。
time_t t; time(&t); // 取得目前時間(秒)
原理:讀取系統即時時鐘(RTC),回傳自 1970-01-01 至今的秒數。
精度:秒級。
適用:電子時鐘、日誌時間戳記、長周期排程。
COleDateTime start = COleDateTime::GetCurrentTime(); // ... 執行程式碼 ... COleDateTimeSpan diff = COleDateTime::GetCurrentTime() - start;
原理:MFC 將 time_t 封裝,支援日期運算、格式化輸出。
精度:秒級。
適用:需進行日期時間運算、格式化顯示的場合。
clock_t start = clock(); Sleep(100); clock_t end = clock(); double ms = (double)(end - start) / CLOCKS_PER_SEC * 1000;
原理:回傳程式啟動至今消耗的 CPU 時鐘數。Windows 下 CLOCKS_PER_SEC = 1000。
精度:毫秒級,短時間測量較準;長時間因執行緒不一定佔用 CPU,誤差較大。
適用:函式/演算法執行時間分析。
DWORD start = GetTickCount(); Sleep(100); DWORD end = GetTickCount(); DWORD elapsed = end - start; // 約 100 ms
原理:讀取系統啟動以來的毫秒計數器(經 BIOS 中斷更新)。
精度:Windows NT 3.5+ 為 10 ms;常用於多媒體定時。
注意:49.7 天會溢位(DWORD),長時間運行需用 GetTickCount64()。
#include <mmsystem.h> #pragma comment(lib, "winmm.lib") timeBeginPeriod(1); // 設定 1 ms 解析度 DWORD start = timeGetTime(); Sleep(100); DWORD end = timeGetTime(); timeEndPeriod(1); // 恢復預設
原理:同樣查詢系統計數器,但可透過 timeBeginPeriod/EndPeriod 設定最小解析度(成對呼叫)。
精度:1 ms 級,優於 GetTickCount。
適用:多媒體串流、遊戲主迴圈、需高精度輪詢的場合。
MMRESULT id = timeSetEvent(
10, 1, MyCallback, 0, TIME_PERIODIC); // 10 ms 週期性
// ...
timeKillEvent(id); // 釋放
原理:內建定時器,到期直接在獨立執行緒呼叫回呼,無需輪詢。
精度:毫秒級,可配合 timeBeginPeriod 提升。
適用:週期性採樣、即時控制、音訊處理等高精度定時任務。
LARGE_INTEGER freq, start, end; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start); Sleep(100); QueryPerformanceCounter(&end); double ms = (double)(end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart;
原理:讀取 CPU 內部高頻計數器(透過 RDTSC 指令),無中斷開銷,精度取決於硬體頻率(通常 MHz~GHz 級)。
精度:亞微秒級,Windows 計時精度基準。
適用:效能分析、基準測試、高精度科學計算、遊戲幀率統計。
| 需求 | 推薦函式 | 備註 |
|---|---|---|
| 簡單延遲 | Sleep | 精度低,僅適合粗略延遲 |
| GUI 週期性任務 | MFC Timer / timeSetEvent | 前者簡單,後者精度高 |
| 取得系統日期時間 | time / COleDateTime / CTime | 秒級,適合顯示與存儲 |
| 函式執行時間測量 | clock / GetTickCount / timeGetTime | ms 級,短時較準 |
| 多媒體/遊戲高精度定時 | timeGetTime / timeSetEvent | 可調解析度,1 ms 級 |
| 極高精度效能分析 | QueryPerformanceCounter | 硬體級,亞微秒 |
核心原則:根據精度需求選擇最簡單滿足條件的函式。過度使用高精度計時器會增加系統負擔;精度不足則導致邏輯錯誤。理解各函式原理與限制,才能在 Windows 下寫出健壯、高效的時間相關程式碼。