1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/base/Measure.cc
14 #include <sys/times.h>
19 #include "zypp/base/Logger.h"
20 #include "zypp/base/Measure.h"
21 #include "zypp/base/String.h"
25 #undef ZYPP_BASE_LOGGER_LOGGROUP
26 #define ZYPP_BASE_LOGGER_LOGGROUP "Measure"
28 ///////////////////////////////////////////////////////////////////
30 { /////////////////////////////////////////////////////////////////
31 ///////////////////////////////////////////////////////////////////
33 { /////////////////////////////////////////////////////////////////
35 /** Times measured by \ref Measure. */
49 Tm operator-( const Tm & rhs ) const
52 ret._real -= rhs._real;
53 ret._proc.tms_utime -= rhs._proc.tms_utime;
54 ret._proc.tms_stime -= rhs._proc.tms_stime;
55 ret._proc.tms_cutime -= rhs._proc.tms_cutime;
56 ret._proc.tms_cstime -= rhs._proc.tms_cstime;
60 std::string asString() const
62 std::string ret( timeStr( _real ) );
64 ret += timeStr( asSec( _proc.tms_utime ) );
66 ret += timeStr( asSec( _proc.tms_stime ) );
68 ret += timeStr( asSec( _proc.tms_cutime + _proc.tms_cstime ) );
73 std::string stringIf( clock_t ticks_r, const std::string & tag_r ) const
79 ret += timeStr( asSec( ticks_r ) );
84 double asSec( clock_t ticks_r ) const
85 { return double(ticks_r) / ticks; }
87 std::string timeStr( time_t sec_r ) const
89 time_t h = sec_r/3600;
94 return str::form( "%lu:%02lu:%02lu", h, m, sec_r );
96 return str::form( "%lu:%02lu", m, sec_r );
97 return str::form( "%lu", sec_r );
100 std::string timeStr( double sec_r ) const
102 time_t h = time_t(sec_r)/3600;
104 time_t m = time_t(sec_r)/60;
107 return str::form( "%lu:%02lu:%05.2lf", h, m, sec_r );
109 return str::form( "%lu:%05.2lf", m, sec_r );
110 return str::form( "%.2lf", sec_r );
113 /** Systems ticks per second. */
114 static const long ticks;
115 /** Empty struct tms. */
116 static const struct tms tmsEmpty;
117 /** Real time via \c ::time. */
119 /** Process times via \c ::times. */
123 const struct tms Tm::tmsEmpty = { 0, 0, 0, 0 };
124 const long Tm::ticks = sysconf(_SC_CLK_TCK);
126 /** \refers Tm Stream output. */
127 std::ostream & operator<<( std::ostream & str, const Tm & obj )
129 return str << obj.asString();
133 ///////////////////////////////////////////////////////////////////
135 // CLASS NAME : Measure::Impl
137 /** Measure implementation. */
141 Impl( const std::string & ident_r )
145 INT << "START MEASURE(" << _ident << ")" << endl;
153 std::ostream & str( INT << "MEASURE(" << _ident << ") " );
159 INT << "RESTART MEASURE(" << _ident << ")" << endl;
167 std::ostream & str( INT << "ELAPSED(" << _ident << ") " );
173 std::ostream & dumpMeasure( std::ostream & str_r ) const
175 str_r << ( _stop - _start );
176 if ( _seq > 1 ) // diff to previous _elapsed
178 str_r << " [" << ( _stop - _elapsed ) << "]";
180 return str_r << endl;
186 mutable unsigned _seq;
190 ///////////////////////////////////////////////////////////////////
192 ///////////////////////////////////////////////////////////////////
194 // CLASS NAME : Measure
196 ///////////////////////////////////////////////////////////////////
198 ///////////////////////////////////////////////////////////////////
200 // METHOD NAME : Measure::Measure
201 // METHOD TYPE : Ctor
206 ///////////////////////////////////////////////////////////////////
208 // METHOD NAME : Measure::Measure
209 // METHOD TYPE : Ctor
211 Measure::Measure( const std::string & ident_r )
212 : _pimpl( new Impl( ident_r ) )
215 ///////////////////////////////////////////////////////////////////
217 // METHOD NAME : Measure::~Measure
218 // METHOD TYPE : Dtor
223 ///////////////////////////////////////////////////////////////////
225 // METHOD NAME : Measure::start
226 // METHOD TYPE : void
228 void Measure::start( const std::string & ident_r )
231 _pimpl.reset( new Impl( ident_r ) );
234 ///////////////////////////////////////////////////////////////////
236 // METHOD NAME : Measure::start
237 // METHOD TYPE : void
239 void Measure::restart()
244 ///////////////////////////////////////////////////////////////////
246 // METHOD NAME : Measure::
247 // METHOD TYPE : void
249 void Measure::elapsed() const
255 ///////////////////////////////////////////////////////////////////
257 // METHOD NAME : Measure::
258 // METHOD TYPE : void
265 /////////////////////////////////////////////////////////////////
267 ///////////////////////////////////////////////////////////////////
268 /////////////////////////////////////////////////////////////////
270 ///////////////////////////////////////////////////////////////////