diff --git a/src/tl/tl/tlTimer.cc b/src/tl/tl/tlTimer.cc index 3a3f4bb8b..5deaf5869 100644 --- a/src/tl/tl/tlTimer.cc +++ b/src/tl/tl/tlTimer.cc @@ -32,7 +32,6 @@ #endif #include -#include #ifndef _MSC_VER // not available on MS VC++ # include @@ -67,7 +66,7 @@ void Timer::start () { #ifdef _WIN32 - long clks_ms = (long) ((double) clock () * (1000.0 / CLOCKS_PER_SEC) + 0.5); + timer_t clks_ms = (timer_t) ((double) clock () * (1000.0 / CLOCKS_PER_SEC) + 0.5); m_user_ms += clks_ms; // no system time available .. #else @@ -75,8 +74,8 @@ Timer::start () times (&clks); const double clk2msec = 1000.0 / sysconf (_SC_CLK_TCK); - m_user_ms += (long) ((clks.tms_utime + clks.tms_cutime) * clk2msec + 0.5); - m_sys_ms += (long) ((clks.tms_stime + clks.tms_cstime) * clk2msec + 0.5); + m_user_ms += (timer_t) ((clks.tms_utime + clks.tms_cutime) * clk2msec + 0.5); + m_sys_ms += (timer_t) ((clks.tms_stime + clks.tms_cstime) * clk2msec + 0.5); #endif m_wall_ms += msecs_to (QDateTime::fromTime_t (0), QDateTime::currentDateTime ()); } @@ -97,6 +96,27 @@ Timer::stop () m_wall_ms = 0; } +void +Timer::take () +{ + timer_t user_ms = m_user_ms; + timer_t sys_ms = m_sys_ms; + timer_t wall_ms = m_wall_ms; + + m_user_ms = -m_user_ms; + m_sys_ms = -m_sys_ms; + m_wall_ms = -m_wall_ms; + start (); + + m_user_ms_res = m_user_ms; + m_sys_ms_res = m_sys_ms; + m_wall_ms_res = m_wall_ms; + + m_user_ms = user_ms; + m_sys_ms = sys_ms; + m_wall_ms = wall_ms; +} + void SelfTimer::report () const { @@ -168,20 +188,20 @@ SelfTimer::report () const Clock::Clock (double s) { - m_clock = clock_value (s * double (CLOCKS_PER_SEC)); + m_clock_ms = s * 1000.0; } double Clock::seconds () const { - return double (m_clock) / double (CLOCKS_PER_SEC); + return double (m_clock_ms) * 0.001; } Clock Clock::current () { Clock c; - c.m_clock = clock (); + c.m_clock_ms += msecs_to (QDateTime::fromTime_t (0), QDateTime::currentDateTime ()); return c; } diff --git a/src/tl/tl/tlTimer.h b/src/tl/tl/tlTimer.h index c64ba4d72..5848c2f61 100644 --- a/src/tl/tl/tlTimer.h +++ b/src/tl/tl/tlTimer.h @@ -26,7 +26,7 @@ #include "tlCommon.h" -#include +#include #include class QDateTime; @@ -50,6 +50,8 @@ TL_PUBLIC int64_t msecs_to (const QDateTime &from, const QDateTime &to); class TL_PUBLIC Timer { public: + typedef int64_t timer_t; + Timer (); /** @@ -59,10 +61,16 @@ public: /** * @brief Stops the timer + * Only after stop or take, the time can be read with sec_user etc. */ void stop (); - /** + /** + * @brief Takes the time, but does not stop + */ + void take (); + + /** * @brief Reports the time spent between start() and stop() in user space */ double sec_user () const @@ -87,8 +95,8 @@ public: } private: - long m_user_ms, m_sys_ms, m_wall_ms; - long m_user_ms_res, m_sys_ms_res, m_wall_ms_res; + timer_t m_user_ms, m_sys_ms, m_wall_ms; + timer_t m_user_ms_res, m_sys_ms_res, m_wall_ms_res; }; /** @@ -152,12 +160,14 @@ private: class TL_PUBLIC Clock { public: + typedef int64_t timer_t; + typedef unsigned long clock_value; /** * @brief Default constructor: construct a clock object pointing to an arbitrary value */ - Clock () : m_clock (0) + Clock () : m_clock_ms (0) { // .. nothing yet .. } @@ -171,7 +181,7 @@ public: * @brief Copy constructor */ Clock (const Clock &d) - : m_clock (d.m_clock) + : m_clock_ms (d.m_clock_ms) { // .. nothing yet .. } @@ -181,7 +191,7 @@ public: */ Clock &operator= (Clock d) { - m_clock = d.m_clock; + m_clock_ms = d.m_clock_ms; return *this; } @@ -190,7 +200,7 @@ public: */ bool operator== (Clock d) const { - return m_clock == d.m_clock; + return m_clock_ms == d.m_clock_ms; } /** @@ -206,8 +216,7 @@ public: */ bool operator< (Clock d) const { - // to account for wrap around, we do the comparison this way: - return long (m_clock) - long (d.m_clock) < 0; + return m_clock_ms < d.m_clock_ms; } /** @@ -215,7 +224,7 @@ public: */ Clock &operator-= (Clock d) { - m_clock -= d.m_clock; + m_clock_ms -= d.m_clock_ms; return *this; } @@ -240,7 +249,7 @@ public: static Clock current (); private: - clock_value m_clock; + timer_t m_clock_ms; }; } // namespace tl