clock() 函數原型與核心型別
#include
clock_t clock(); // 回傳程式啟動至今的 clock ticks
#define CLOCKS_PER_SEC 1000 // Windows: 每秒 1000 ticks (1ms 解析度)
// Linux: 通常 1'000'000 (1μs 解析度)
typedef long clock_t; // 有號長整數
關鍵語意:測量的是 CPU 時間,非牆鐘時間
- 單執行緒:CPU 時間 ≈ 牆鐘時間
- 多執行緒:CPU 時間 = 所有執行緒 CPU 時間總和,可能遠大於牆鐘時間
- 阻塞/睡眠:不消耗 CPU 時間,
clock() 不增加
基本計時範例
#include
#include
void time_empty_loop() {
const long N = 10'000'000;
clock_t start = clock();
for (long i = 0; i < N; ++i) {} // 空迴圈
clock_t end = clock();
double cpu_seconds = double(end - start) / CLOCKS_PER_SEC;
std::printf("CPU time: %.6f seconds\n", cpu_seconds);
}
精度限制與跨平台差異
| 平台 | CLOCKS_PER_SEC | 解析度 | 備註 |
| Windows (MSVC) | 1000 | 1 ms | 系統時鐘中斷頻率,不可透過修改巨集提高精度 |
| Linux (glibc) | 1'000'000 | 1 μs | 對應 times() 系統呼叫 |
| 嵌入式 | 視硬體定時器 | 不定 | 需查閱編譯器文件 |
標準保證:clock() 解析度 ≥ 1ms,無上限保證。高精度需求請用 <chrono>。
常見錯誤與避坑
- ❌ 修改
#define CLOCKS_PER_SEC 1000000 以提高精度 → ✅ 僅改變換算係數,實際解析度不變,反導致計算錯誤
- ❌ 用於測量 I/O、網路、睡眠等待 → ✅ 這些不消耗 CPU,結果接近 0
- ❌ 多執行緒程式直接比較 CPU 時間 → ✅ 需區分「總 CPU 時間」vs「牆鐘時間」
- ❌ 長時間運行
clock_t 溢位 (32-bit 約 24.8 天) → ✅ 用 64-bit clock_t 或 chrono
現代 C++ 替代方案完勝 clock()
| 需求 | 推薦方案 | 精度 | 語意 |
| 高精度效能分析 | std::chrono::high_resolution_clock | 納秒級 | 牆鐘時間 (通常) |
| 單調計時/超時判斷 | std::chrono::steady_clock | 納秒級 | 單調、不受系統時間調整 |
| 牆鐘時間/時間戳記 | std::chrono::system_clock | 納秒級 | UTC 時間點,可轉 time_t |
| 執行緒 CPU 時間 | std::chrono::thread_clock (C++26 提案) | 納秒級 | 單一執行緒 CPU 時間 |
C++11 現代計時標準寫法
#include
#include
void modern_timing() {
using namespace std::chrono;
auto start = high_resolution_clock::now();
// ... 待測程式碼 ...
auto end = high_resolution_clock::now();
double elapsed_ms = duration(end - start).count();
std::cout << "Elapsed: " << elapsed_ms << " ms\n";
}
總結建議
- 教學/舊代碼維護:理解
clock() 測量 CPU 時間、解析度平台相關、不可人為提高精度
- 所有新專案:完全棄用
clock(),改用 <chrono> 三大時鐘
- 跨平台基準測試:使用
steady_clock 確保單調性,多次執行取中位數
- 生產環境監控:
system_clock 產生 UTC 時間戳,配合 OpenTelemetry/Prometheus
clock() 是 C 時代遺產,精度低、語意易誤解、無執行緒感知。現代 C++ <chrono> 提供型別安全、納秒精度、豐富時鐘語意,是計時功能的唯一正解。
- 上一篇文章: C++ 時間處理核心概念:UTC、Calendar Time、Epoch 與 Clock Tick
- 下一篇文章: C++ 預處理指令完全指南:#define、#include、條件編譯與現代替代方案
Copyright ©
程式碼之家 All Rights Reserved