![](/img/trans.png)
[英]std::chrono::duration_cast - any unit more precise than nano-second?
[英]Weird result with std::chrono::duration_cast for 1 second and 2 second
我運行一個簡單的程序在那里,我采取了time_point
與system_clock::now
則this_thread::sleep_for(seconds(1))
並再次time_point
與system_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。 對於其他可能有助於計算的持續時間和時間點舍入模式,請參閱:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.