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

C++ 高精度計時器類實現:基於 的跨平台時間測量與格式化

     編輯:關於C

本文呈現一個輕量級、跨平台、標準 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,建構記錄起點,析構自動輸出耗時

現代化替代:C++20 <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> 更強大,但在嵌入式、舊標準維護、輕量級依賴受限場景,此類封裝仍具實際價值。理解其設計模式(標記-更新-訪問),有助於構建更複雜的時間處理組件。

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