2014-12-27 73 views
4

我运行一个简单的程序在那里,我采取了time_pointsystem_clock::now然后this_thread::sleep_for(seconds(1))并再次time_pointsystem_clock::now怪异的结果与标准::时辰:: duration_cast 1秒秒和2秒

现在,如果我在第一个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 
} 

回答

6

据澄清添加输出与更精细的单位,例如:

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

对我来说,对于第三壳体(参数2秒),则输出是:

Difference = -998 

(即以毫秒为单位)

为了分析这个,让T0代表now()首先在CheckDuration中调用的时间。所以:

start == T0 + 2s 

stop被称为在T0,加上睡眠1秒,加的处理时间一点点,我们可以调用小量。所以:

stop == T0 + 1s + epsilon 

减去这两项,我们得到:

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

简化:

epsilon - 1s 

在我的情况下,小量 == 2ms的

duration_cast具有的行为截断为零当转换不能准确。所以-998ms截断为0。对于其他可能有助于计算的持续时间和时间点舍入模式,请参阅:

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