簡體   English   中英

使用std :: chrono :: duration_cast進行1秒和2秒的奇怪結果

[英]Weird result with std::chrono::duration_cast for 1 second and 2 second

我運行一個簡單的程序在那里,我采取了time_pointsystem_clock::nowthis_thread::sleep_for(seconds(1))並再次time_pointsystem_clock::now

現在,如果我為第一個time_point添加一些額外的duration ,它會在1秒和2秒內給出完全相同的結果!

這是演示代碼

#include<iostream>
#include<chrono>
#include<thread>
using namespace std;

void CheckDuration (std::chrono::duration<int> seconds)
{
  auto start = std::chrono::system_clock::now() + seconds;
  std::this_thread::sleep_for(std::chrono::seconds(1));
  auto stop = std::chrono::system_clock::now();

  cout << "Difference = " << std::chrono::duration_cast<std::chrono::seconds>(stop-start).count() << endl;
}

int main ()
{
  CheckDuration(std::chrono::duration<int>(0));  // Difference = 1
  CheckDuration(std::chrono::duration<int>(1));  // Difference = 0 
  CheckDuration(std::chrono::duration<int>(2));  // Difference = 0  <=== ???
  CheckDuration(std::chrono::duration<int>(3));  // Difference = -1
}

它澄清了添加更精細單位的輸出,例如:

cout << "Difference = " << std::chrono::duration_cast<std::chrono::milliseconds>(stop-start).count() << endl;

對我來說,對於第三種情況(參數2秒),輸出為:

Difference = -998

(以毫秒為單位)

要分析這一點,讓T0表示在CheckDuration首次調用now()的時間。 所以:

start == T0 + 2s

在T0調用stop ,加上1秒睡眠,再加上我們可以調用epsilon的一小部分處理時間。 所以:

stop == T0 + 1s + epsilon

減去這兩個,我們得到:

T0 + 1s + epsilon - (T0 + 2s)

簡化:

epsilon - 1s

就我而言, epsilon == 2ms

當無法准確轉換時, duration_cast具有截斷為零的行為。 所以-998ms截斷為0。 對於其他可能有助於計算的持續時間和時間點舍入模式,請參閱:

http://howardhinnant.github.io/duration_io/chrono_util.html

暫無
暫無

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

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