COIN-OR::LEMON - Graph Library

Ticket #74: mingw_compatible_time_measure.2.patch

File mingw_compatible_time_measure.2.patch, 6.6 KB (added by Balazs Dezso, 17 years ago)
  • lemon/time_measure.h

    # HG changeset patch
    # User Balazs Dezso <deba@inf.elte.hu>
    # Date 1208162801 -7200
    # Node ID 5b9af841a7ec4152a6aae0b7d566a18c900e5ee0
    # Parent  ae7785fe84315de6be35a182420b6369e851f00d
    MinGW compatible time measure
    
    diff -r ae7785fe8431 -r 5b9af841a7ec lemon/time_measure.h
    a b  
    2323///\file
    2424///\brief Tools for measuring cpu usage
    2525
     26#ifdef WIN32
     27#include <windows.h>
     28#include <cmath>
     29#else
    2630#include <sys/times.h>
     31#include <sys/time.h>
     32#endif
    2733
    28 #include <sys/time.h>
    2934#include <fstream>
    3035#include <iostream>
    31 #include <unistd.h>
    3236
    3337namespace lemon {
    3438
    namespace lemon { 
    5458
    5559  class TimeStamp
    5660  {
    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;
     61    double utime;
     62    double stime;
     63    double cutime;
     64    double cstime;
     65    double rtime;
    6966 
    70     rtms &getTms() {return ts;}
    71     const rtms &getTms() const {return ts;}
    72 
    7367    void _reset() {
    74       ts.tms_utime = ts.tms_stime = ts.tms_cutime = ts.tms_cstime = 0;
    75       real_time = 0;
     68      utime = stime = cutime = cstime = rtime = 0;
    7669    }
    7770
    7871  public:
    namespace lemon { 
    8073    ///Read the current time values of the process
    8174    void stamp()
    8275    {
     76#ifndef WIN32
    8377      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;
     78      gettimeofday(&tv, 0);
     79      rtime=tv.tv_sec+double(tv.tv_usec)/1e6;
     80
     81      tms ts;
     82      double tck=sysconf(_SC_CLK_TCK);
     83      times(&ts);
     84      utime=ts.tms_utime/tck;
     85      stime=ts.tms_stime/tck;
     86      cutime=ts.tms_cutime/tck;
     87      cstime=ts.tms_cstime/tck;
     88#else
     89      static const double ch = 4294967296.0e-7;
     90      static const double cl = 1.0e-7;
     91
     92      FILETIME system;
     93      GetSystemTimeAsFileTime(&system);
     94      rtime = ch * system.dwHighDateTime + cl * system.dwLowDateTime;
     95
     96      FILETIME create, exit, kernel, user;
     97      if (GetProcessTimes(GetCurrentProcess(),&create, &exit, &kernel, &user)) {
     98        utime = ch * user.dwHighDateTime + cl * user.dwLowDateTime;
     99        stime = ch * kernel.dwHighDateTime + cl * kernel.dwLowDateTime;
     100        cutime = 0;
     101        cstime = 0;
     102      } else {
     103        rtime = 0;
     104        utime = 0;
     105        stime = 0;
     106        cutime = 0;
     107        cstime = 0;
     108      }
     109#endif     
    88110    }
    89111 
    90112    /// Constructor initializing with zero
    namespace lemon { 
    99121    ///\e
    100122    TimeStamp &operator+=(const TimeStamp &b)
    101123    {
    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;
     124      utime+=b.utime;
     125      stime+=b.stime;
     126      cutime+=b.cutime;
     127      cstime+=b.cstime;
     128      rtime+=b.rtime;
    107129      return *this;
    108130    }
    109131    ///\e
    namespace lemon { 
    115137    ///\e
    116138    TimeStamp &operator-=(const TimeStamp &b)
    117139    {
    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;
     140      utime-=b.utime;
     141      stime-=b.stime;
     142      cutime-=b.cutime;
     143      cstime-=b.cstime;
     144      rtime-=b.rtime;
    123145      return *this;
    124146    }
    125147    ///\e
    namespace lemon { 
    131153    ///\e
    132154    TimeStamp &operator*=(double b)
    133155    {
    134       ts.tms_utime*=b;
    135       ts.tms_stime*=b;
    136       ts.tms_cutime*=b;
    137       ts.tms_cstime*=b;
    138       real_time*=b;
     156      utime*=b;
     157      stime*=b;
     158      cutime*=b;
     159      cstime*=b;
     160      rtime*=b;
    139161      return *this;
    140162    }
    141163    ///\e
    namespace lemon { 
    148170    ///\e
    149171    TimeStamp &operator/=(double b)
    150172    {
    151       ts.tms_utime/=b;
    152       ts.tms_stime/=b;
    153       ts.tms_cutime/=b;
    154       ts.tms_cstime/=b;
    155       real_time/=b;
     173      utime/=b;
     174      stime/=b;
     175      cutime/=b;
     176      cstime/=b;
     177      rtime/=b;
    156178      return *this;
    157179    }
    158180    ///\e
    namespace lemon { 
    173195    ///Gives back the user time of the process
    174196    double userTime() const
    175197    {
    176       return double(ts.tms_utime)/sysconf(_SC_CLK_TCK);
     198      return utime;
    177199    }
    178200    ///Gives back the system time of the process
    179201    double systemTime() const
    180202    {
    181       return double(ts.tms_stime)/sysconf(_SC_CLK_TCK);
     203      return stime;
    182204    }
    183205    ///Gives back the user time of the process' children
     206
     207    ///\note On <tt>WIN32</tt> platform this value is not calculated.
     208    ///
    184209    double cUserTime() const
    185210    {
    186       return double(ts.tms_cutime)/sysconf(_SC_CLK_TCK);
     211      return cutime;
    187212    }
    188213    ///Gives back the user time of the process' children
     214
     215    ///\note On <tt>WIN32</tt> platform this value is not calculated.
     216    ///
    189217    double cSystemTime() const
    190218    {
    191       return double(ts.tms_cstime)/sysconf(_SC_CLK_TCK);
     219      return cstime;
    192220    }
    193221    ///Gives back the real time
    194     double realTime() const {return real_time;}
     222    double realTime() const {return rtime;}
    195223  };
    196224
    197225  TimeStamp operator*(double b,const TimeStamp &t)
    namespace lemon { 
    212240  /// \li \c cs: system cpu time of children,
    213241  /// \li \c real: real time.
    214242  /// \relates TimeStamp
     243  /// \note On <tt>WIN32</tt> platform the cummulative values are not
     244  /// calculated.
    215245  inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t)
    216246  {
    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 <<
     247    os << "u: " << t.userTime() <<
     248      "s, s: " << t.systemTime() <<
     249      "s, cu: " << t.cUserTime() <<
     250      "s, cs: " << t.cSystemTime() <<
    222251      "s, real: " << t.realTime() << "s";
    223252    return os;
    224253  }
    namespace lemon { 
    404433      return operator TimeStamp().systemTime();
    405434    }
    406435    ///Gives back the ellapsed user time of the process' children
     436
     437    ///\note On <tt>WIN32</tt> platform this value is not calculated.
     438    ///
    407439    double cUserTime() const
    408440    {
    409441      return operator TimeStamp().cUserTime();
    410442    }
    411443    ///Gives back the ellapsed user time of the process' children
     444
     445    ///\note On <tt>WIN32</tt> platform this value is not calculated.
     446    ///
    412447    double cSystemTime() const
    413448    {
    414449      return operator TimeStamp().cSystemTime();