如何从boost :: timer :: cpu_timer获取经过的时间(以秒为单位)?

时间:2013-06-26 02:44:47

标签: c++ boost

以下粗略代码基于the documentation,给出了在boost中提供的计时器对象所用的经过时间(秒)。

boost::timer::cpu_timer timer;
// ...do some work...
const boost::timer::nanosecond_type oneSecond(1000000000LL);
return timer.elapsed().user / oneSecond;

这种方法的问题在于我的代码中有这个令人不舒服的幻数。在提升中是否有一些方法可以让我经过秒超出对 elapsed()。用户的调用中可用的 nanosecond_type 值,没有将这个神奇的数字放在我的代码中?

(编辑:)结论:

根据接受的答案,我最终在我的生产代码中使用了这个代码段:

boost::timer::cpu_timer timer;
// ...do some work...
auto nanoseconds = boost::chrono::nanoseconds(timer.elapsed().user + timer.elapsed().system);
auto seconds = boost::chrono::duration_cast<boost::chrono::seconds>(nanoseconds);
std::cout << seconds.count() << std::endl;

3 个答案:

答案 0 :(得分:8)

正如@jogojapan所说,boost::chrono将是一个不错的选择。但是你不需要duration_cast&lt;&gt;如果您使用double作为基础类型。

typedef boost::chrono::duration<double> sec; // seconds, stored with a double
sec seconds = boost::chrono::nanoseconds(timer.elapsed().user);
std::cout << seconds.count() << "s\n"; // gives the number of seconds, as double.

答案 1 :(得分:1)

又一个补充:

double
getSeconds( const boost::timer::nanosecond_type& elapsed )
{
  return
    static_cast< double >(
      boost::chrono::nanoseconds( elapsed ).count()
    ) * boost::chrono::nanoseconds::period::num / boost::chrono::nanoseconds::period::den;
}

例如,您可以使用timer.elapsed().user进行调用以获取经过时间的两倍值。如果需要/支持,显然也可以将其转换为std::chrono

答案 2 :(得分:0)

您应该测量每个硬件运行时每纳秒的滴答数。 看一眼 ( Timer function to provide time in nano seconds using C++