我正在运行一个简单的程序,其中,我使用 system_clock::now
获取一个 time_point
,然后使用 this_thread::sleep_for(seconds(1))
和 time_point
与 system_clock::now
。
现在,如果我向第一个 time_point
添加一些额外的 duration
,它会在 1 秒和 2 秒内给出完全相同的结果!
这是 demo code :
#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;
对我来说,对于第 3 种情况(参数 2 秒),输出是:
Difference = -998
(以毫秒为单位)
为了对此进行分析,让T0
表示在CheckDuration
中首次调用now()
的时间。所以:
start == T0 + 2s
stop
在 T0 时被调用,再加上 1 秒的休眠时间,再加上我们可以调用 epsilon 的一小部分处理时间。所以:
stop == T0 + 1s + epsilon
减去这两个我们得到:
T0 + 1s + epsilon - (T0 + 2s)
简化:
epsilon - 1s
在我的例子中,epsilon == 2ms
duration_cast
在无法准确进行转换时具有向零截断 的行为。所以 -998ms 截断为 0s。对于可能对您的计算有帮助的其他持续时间和时间点舍入模式,请参见:
关于c++ - std::chrono::duration_cast 1 秒和 2 秒的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670821/