首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 時間函數完全指南:從 Sleep 到高精度計時器

     編輯:關於C語言

前言

在 Windows 程式開發中,時間相關操作無處不在:衡量函式執行效能、實作定時器、多媒體同步、遊戲主迴圈等。編譯器與作業系統提供了多種時間函式,但精度、適用場景各異。選用不當會導致延遲誤差大、定時不準,甚至影響系統效能。本文系統整理 Windows 下 10 種常見時間函式,涵用法、原理、精度與適用場景,助你精準掌控時間。

1. Sleep 函式:簡單延遲,精度低

Sleep(1000); // Windows 下單位為毫秒,即 1 秒

原理:呼叫 Sleep 的執行緒主動放棄時間片,進入休眠狀態;時間到後由排程器重新喚醒。
精度:極低(約 10~15 ms),受系統負載、執行緒優先權影響大。忙碌時睡 1 秒可能要 3 秒才醒來。
適用:不需精準的簡單延遲、讓出 CPU 時間片(Sleep(0))。

2. MFC Timer 事件:視窗程式定時器

SetTimer(0, 100, NULL); // 100 ms 間隔
// 在 OnTimer() 回呼中處理

原理:本質同 Sleep,但封裝為定時器,支援回呼函式(預設 OnTimer)。
精度:毫秒級,但系統忙碌時精度下降。
適用:GUI 程式週期性 UI 更新、簡單定時任務。

3. C 語言 time():秒級系統時間

time_t t; time(&t); // 取得目前時間(秒)

原理:讀取系統即時時鐘(RTC),回傳自 1970-01-01 至今的秒數。
精度:秒級。
適用:電子時鐘、日誌時間戳記、長周期排程。

4. COleDateTime / CTime:封裝的日期時間類別

COleDateTime start = COleDateTime::GetCurrentTime();
// ... 執行程式碼 ...
COleDateTimeSpan diff = COleDateTime::GetCurrentTime() - start;

原理:MFC 將 time_t 封裝,支援日期運算、格式化輸出。
精度:秒級。
適用:需進行日期時間運算、格式化顯示的場合。

5. clock():CPU 時鐘週期,毫秒級

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,誤差較大。
適用:函式/演算法執行時間分析。

6. GetTickCount():系統啟動後毫秒數

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()。

7. timeGetTime():多媒體定時器,可調精度

#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。
適用:多媒體串流、遊戲主迴圈、需高精度輪詢的場合。

8. timeSetEvent():系統級回呼定時器

MMRESULT id = timeSetEvent(
    10, 1, MyCallback, 0, TIME_PERIODIC); // 10 ms 週期性
// ...
timeKillEvent(id); // 釋放

原理:內建定時器,到期直接在獨立執行緒呼叫回呼,無需輪詢。
精度:毫秒級,可配合 timeBeginPeriod 提升。
適用:週期性採樣、即時控制、音訊處理等高精度定時任務。

9. QueryPerformanceCounter / Frequency:硬體高精度計時器

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 計時精度基準。
適用:效能分析、基準測試、高精度科學計算、遊戲幀率統計。

10. 總結與選型建議

需求推薦函式備註
簡單延遲Sleep精度低,僅適合粗略延遲
GUI 週期性任務MFC Timer / timeSetEvent前者簡單,後者精度高
取得系統日期時間time / COleDateTime / CTime秒級,適合顯示與存儲
函式執行時間測量clock / GetTickCount / timeGetTimems 級,短時較準
多媒體/遊戲高精度定時timeGetTime / timeSetEvent可調解析度,1 ms 級
極高精度效能分析QueryPerformanceCounter硬體級,亞微秒

核心原則:根據精度需求選擇最簡單滿足條件的函式。過度使用高精度計時器會增加系統負擔;精度不足則導致邏輯錯誤。理解各函式原理與限制,才能在 Windows 下寫出健壯、高效的時間相關程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved