[英]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.