libzypp  11.13.5
Measure.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 extern "C"
13 {
14 #include <sys/times.h>
15 #include <unistd.h>
16 }
17 #include <iostream>
18 
19 #include "zypp/base/Logger.h"
20 #include "zypp/base/Measure.h"
21 #include "zypp/base/String.h"
22 
23 using std::endl;
24 
25 #undef ZYPP_BASE_LOGGER_LOGGROUP
26 #define ZYPP_BASE_LOGGER_LOGGROUP "Measure"
27 
29 namespace zypp
30 {
31 
32  namespace debug
33  {
34 
36  struct Tm
37  {
38  Tm()
39  : _real( 0 )
40  , _proc( tmsEmpty )
41  {}
42 
43  void get()
44  {
45  _real = ::time(NULL);
46  ::times( &_proc );
47  }
48 
49  Tm operator-( const Tm & rhs ) const
50  {
51  Tm ret( *this );
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;
57  return ret;
58  }
59 
60  std::string asString() const
61  {
62  std::string ret( timeStr( _real ) );
63  ret += " (u ";
64  ret += timeStr( asSec( _proc.tms_utime ) );
65  ret += " s ";
66  ret += timeStr( asSec( _proc.tms_stime ) );
67  ret += " c ";
68  ret += timeStr( asSec( _proc.tms_cutime + _proc.tms_cstime ) );
69  ret += ")";
70  return ret;
71  }
72 
73  std::string stringIf( clock_t ticks_r, const std::string & tag_r ) const
74  {
75  std::string ret;
76  if ( ticks_r )
77  {
78  ret += tag_r;
79  ret += timeStr( asSec( ticks_r ) );
80  }
81  return ret;
82  }
83 
84  double asSec( clock_t ticks_r ) const
85  { return double(ticks_r) / ticks; }
86 
87  std::string timeStr( time_t sec_r ) const
88  {
89  time_t h = sec_r/3600;
90  sec_r -= h*3600;
91  time_t m = sec_r/60;
92  sec_r -= m*60;
93  if ( h )
94  return str::form( "%lu:%02lu:%02lu", h, m, sec_r );
95  if ( m )
96  return str::form( "%lu:%02lu", m, sec_r );
97  return str::form( "%lu", sec_r );
98  }
99 
100  std::string timeStr( double sec_r ) const
101  {
102  time_t h = time_t(sec_r)/3600;
103  sec_r -= h*3600;
104  time_t m = time_t(sec_r)/60;
105  sec_r -= m*60;
106  if ( h )
107  return str::form( "%lu:%02lu:%05.2lf", h, m, sec_r );
108  if ( m )
109  return str::form( "%lu:%05.2lf", m, sec_r );
110  return str::form( "%.2lf", sec_r );
111  }
112 
114  static const long ticks;
116  static const struct tms tmsEmpty;
118  time_t _real;
120  struct tms _proc;
121  };
122 
123  const struct tms Tm::tmsEmpty = { 0, 0, 0, 0 };
124  const long Tm::ticks = sysconf(_SC_CLK_TCK);
125 
127  std::ostream & operator<<( std::ostream & str, const Tm & obj )
128  {
129  return str << obj.asString();
130  }
131 
132 
134  //
135  // CLASS NAME : Measure::Impl
136  //
139  {
140  public:
141  Impl( const std::string & ident_r )
142  : _ident ( ident_r )
143  , _seq ( 0 )
144  {
145  INT << "START MEASURE(" << _ident << ")" << endl;
146  _start.get();
147  }
148 
150  {
151  _stop.get();
152  ++_seq;
153  std::ostream & str( INT << "MEASURE(" << _ident << ") " );
154  dumpMeasure( str );
155  }
156 
157  void restart()
158  {
159  INT << "RESTART MEASURE(" << _ident << ")" << endl;
160  _start = _stop;
161  }
162 
163  void elapsed() const
164  {
165  _stop.get();
166  ++_seq;
167  std::ostream & str( INT << "ELAPSED(" << _ident << ") " );
168  dumpMeasure( str );
169  _elapsed = _stop;
170  }
171 
172  private:
173  std::ostream & dumpMeasure( std::ostream & str_r ) const
174  {
175  str_r << ( _stop - _start );
176  if ( _seq > 1 ) // diff to previous _elapsed
177  {
178  str_r << " [" << ( _stop - _elapsed ) << "]";
179  }
180  return str_r << endl;
181  }
182 
183  private:
184  std::string _ident;
186  mutable unsigned _seq;
187  mutable Tm _elapsed;
188  mutable Tm _stop;
189  };
191 
193  //
194  // CLASS NAME : Measure
195  //
197 
199  //
200  // METHOD NAME : Measure::Measure
201  // METHOD TYPE : Ctor
202  //
204  {}
205 
207  //
208  // METHOD NAME : Measure::Measure
209  // METHOD TYPE : Ctor
210  //
211  Measure::Measure( const std::string & ident_r )
212  : _pimpl( new Impl( ident_r ) )
213  {}
214 
216  //
217  // METHOD NAME : Measure::~Measure
218  // METHOD TYPE : Dtor
219  //
221  {}
222 
224  //
225  // METHOD NAME : Measure::start
226  // METHOD TYPE : void
227  //
228  void Measure::start( const std::string & ident_r )
229  {
230  stop();
231  _pimpl.reset( new Impl( ident_r ) );
232  }
233 
235  //
236  // METHOD NAME : Measure::start
237  // METHOD TYPE : void
238  //
240  {
241  _pimpl->restart();
242  }
243 
245  //
246  // METHOD NAME : Measure::
247  // METHOD TYPE : void
248  //
249  void Measure::elapsed() const
250  {
251  if ( _pimpl )
252  _pimpl->elapsed();
253  }
254 
256  //
257  // METHOD NAME : Measure::
258  // METHOD TYPE : void
259  //
261  {
262  _pimpl.reset();
263  }
264 
266  } // namespace debug
269 } // namespace zypp