Reputation: 3505
The following rough code, based on the documentation, gives me the elapsed time in seconds from the timer object provided in boost.
boost::timer::cpu_timer timer;
// ...do some work...
const boost::timer::nanosecond_type oneSecond(1000000000LL);
return timer.elapsed().user / oneSecond;
The problem with this method is that I have this uncomfortable magic number in my code. Is there some method within boost that can give me elapsed seconds out of the nanosecond_type value available from the call to elapsed().user, without having this magic number sitting in my code?
(EDIT:) Conclusion:
Based on the accepted answer, I ended up with this snippet in my production code:
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;
Upvotes: 5
Views: 15585
Reputation: 65
The boost::timer::auto_cpu_timer can be useful:
#include <boost/timer/timer.hpp>
#include <cmath>
int main()
{
boost::timer::auto_cpu_timer t;
for (long i = 0; i < 100000000; ++i)
std::sqrt(123.456L); // burn some time
return 0;
}
https://www.boost.org/doc/libs/1_83_0/libs/timer/doc/cpu_timers.html
Upvotes: 0
Reputation: 2674
One more addition:
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;
}
This you can call with timer.elapsed().user
for example to get a double value of the elapsed time. This can obviously also transformed to std::chrono
, if wanted / supported.
Upvotes: 1
Reputation: 3713
As @jogojapan suggested, boost::chrono would be a good choice. But you don't need the duration_cast<> if you use double
as underlying type.
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.
Upvotes: 9
Reputation: 8499
You should measure the number of tick per nanosecond on each Hardware your soft run.. take a look at ( Timer function to provide time in nano seconds using C++)
Upvotes: 0