COIN-OR::LEMON - Graph Library

Ticket #52: time-and-counter-rev.patch

File time-and-counter-rev.patch, 24.7 KB (added by Alpar Juttner, 16 years ago)

A revised port (without mingw support)

  • lemon/Makefile.am

    # HG changeset patch
    # User Alpar Juttner <alpar@cs.elte.hu>
    # Date 1206911795 -3600
    # Node ID 82a2639a05bb8cb6122be7327d78ff8fa207c6bc
    # Parent  e47fb28cda5ed878df35945a0683dfd8e0075045
    Port time and counter utilities from svn -r3482
    The mingw support has been removed
    
    diff -r e47fb28cda5e -r 82a2639a05bb lemon/Makefile.am
    a b  
    2020        lemon/assert.h \
    2121        lemon/bfs.h \
    2222        lemon/bin_heap.h \
     23        lemon/counter.h \
    2324        lemon/dfs.h \
    2425        lemon/dijkstra.h \
    2526        lemon/dim2.h \
     
    3233        lemon/path.h \
    3334        lemon/random.h \
    3435        lemon/smart_graph.h \
     36        lemon/time_measure.h \
    3537        lemon/tolerance.h \
    3638        lemon/unionfind.h
    3739
  • new file lemon/counter.h

    diff -r e47fb28cda5e -r 82a2639a05bb lemon/counter.h
    - +  
     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
     29namespace 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
  • new file lemon/time_measure.h

    diff -r e47fb28cda5e -r 82a2639a05bb lemon/time_measure.h
    - +  
     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
     33namespace 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
  • test/Makefile.am

    diff -r e47fb28cda5e -r 82a2639a05bb test/Makefile.am
    a b  
    99
    1010check_PROGRAMS += \
    1111        test/bfs_test \
     12        test/counter_test \
    1213        test/dfs_test \
    1314        test/digraph_test \
    1415        test/dim_test \
     
    2021        test/path_test \
    2122        test/test_tools_fail \
    2223        test/test_tools_pass \
     24        test/time_measure_test \
    2325        test/unionfind_test
    2426
    2527TESTS += $(check_PROGRAMS)
    2628XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
    2729
    2830test_bfs_test_SOURCES = test/bfs_test.cc
     31test_counter_test_SOURCES = test/counter_test.cc
    2932test_dfs_test_SOURCES = test/dfs_test.cc
    3033test_digraph_test_SOURCES = test/digraph_test.cc
    3134test_dim_test_SOURCES = test/dim_test.cc
     
    3841test_random_test_SOURCES = test/random_test.cc
    3942test_test_tools_fail_SOURCES = test/test_tools_fail.cc
    4043test_test_tools_pass_SOURCES = test/test_tools_pass.cc
     44test_time_measure_test_SOURCES = test/time_measure_test.cc
    4145test_unionfind_test_SOURCES = test/unionfind_test.cc
  • new file test/counter_test.cc

    diff -r e47fb28cda5e -r 82a2639a05bb test/counter_test.cc
    - +  
     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
     26int 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
     35int 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}
  • new file test/time_measure_test.cc

    diff -r e47fb28cda5e -r 82a2639a05bb test/time_measure_test.cc
    - +  
     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
     26using namespace lemon;
     27
     28void f()
     29{
     30  double d=0;
     31  for(int i=0;i<1000;i++)
     32    d+=0.1;
     33}
     34
     35void g()
     36{
     37  static Timer T;
     38 
     39  for(int i=0;i<1000;i++)
     40    TimeStamp x(T);
     41}
     42
     43int 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}