gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Port time and counter utilities from svn -r3482 The mingw support has been removed
0 2 4
default
6 files changed with 857 insertions and 0 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_COUNTER_H
20
#define LEMON_COUNTER_H
21

	
22
#include <string>
23
#include <iostream>
24

	
25
///\ingroup timecount
26
///\file
27
///\brief Tools for counting steps and events
28

	
29
namespace lemon 
30
{
31

	
32
  template<class P> class _SubNoCounter;
33

	
34
  template<class P>
35
  class _SubCounter 
36
  {
37
    P &_parent;
38
    std::string _title;
39
    std::ostream &_os;
40
    int count;
41
  public:
42

	
43
    typedef _SubCounter<_SubCounter<P> > SubCounter;
44
    typedef _SubNoCounter<_SubCounter<P> > SubNoCounter;
45

	
46
    _SubCounter(P &parent)
47
      : _parent(parent), _title(), _os(std::cerr), count(0) {}
48
    _SubCounter(P &parent,std::string title,std::ostream &os=std::cerr)
49
      : _parent(parent), _title(title), _os(os), count(0) {}
50
    _SubCounter(P &parent,const char *title,std::ostream &os=std::cerr)
51
      : _parent(parent), _title(title), _os(os), count(0) {}
52
    ~_SubCounter() { 
53
      _os << _title << count <<std::endl;
54
      _parent+=count;
55
    }
56
    _SubCounter &operator++() { count++; return *this;}
57
    int operator++(int) { return count++; }
58
    _SubCounter &operator--() { count--; return *this;}
59
    int operator--(int) { return count--; }
60
    _SubCounter &operator+=(int c) { count+=c; return *this;}
61
    _SubCounter &operator-=(int c) { count-=c; return *this;}
62
    void reset(int c=0) {count=c;}
63
    operator int() {return count;}
64
  };
65

	
66
  template<class P>
67
  class _SubNoCounter 
68
  {
69
    P &_parent;
70
  public:
71
    typedef _SubNoCounter<_SubNoCounter<P> > SubCounter;
72
    typedef _SubNoCounter<_SubNoCounter<P> > SubNoCounter;
73
  
74
    _SubNoCounter(P &parent) :_parent(parent) {}
75
    _SubNoCounter(P &parent,std::string,std::ostream &) 
76
      :_parent(parent) {}
77
    _SubNoCounter(P &parent,std::string) 
78
      :_parent(parent) {}
79
    _SubNoCounter(P &parent,const char *,std::ostream &)
80
      :_parent(parent) {}
81
    _SubNoCounter(P &parent,const char *)
82
      :_parent(parent) {}
83
    ~_SubNoCounter() {}
84
    _SubNoCounter &operator++() { ++_parent; return *this;}
85
    int operator++(int) { _parent++; return 0;}
86
    _SubNoCounter &operator--() { --_parent; return *this;}
87
    int operator--(int) { _parent--; return 0;}
88
    _SubNoCounter &operator+=(int c) { _parent+=c; return *this;}
89
    _SubNoCounter &operator-=(int c) { _parent-=c; return *this;}
90
    void reset(int) {}
91
    void reset() {}
92
    operator int() {return 0;}
93
  };
94

	
95

	
96
  /// \addtogroup timecount
97
  /// @{
98

	
99
  ///A counter class
100

	
101
  ///This class makes it easier to count certain events. You can increment
102
  ///or decrement the counter using operator++ and operator--.
103
  ///A report is automatically printed on destruction.
104
  ///\todo More doc
105
  class Counter 
106
  {
107
    std::string _title;
108
    std::ostream &_os;
109
    int count;
110
  public:
111
    ///\e
112

	
113
    ///\todo document please.
114
    ///
115
    typedef _SubCounter<Counter> SubCounter;
116
    ///\e
117

	
118
    ///\todo document please.
119
    ///
120
    typedef _SubNoCounter<Counter> SubNoCounter;
121

	
122
    ///\e
123
    Counter() : _title(), _os(std::cerr), count(0) {}
124
    ///\e
125
    Counter(std::string title,std::ostream &os=std::cerr) 
126
      : _title(title), _os(os), count(0) {}
127
    ///\e
128
    Counter(const char *title,std::ostream &os=std::cerr)
129
      : _title(title), _os(os), count(0) {}
130
    ///Destructor. Prints the given title and the value of the counter.
131
    ~Counter() {
132
      _os << _title << count <<std::endl;
133
    }
134
    ///\e
135
    Counter &operator++() { count++; return *this;}
136
    ///\e
137
    int operator++(int) { return count++;}
138
    ///\e
139
    Counter &operator--() { count--; return *this;}
140
    ///\e
141
    int operator--(int) { return count--;}
142
    ///\e
143
    Counter &operator+=(int c) { count+=c; return *this;}
144
    ///\e
145
    Counter &operator-=(int c) { count-=c; return *this;}
146
    ///\e
147
    void reset(int c=0) {count=c;}
148
    ///\e
149
    operator int() {return count;}
150
  };
151

	
152
  ///'Do nothing' version of \ref Counter
153

	
154
  ///'Do nothing' version of \ref Counter.
155
  ///\sa Counter
156
  class NoCounter
157
  {
158
  public:
159
    typedef _SubNoCounter<NoCounter> SubCounter;
160
    typedef _SubNoCounter<NoCounter> SubNoCounter;
161

	
162
    NoCounter() {}
163
    NoCounter(std::string,std::ostream &) {}
164
    NoCounter(const char *,std::ostream &) {}
165
    NoCounter(std::string) {}
166
    NoCounter(const char *) {}
167
    NoCounter &operator++() { return *this; }
168
    int operator++(int) { return 0; }
169
    NoCounter &operator--() { return *this; }
170
    int operator--(int) { return 0; }
171
    NoCounter &operator+=(int) { return *this;}
172
    NoCounter &operator-=(int) { return *this;}
173
    void reset(int) {}
174
    void reset() {}
175
    operator int() {return 0;}
176
  };
177

	
178
  ///@}
179
}
180

	
181
#endif
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_TIME_MEASURE_H
20
#define LEMON_TIME_MEASURE_H
21

	
22
///\ingroup timecount
23
///\file
24
///\brief Tools for measuring cpu usage
25

	
26
#include <sys/times.h>
27

	
28
#include <sys/time.h>
29
#include <fstream>
30
#include <iostream>
31
#include <unistd.h>
32

	
33
namespace lemon {
34

	
35
  /// \addtogroup timecount
36
  /// @{
37

	
38
  /// A class to store (cpu)time instances.
39

	
40
  /// This class stores five time values.
41
  /// - a real time
42
  /// - a user cpu time
43
  /// - a system cpu time
44
  /// - a user cpu time of children
45
  /// - a system cpu time of children
46
  ///
47
  /// TimeStamp's can be added to or substracted from each other and
48
  /// they can be pushed to a stream.
49
  ///
50
  /// In most cases, perhaps the \ref Timer or the \ref TimeReport
51
  /// class is what you want to use instead.
52
  ///
53
  ///\author Alpar Juttner
54

	
55
  class TimeStamp
56
  {
57
    struct rtms 
58
    {
59
      double tms_utime;
60
      double tms_stime;
61
      double tms_cutime;
62
      double tms_cstime;
63
      rtms() {}
64
      rtms(tms ts) : tms_utime(ts.tms_utime), tms_stime(ts.tms_stime),
65
		     tms_cutime(ts.tms_cutime), tms_cstime(ts.tms_cstime) {}
66
    };
67
    rtms ts;
68
    double real_time;
69
  
70
    rtms &getTms() {return ts;}
71
    const rtms &getTms() const {return ts;}
72

	
73
    void _reset() { 
74
      ts.tms_utime = ts.tms_stime = ts.tms_cutime = ts.tms_cstime = 0; 
75
      real_time = 0;
76
    }
77

	
78
  public:
79

	
80
    ///Read the current time values of the process
81
    void stamp()
82
    {
83
      timeval tv;
84
      tms _ts;
85
      times(&_ts);
86
      gettimeofday(&tv, 0);real_time=tv.tv_sec+double(tv.tv_usec)/1e6;
87
      ts=_ts;
88
    }
89
  
90
    /// Constructor initializing with zero
91
    TimeStamp()
92
    { _reset(); }
93
    ///Constructor initializing with the current time values of the process
94
    TimeStamp(void *) { stamp();}
95
  
96
    ///Set every time value to zero
97
    TimeStamp &reset() {_reset();return *this;}
98

	
99
    ///\e
100
    TimeStamp &operator+=(const TimeStamp &b)
101
    {
102
      ts.tms_utime+=b.ts.tms_utime;
103
      ts.tms_stime+=b.ts.tms_stime;
104
      ts.tms_cutime+=b.ts.tms_cutime;
105
      ts.tms_cstime+=b.ts.tms_cstime;
106
      real_time+=b.real_time;
107
      return *this;
108
    }
109
    ///\e
110
    TimeStamp operator+(const TimeStamp &b) const
111
    {
112
      TimeStamp t(*this);
113
      return t+=b;
114
    }
115
    ///\e
116
    TimeStamp &operator-=(const TimeStamp &b)
117
    {
118
      ts.tms_utime-=b.ts.tms_utime;
119
      ts.tms_stime-=b.ts.tms_stime;
120
      ts.tms_cutime-=b.ts.tms_cutime;
121
      ts.tms_cstime-=b.ts.tms_cstime;
122
      real_time-=b.real_time;
123
      return *this;
124
    }
125
    ///\e
126
    TimeStamp operator-(const TimeStamp &b) const
127
    {
128
      TimeStamp t(*this);
129
      return t-=b;
130
    }
131
    ///\e
132
    TimeStamp &operator*=(double b)
133
    {
134
      ts.tms_utime*=b;
135
      ts.tms_stime*=b;
136
      ts.tms_cutime*=b;
137
      ts.tms_cstime*=b;
138
      real_time*=b;
139
      return *this;
140
    }
141
    ///\e
142
    TimeStamp operator*(double b) const
143
    {
144
      TimeStamp t(*this);
145
      return t*=b;
146
    }
147
    friend TimeStamp operator*(double b,const TimeStamp &t);
148
    ///\e
149
    TimeStamp &operator/=(double b)
150
    {
151
      ts.tms_utime/=b;
152
      ts.tms_stime/=b;
153
      ts.tms_cutime/=b;
154
      ts.tms_cstime/=b;
155
      real_time/=b;
156
      return *this;
157
    }
158
    ///\e
159
    TimeStamp operator/(double b) const
160
    {
161
      TimeStamp t(*this);
162
      return t/=b;
163
    }
164
    ///The time ellapsed since the last call of stamp()
165
    TimeStamp ellapsed() const
166
    {
167
      TimeStamp t(NULL);
168
      return t-*this;
169
    }
170
  
171
    friend std::ostream& operator<<(std::ostream& os,const TimeStamp &t);
172
  
173
    ///Gives back the user time of the process
174
    double userTime() const
175
    {
176
      return double(ts.tms_utime)/sysconf(_SC_CLK_TCK);
177
    }
178
    ///Gives back the system time of the process
179
    double systemTime() const
180
    {
181
      return double(ts.tms_stime)/sysconf(_SC_CLK_TCK);
182
    }
183
    ///Gives back the user time of the process' children
184
    double cUserTime() const
185
    {
186
      return double(ts.tms_cutime)/sysconf(_SC_CLK_TCK);
187
    }
188
    ///Gives back the user time of the process' children
189
    double cSystemTime() const
190
    {
191
      return double(ts.tms_cstime)/sysconf(_SC_CLK_TCK);
192
    }
193
    ///Gives back the real time
194
    double realTime() const {return real_time;}
195
  };
196

	
197
  TimeStamp operator*(double b,const TimeStamp &t) 
198
  {
199
    return t*b;
200
  }
201
  
202
  ///Prints the time counters
203

	
204
  ///Prints the time counters in the following form:
205
  ///
206
  /// <tt>u: XX.XXs s: XX.XXs cu: XX.XXs cs: XX.XXs real: XX.XXs</tt>
207
  ///
208
  /// where the values are the
209
  /// \li \c u: user cpu time,
210
  /// \li \c s: system cpu time,
211
  /// \li \c cu: user cpu time of children,
212
  /// \li \c cs: system cpu time of children,
213
  /// \li \c real: real time.
214
  /// \relates TimeStamp
215
  inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t)
216
  {
217
    long cls = sysconf(_SC_CLK_TCK);
218
    os << "u: " << double(t.getTms().tms_utime)/cls <<
219
      "s, s: " << double(t.getTms().tms_stime)/cls <<
220
      "s, cu: " << double(t.getTms().tms_cutime)/cls <<
221
      "s, cs: " << double(t.getTms().tms_cstime)/cls <<
222
      "s, real: " << t.realTime() << "s";
223
    return os;
224
  }
225

	
226
  ///Class for measuring the cpu time and real time usage of the process
227

	
228
  ///Class for measuring the cpu time and real time usage of the process.
229
  ///It is quite easy-to-use, here is a short example.
230
  ///\code
231
  /// #include<lemon/time_measure.h>
232
  /// #include<iostream>
233
  ///
234
  /// int main()
235
  /// {
236
  ///
237
  ///   ...
238
  ///
239
  ///   Timer t;
240
  ///   doSomething();
241
  ///   std::cout << t << '\n';
242
  ///   t.restart();
243
  ///   doSomethingElse();
244
  ///   std::cout << t << '\n';
245
  ///
246
  ///   ...
247
  ///
248
  /// }
249
  ///\endcode
250
  ///
251
  ///The \ref Timer can also be \ref stop() "stopped" and
252
  ///\ref start() "started" again, so it is possible to compute collected
253
  ///running times.
254
  ///
255
  ///\warning Depending on the operation system and its actual configuration
256
  ///the time counters have a certain (10ms on a typical Linux system)
257
  ///granularity.
258
  ///Therefore this tool is not appropriate to measure very short times.
259
  ///Also, if you start and stop the timer very frequently, it could lead to
260
  ///distorted results.
261
  ///
262
  ///\note If you want to measure the running time of the execution of a certain
263
  ///function, consider the usage of \ref TimeReport instead.
264
  ///
265
  ///\todo This shouldn't be Unix (Linux) specific.
266
  ///\sa TimeReport
267
  ///
268
  ///\author Alpar Juttner
269
  class Timer
270
  {
271
    int _running; //Timer is running iff _running>0; (_running>=0 always holds)
272
    TimeStamp start_time; //This is the relativ start-time if the timer
273
                          //is _running, the collected _running time otherwise.
274
    
275
    void _reset() {if(_running) start_time.stamp(); else start_time.reset();}
276
  
277
  public: 
278
    ///Constructor.
279

	
280
    ///\param run indicates whether or not the timer starts immediately.
281
    ///
282
    Timer(bool run=true) :_running(run) {_reset();}
283

	
284
    ///\name Control the state of the timer
285
    ///Basically a Timer can be either running or stopped,
286
    ///but it provides a bit finer control on the execution.
287
    ///The \ref Timer also counts the number of \ref start()
288
    ///executions, and is stops only after the same amount (or more)
289
    ///\ref stop() "stop()"s. This can be useful e.g. to compute the running time
290
    ///of recursive functions.
291
    ///
292

	
293
    ///@{
294

	
295
    ///Reset and stop the time counters
296

	
297
    ///This function resets and stops the time counters
298
    ///\sa restart()
299
    void reset()
300
    {
301
      _running=0;
302
      _reset();
303
    }
304

	
305
    ///Start the time counters
306
    
307
    ///This function starts the time counters.
308
    ///
309
    ///If the timer is started more than ones, it will remain running
310
    ///until the same amount of \ref stop() is called.
311
    ///\sa stop()
312
    void start() 
313
    {
314
      if(_running) _running++;
315
      else {
316
	_running=1;
317
	TimeStamp t;
318
	t.stamp();
319
	start_time=t-start_time;
320
      }
321
    }
322

	
323
    
324
    ///Stop the time counters
325

	
326
    ///This function stops the time counters. If start() was executed more than
327
    ///once, then the same number of stop() execution is necessary the really
328
    ///stop the timer.
329
    /// 
330
    ///\sa halt()
331
    ///\sa start()
332
    ///\sa restart()
333
    ///\sa reset()
334

	
335
    void stop() 
336
    {
337
      if(_running && !--_running) {
338
	TimeStamp t;
339
	t.stamp();
340
	start_time=t-start_time;
341
      }
342
    }
343

	
344
    ///Halt (i.e stop immediately) the time counters
345

	
346
    ///This function stops immediately the time counters, i.e. <tt>t.stop()</tt>
347
    ///is a faster
348
    ///equivalent of the following.
349
    ///\code
350
    ///  while(t.running()) t.stop()
351
    ///\endcode
352
    ///
353
    ///
354
    ///\sa stop()
355
    ///\sa restart()
356
    ///\sa reset()
357

	
358
    void halt() 
359
    {
360
      if(_running) {
361
	_running=0;
362
	TimeStamp t;
363
	t.stamp();
364
	start_time=t-start_time;
365
      }
366
    }
367

	
368
    ///Returns the running state of the timer
369

	
370
    ///This function returns the number of stop() exections that is
371
    ///necessary to really stop the timer.
372
    ///For example the timer
373
    ///is running if and only if the return value is \c true
374
    ///(i.e. greater than
375
    ///zero).
376
    int running()  { return _running; }
377
    
378
    
379
    ///Restart the time counters
380

	
381
    ///This function is a shorthand for
382
    ///a reset() and a start() calls.
383
    ///
384
    void restart() 
385
    {
386
      reset();
387
      start();
388
    }
389
    
390
    ///@}
391

	
392
    ///\name Query Functions for the ellapsed time
393

	
394
    ///@{
395

	
396
    ///Gives back the ellapsed user time of the process
397
    double userTime() const
398
    {
399
      return operator TimeStamp().userTime();
400
    }
401
    ///Gives back the ellapsed system time of the process
402
    double systemTime() const
403
    {
404
      return operator TimeStamp().systemTime();
405
    }
406
    ///Gives back the ellapsed user time of the process' children
407
    double cUserTime() const
408
    {
409
      return operator TimeStamp().cUserTime();
410
    }
411
    ///Gives back the ellapsed user time of the process' children
412
    double cSystemTime() const
413
    {
414
      return operator TimeStamp().cSystemTime();
415
    }
416
    ///Gives back the ellapsed real time
417
    double realTime() const
418
    {
419
      return operator TimeStamp().realTime();
420
    }
421
    ///Computes the ellapsed time
422

	
423
    ///This conversion computes the ellapsed time, therefore you can print
424
    ///the ellapsed time like this.
425
    ///\code
426
    ///  Timer t;
427
    ///  doSomething();
428
    ///  std::cout << t << '\n';
429
    ///\endcode
430
    operator TimeStamp () const
431
    {
432
      TimeStamp t;
433
      t.stamp();
434
      return _running?t-start_time:start_time;
435
    }
436

	
437

	
438
    ///@}
439
  };
440

	
441
  ///Same as \ref Timer but prints a report on destruction.
442

	
443
  ///Same as \ref Timer but prints a report on destruction.
444
  ///This example shows its usage.
445
  ///\code
446
  ///  void myAlg(ListGraph &g,int n)
447
  ///  {
448
  ///    TimeReport tr("Running time of myAlg: ");
449
  ///    ... //Here comes the algorithm
450
  ///  }
451
  ///\endcode
452
  ///
453
  ///\sa Timer
454
  ///\sa NoTimeReport
455
  ///\todo There is no test case for this
456
  class TimeReport : public Timer 
457
  {
458
    std::string _title;
459
    std::ostream &_os;
460
  public:
461
    ///\e
462

	
463
    ///\param title This text will be printed before the ellapsed time.
464
    ///\param os The stream to print the report to.
465
    ///\param run Sets whether the timer should start immediately.
466

	
467
    TimeReport(std::string title,std::ostream &os=std::cerr,bool run=true) 
468
      : Timer(run), _title(title), _os(os){}
469
    ///\e Prints the ellapsed time on destruction.
470
    ~TimeReport() 
471
    {
472
      _os << _title << *this << std::endl;
473
    }
474
  };
475
      
476
  ///'Do nothing' version of \ref TimeReport
477

	
478
  ///\sa TimeReport
479
  ///
480
  class NoTimeReport
481
  {
482
  public:
483
    ///\e
484
    NoTimeReport(std::string,std::ostream &,bool) {}
485
    ///\e
486
    NoTimeReport(std::string,std::ostream &) {}
487
    ///\e
488
    NoTimeReport(std::string) {}
489
    ///\e Do nothing.
490
    ~NoTimeReport() {}
491

	
492
    operator TimeStamp () const { return TimeStamp(); }
493
    void reset() {}
494
    void start() {}
495
    void stop() {}
496
    void halt() {} 
497
    int running() { return 0; }
498
    void restart() {}
499
    double userTime() const { return 0; }
500
    double systemTime() const { return 0; }
501
    double cUserTime() const { return 0; }
502
    double cSystemTime() const { return 0; }
503
    double realTime() const { return 0; }
504
  };
505
      
506
  ///Tool to measure the running time more exactly.
507
  
508
  ///This function calls \c f several times and returns the average
509
  ///running time. The number of the executions will be choosen in such a way
510
  ///that the full real running time will be roughly between \c min_time
511
  ///and <tt>2*min_time</tt>.
512
  ///\param f the function object to be measured.
513
  ///\param min_time the minimum total running time.
514
  ///\retval num if it is not \c NULL, then the actual
515
  ///        number of execution of \c f will be written into <tt>*num</tt>.
516
  ///\retval full_time if it is not \c NULL, then the actual
517
  ///        total running time will be written into <tt>*full_time</tt>.
518
  ///\return The average running time of \c f.
519
  
520
  template<class F>
521
  TimeStamp runningTimeTest(F f,double min_time=10,unsigned int *num = NULL,
522
                            TimeStamp *full_time=NULL)
523
  {
524
    TimeStamp full;
525
    unsigned int total=0;
526
    Timer t;
527
    for(unsigned int tn=1;tn <= 1U<<31 && full.realTime()<=min_time; tn*=2) {
528
      for(;total<tn;total++) f();
529
      full=t;
530
    }
531
    if(num) *num=total;
532
    if(full_time) *full_time=full;
533
    return full/total;
534
  }
535
  
536
  /// @}  
537

	
538

	
539
} //namespace lemon
540

	
541
#endif //LEMON_TIME_MEASURE_H
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <lemon/counter.h>
20

	
21
///\file \brief Test cases for time_measure.h
22
///
23
///\todo To be extended
24

	
25

	
26
int fibonacci(int f) 
27
{
28
  static lemon::Counter count("Fibonacci steps: ");
29
  count++;
30
  if(f<1) return 0;
31
  else if(f==1) return 1;
32
  else return fibonacci(f-1)+fibonacci(f-2);
33
}
34

	
35
int main()
36
{
37
  fibonacci(10);
38
  
39
  {  
40
    typedef lemon::Counter MyCounter;
41
    MyCounter c("Main counter: ");
42
    c++;
43
    c++;
44
    MyCounter::SubCounter d(c,"Subcounter: ");
45
    d++;
46
    d++;
47
    MyCounter::SubCounter::SubCounter e(d,"SubSubCounter: ");
48
    e++;
49
    e++;
50
  }
51
  
52
  {
53
    typedef lemon::NoCounter MyCounter;
54
    MyCounter c("Main counter: ");
55
    c++;
56
    c++;
57
    MyCounter::SubCounter d(c,"Subcounter: ");
58
    d++;
59
    d++;
60
    MyCounter::SubCounter::SubCounter e(d,"SubSubCounter: ");
61
    e++;
62
    e++;
63
  }
64

	
65
  return 0;
66
}
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <lemon/time_measure.h>
20

	
21
///\file \brief Test cases for time_measure.h
22
///
23
///\todo To be extended
24

	
25

	
26
using namespace lemon;
27

	
28
void f() 
29
{
30
  double d=0;
31
  for(int i=0;i<1000;i++)
32
    d+=0.1;
33
}
34

	
35
void g() 
36
{
37
  static Timer T;
38
  
39
  for(int i=0;i<1000;i++)
40
    TimeStamp x(T);
41
}
42

	
43
int main()
44
{
45
  Timer T;
46
  unsigned int n;
47
  for(n=0;T.realTime()<1.0;n++) ;
48
  std::cout << T << " (" << n << " time queries)\n";
49
  T.restart();
50
  while(T.realTime()<2.0) ;
51
  std::cout << T << '\n';
52
  TimeStamp full;
53
  TimeStamp t;
54
  t=runningTimeTest(f,1,&n,&full);
55
  std::cout << t << " (" << n << " tests)\n";
56
  std::cout << "Total: " << full << "\n";
57
  
58
  t=runningTimeTest(g,1,&n,&full);
59
  std::cout << t << " (" << n << " tests)\n";
60
  std::cout << "Total: " << full << "\n";
61
  
62
  return 0;
63
}
Ignore white space 6 line context
... ...
@@ -11,36 +11,38 @@
11 11
        lemon/base.cc \
12 12
        lemon/random.cc
13 13

	
14 14

	
15 15
lemon_libemon_la_CXXFLAGS = $(GLPK_CFLAGS) $(CPLEX_CFLAGS) $(SOPLEX_CXXFLAGS)
16 16
lemon_libemon_la_LDFLAGS = $(GLPK_LIBS) $(CPLEX_LIBS) $(SOPLEX_LIBS)
17 17

	
18 18
lemon_HEADERS += \
19 19
        lemon/arg_parser.h \
20 20
	lemon/assert.h \
21 21
        lemon/bfs.h \
22 22
        lemon/bin_heap.h \
23
        lemon/counter.h \
23 24
        lemon/dfs.h \
24 25
        lemon/dijkstra.h \
25 26
        lemon/dim2.h \
26 27
	lemon/error.h \
27 28
	lemon/graph_utils.h \
28 29
	lemon/kruskal.h \
29 30
	lemon/list_graph.h \
30 31
	lemon/maps.h \
31 32
	lemon/math.h \
32 33
	lemon/path.h \
33 34
        lemon/random.h \
34 35
	lemon/smart_graph.h \
36
        lemon/time_measure.h \
35 37
        lemon/tolerance.h \
36 38
	lemon/unionfind.h
37 39

	
38 40
bits_HEADERS += \
39 41
	lemon/bits/alteration_notifier.h \
40 42
	lemon/bits/array_map.h \
41 43
	lemon/bits/base_extender.h \
42 44
	lemon/bits/default_map.h \
43 45
	lemon/bits/graph_extender.h \
44 46
        lemon/bits/invalid.h \
45 47
	lemon/bits/map_extender.h \
46 48
	lemon/bits/path_dump.h \
Ignore white space 24 line context
1 1
EXTRA_DIST += \
2 2
	test/Makefile
3 3

	
4 4
noinst_HEADERS += \
5 5
	test/digraph_test.h \
6 6
	test/heap_test.h \
7 7
	test/map_test.h \
8 8
        test/test_tools.h
9 9

	
10 10
check_PROGRAMS += \
11 11
	test/bfs_test \
12
        test/counter_test \
12 13
	test/dfs_test \
13 14
	test/digraph_test \
14 15
        test/dim_test \
15 16
	test/error_test \
16 17
	test/graph_test \
17 18
	test/kruskal_test \
18 19
        test/maps_test \
19 20
        test/random_test \
20 21
        test/path_test \
21 22
        test/test_tools_fail \
22 23
        test/test_tools_pass \
24
        test/time_measure_test \
23 25
	test/unionfind_test
24 26

	
25 27
TESTS += $(check_PROGRAMS)
26 28
XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
27 29

	
28 30
test_bfs_test_SOURCES = test/bfs_test.cc
31
test_counter_test_SOURCES = test/counter_test.cc
29 32
test_dfs_test_SOURCES = test/dfs_test.cc
30 33
test_digraph_test_SOURCES = test/digraph_test.cc
31 34
test_dim_test_SOURCES = test/dim_test.cc
32 35
test_error_test_SOURCES = test/error_test.cc
33 36
test_graph_test_SOURCES = test/graph_test.cc
34 37
# test_heap_test_SOURCES = test/heap_test.cc
35 38
test_kruskal_test_SOURCES = test/kruskal_test.cc
36 39
test_maps_test_SOURCES = test/maps_test.cc
37 40
test_path_test_SOURCES = test/path_test.cc
38 41
test_random_test_SOURCES = test/random_test.cc
39 42
test_test_tools_fail_SOURCES = test/test_tools_fail.cc
40 43
test_test_tools_pass_SOURCES = test/test_tools_pass.cc
44
test_time_measure_test_SOURCES = test/time_measure_test.cc
41 45
test_unionfind_test_SOURCES = test/unionfind_test.cc
0 comments (0 inline)