在std :: chrono时钟

时间:2017-09-01 15:18:51

标签: c++ linux c++11

这篇文章的标题行实际上只是我问题的一半(更简单的一半)。所以,我会退一步谈谈我想要做的事情。

使用std::chrono衡量已用时间非常容易。但是,我还没有看到任何"定时器"迄今为止的实施方式,相当于秒表上的圈数。也就是说,当您想要开始跟踪间隔时,请致电Timer.start(),并在每次要记录间隔时调用Timer.tick()。然后,在快速的东西结束后,你可以回顾记录的时间间隔列表;可能占平均值和1%的高点。

另外,因为我经常使用它,所以我想随意询问计时器自午夜起已经过了几微秒。

这个虚构类的构造函数的第一个任务是在内部设置午夜。最初,我是通过this精彩答案的技巧来做到这一点的。不过,当我开始实现Timer类的概念时,我意识到我想使用high_resolution_clocksteady_clock(即使system_clock在我的平台上使用纳秒间隔)。然后出现问题:如何将chrono::steady_clock::time_point设置为午夜?

只有system_clockto_time_tfrom_time_t,据我所知,这是表达"今天午夜和#34的唯一方式;以chrono理解的方式。对于我昨晚的所有阅读,我无法找到将system_clock::time_point投射到steady_clock::time_point的方法。我最近的尝试是:

typedef std::conditional<std::chrono::high_resolution_clock::is_steady,
                         std::chrono::high_resolution_clock,
                         std::chrono::steady_clock>::type TimerClock;

TimerClock::time_point midnight;

chrono::system_clock::time_point current_time = chrono::system_clock::now();

time_t raw_time = chrono::system_clock::to_time_t(current_time);

tm *tm_midnight = localtime(&raw_time);
tm_midnight->tm_hour = 0;
tm_midnight->tm_min  = 0;
tm_midnight->tm_sec  = 0;

midnight = chrono::system_clock::from_time_t(mktime(tm_midnight));

但显然不会飞。就我所知,chrono::time_point_cast旨在让您访问来自同一时钟类型的不同分辨率。

这给我留下了两条路线/问题:

  • 我可以直接将time_pointhigh_precision_clock的{​​{1}}的值设置为&#34;今天是午夜&#34;
  • 我可以转换steady_clock与其他system_clock::time_point时钟一起使用吗?

当然,我很高兴能够指出一种更好的方法来处理这一切,如果它仍然符合我的总体目标。

提前致谢。 =)

1 个答案:

答案 0 :(得分:2)

计算系统时钟的午夜。

获取系统时钟和你想要午夜时钟的时间点,同时&#34;&#34; (约)。把这个时间点称为X。

在系统时钟上将间隔从午夜转换为X.转换为皮秒(或任何分辨率)的持续时间。

你现在有午夜的时间,以皮秒为单位,时间点为你希望午夜的时间点。

请注意,这基本上是近似的,因为&#34;时间X&#34;对于系统时钟和你关心的时钟来说,这将是一条分界线。但它只会在计算时间戳所需的时间上有所不同。如果你真的在乎,你可以做两个系统时钟样本来制作目标时钟并平均从午夜开始的时间。