【问题标题】:Weird result with std::chrono::duration_cast for 1 second and 2 secondstd::chrono::duration_cast 1 秒和 2 秒的奇怪结果
【发布时间】:2015-02-24 13:46:35
【问题描述】:

我正在运行一个简单的程序,我在其中使用time_pointsystem_clock::now,然后是this_thread::sleep_for(seconds(1)),然后又是time_pointsystem_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
}

【问题讨论】:

    标签: c++ c++11 output duration chrono


    【解决方案1】:

    明确添加更精细单位的输出,例如:

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

    对我来说,对于第三种情况(参数 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 被截断为 0。有关可能对您的计算有帮助的其他持续时间和时间点舍入模式,请参阅:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多