Boost logo

Boost Users :

Subject: Re: [Boost-users] [Chrono] Negative real time
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2012-05-22 15:41:30


Le 22/05/12 18:55, Wilfried Kirschenmann a écrit :
> Dear chrono maintainer team,
>
> Using the following example :
>
> int main(int argc, char **argv)
> {
> boost::chrono::process_real_cpu_clock::time_point start =
> boost::chrono::process_real_cpu_clock::now();
>
> for ( long i = 0; i < 1000; ++i ) std::sqrt( 123.456L ); //
> burn some time
> Sleep(10000); //idle some time
>
> boost::chrono::process_real_cpu_clock::time_point end =
> boost::chrono::process_real_cpu_clock::now();
> std::cout << end << std::endl;
>
> boost::chrono::process_real_cpu_clock::duration elapsed = (end
> - start);
> std::cout << "took real : " << elapsed << "nanoseconds\n";
>
> return 0;
> }
>
> I obtain negative times.
>
> I run boost 1.49 win32 on Windows 7 x64 with Visual studio 2010.
>
> Studying the behavior of the timer, I think that the error is one of
> these :
> - process_real_cpu_clock::now() only stores the current time in a 32
> bit integer instead of a 64 bit integer

I don't know from where are you getting this conclusion.
process_real_cpu_clock is using boost::int_least64_t, as representation.

     typedef duration<boost::int_least64_t, nano> nanoseconds; // at
least 64 bits needed
     class BOOST_CHRONO_DECL process_real_cpu_clock {
     public:
         typedef nanoseconds duration;
         typedef duration::rep rep;
         typedef duration::period period;
         typedef chrono::time_point<process_real_cpu_clock> time_point;
         BOOST_STATIC_CONSTEXPR bool is_steady = true;

         static BOOST_CHRONO_INLINE time_point now() BOOST_NOEXCEPT;
#if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
         static BOOST_CHRONO_INLINE time_point now(system::error_code &
ec );
#endif
     };

> - time_points only prints the 32 lowest bits.
> I came to this conclusion by observing the results printed before they
> got negatives (printing in the loop with the sqrt): 2019000000
> <tel:2019000000> nanoseconds is the last value printed before getting
> negative.

I guess that you have included chrono_io.hpp. Could you confim this? If
not, you will need to get the number of nanoseconds using count()

        std::cout << "took real : " << elapsed.count() <<
"nanoseconds\n";

If you have included it, the output should contain nanoseconds twice. E.g.

2383000 nanoseconds since process start-up
took real : 37000 nanosecondsnanoseconds

>
> Is there any mistake in my way of using this chronometer ?
It depends of whether you have included chrono_io.hpp or not. If not,
could you post the complete program?

HTH,
Vicente



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net