簡體   English   中英

使用 chrono 庫獲取不准確的系統時間

[英]Get system time not accurate by using chrono library

我使用 std::chrono 以 500 毫秒的間隔對系統時間進行采樣。 在每個樣本上,我從上次時間中減去當前時間,並累加結果。 然而,在 1 小時后,總累積時間比一個小時快了大約 50 毫秒。 有人知道原因嗎?獲取系統時間的代碼如下:

void serverTimeResponse(long serverTime) {        
     long localTime =(long)std::chrono::duration_cast<std::chrono::microseconds(now.time_since_epoch()).count();        
      long duration = localtime - serverTime;        
    writeToCsvFile(duration); 

} 

serverTimeResponse 將每 500 毫秒調用一次,因為服務器將通過套接字返回,我將持續時間記錄到 csv 文件中,1 小時后,我看到最后一行持續時間比 csv 文件中第一行持續時間多 50 毫秒。 我懷疑 chrono 庫是否有獲取系統時間的問題。

運行於 ubuntu 18.04

我能理解您要實現的目標,但您可能遇到了與操作系統線程調度相關的問題。 您還沒有生成最小的可重現示例,因此我假設您使用的是例如:

std::this_thread::sleep_for(500ms);

如果是這種情況,那么您將受操作系統的支配,以睡眠正確的時間。

每 500 毫秒采樣一次當前時間並減去上一次時間,這聽起來不錯。 但是,當您休眠 500 毫秒時,操作系統會安排程序在該數字附近的某個時間被喚醒。 請記住,操作系統不是實時的。 他們無法保證您的應用程序會休眠 500 毫秒。

您的樣本之間所有這些微小的睡眠時間差異都會加起來。 下面是一些計算:

You are sampling every 500ms for 1hr:

1000ms * 60s * 60m = 3600000ms  // 1hr in milliseconds
3600000ms / 500ms = 7200        // 7200 samples @ 500ms each
50ms / 7200 =  0.006944444ms    // or 6.944444us error per sample

如您所見,存在 6.9us 的微小誤差。 所以操作系統幾乎休眠了 500 毫秒,但並不完全。 這些小錯誤加起來,就 EXACT 睡眠而言,您無能為力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM