本文呈現一個輕量級、跨平台、標準 C++ 的計時器類 Time,封裝 <ctime> 底層 API,提供毫秒級差值計算、日期時間分量提取、ASCII 格式化輸出等功能,適合性能分析、日誌時間戳、基準測試等場景。
tm 結構與 ASCII 字符串按需生成,避免重複轉換開銷。mark() 記錄基準時間點,delta() 計算秒級差值。hour()、dayOfYear() 等便捷訪問器。#ifndef CPPTIME_H
#define CPPTIME_H
#include
#include
class Time {
time_t t; // 時間戳(秒)
tm local; // 分解後本地時間
char asciiRep[26]; // asctime 輸出緩衝
unsigned char lflag, aflag; // 延遲計算標記
void updateLocal() {
if (!lflag) {
local = *localtime(&t);
lflag = 1;
}
}
void updateAscii() {
if (!aflag) {
updateLocal();
strcpy(asciiRep, asctime(&local));
aflag = 1;
}
}
public:
Time() { mark(); }
void mark() { // 重置基準點
lflag = aflag = 0;
time(&t);
}
const char* ascii() { // "Wed Jan 02 02:03:55 1980\n\0"
updateAscii();
return asciiRep;
}
int delta(const Time* other) const { // 秒級差值
return int(difftime(t, other->t));
}
// 日期時間分量訪問器
int daylightSavings() { updateLocal(); return local.tm_isdst; }
int dayOfYear() { updateLocal(); return local.tm_yday; } // 0-365
int dayOfWeek() { updateLocal(); return local.tm_wday; } // 0=Sun
int since1900() { updateLocal(); return local.tm_year; } // 年份-1900
int month() { updateLocal(); return local.tm_mon; } // 0=Jan
int dayOfMonth() { updateLocal(); return local.tm_mday; }
int hour() { updateLocal(); return local.tm_hour; }
int minute() { updateLocal(); return local.tm_min; }
int second() { updateLocal(); return local.tm_sec; }
};
#endif // CPPTIME_H
#include "Cpptime.h"
#include
using namespace std;
int main() {
Time start;
for (int i = 1; i < 1000; i++) {
cout << i << ' ';
if (i % 10 == 0) cout << endl;
}
Time end;
cout << "\nstart = " << start.ascii();
cout << "end = " << end.ascii();
cout << "delta = " << end.delta(&start) << " seconds\n";
return 0;
}
| 需求 | 實現方向 |
|---|---|
| 毫秒/微秒精度 | 改用 clock_gettime(CLOCK_MONOTONIC, &ts) (POSIX) 或 QueryPerformanceCounter (Windows) |
| 線程安全 | 用 localtime_r / localtime_s 替代 localtime;或改用 C++20 <chrono> |
| 格式化自定義 | 增加 format(const char* fmt) 內部調用 strftime |
| RAII 作用域計時 | 提供 ScopedTimer,建構記錄起點,析構自動輸出耗時 |
<chrono>#include
#include
using namespace std::chrono;
auto start = high_resolution_clock::now();
// ... 代碼區塊 ...
auto end = high_resolution_clock::now();
auto duration = duration_cast(end - start);
cout << "耗時: " << duration.count() << " ms\n";
優勢:類型安全、納秒精度、無平台差異、支援時區/日曆運算。新專案優先採用。
Time 類展示了如何用 標準 C 庫封裝實用工具類:延遲計算減少開銷、const 正確性、跨平台兼容。雖然 C++20 <chrono> 更強大,但在嵌入式、舊標準維護、輕量級依賴受限場景,此類封裝仍具實際價值。理解其設計模式(標記-更新-訪問),有助於構建更複雜的時間處理組件。