深入理解std chrono的時鐘Clock

2022-06-20 05:48:06 字數 1902 閱讀 5435

std::chrono是c++11引入的日期時間處理庫,其中包含3種時鐘:system_clock,steady_clock,high_resolution_clock。近來需要使用高精度時間,很自然想到使用high_resolution_clock,然而使用後發現並非預期的得到自1970/1/1零點之後的計數,而是乙個小得多的數字。那麼這三種時鐘有什麼區別,用在什麼情況下,我們來一**竟。

auto tp = std::chrono::high_resolution_clock::now();

std::cout << tp.time_since_epoch().count() << std::endl;

上述**輸出乙個比較小的數字,high_resolution_clock的精度是納秒,不可能是這麼小的數字。

所謂時鐘,是指從乙個時點開始,按照某個刻度的乙個計數。如下**摘自vc2017。

struct system_clock

{ // wraps getsystemtimepreciseasfiletime/getsystemtimeasfiletime

typedef long long rep;

typedef ratio_multiply, nano> period;

typedef chrono::durationduration;

typedef chrono::time_pointtime_point;

static constexpr bool is_steady = false;

對於system_clock,其起點是epoch,即1970-01-01 00:00:00 utc,其刻度是1個tick,也就是_xtime_nsecs_per_tick納秒。

typedef steady_clock high_resolution_clock;
high_resolution_clock實際上和steady_clock一樣。

struct steady_clock

{ // wraps queryperformancecounter

typedef long long rep;

typedef nano period;

typedef nanoseconds duration;

typedef chrono::time_pointtime_point;

static constexpr bool is_steady = true;

steady_clock的刻度是1納秒,起點並非1970-01-01 00:00:00 utc,一般是系統啟動時間,這就是問題的關鍵。steady_clock的作用是為了得到不隨系統時間修改而變化的時間間隔,所以凡是想得到絕對時點的用法都是錯誤的。steady_clock是沒有to_time_t()的實現的,而system_clock是有的。

auto tp = std::chrono::system_clock::now();

std::time_t tt = std::chrono::system_clock::to_time_t(tp);

std::cout << tt << "seconds from 1970-01-01 00:00:00 utc" << std::endl;

auto tp1 = std::chrono::steady_clock::now();

//do something

auto tp2 = std::chrono::steady_clock::now();

std::cout << std::chrono::duration_cast(tp2 - tp1).count() << "microseconds" << std::endl;

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...