Hi,
what about the following milisecond timer? Works for me on Windows and
Linux.
Cheers
Radovan
---------- cut here BenchTimer.h -------------------------------------------
#include <stdlib.h>
#include <time.h>
#define CLCK_PER_MILISEC (CLOCKS_PER_SEC/1000)
class BenchTimer
{
public:
typedef enum { eMili, eSec } EUnit;
public:
BenchTimer() : mInProgress(false), mStart(0), mFinish(0) {
}
~BenchTimer() {
}
inline void Start() {
mInProgress = true;
mStart = ::clock();
}
inline void Finish() {
mFinish = ::clock();
mInProgress = false;
}
inline bool Busy() {
return mInProgress;
}
inline void Reset() {
if( !Busy() ) {
mInProgress = false;
mStart = 0;
mFinish = 0;
}
}
inline double Report( BenchTimer::EUnit unit = eMili ) {
double result = (double)(mFinish-mStart);
return( (unit == eMili) ? (result/CLCK_PER_MILISEC) :
(result/CLOCKS_PER_SEC) );
}
private:
bool mInProgress;
clock_t mStart;
clock_t mFinish;
};
---------- cut here BenchTimer.h -------------------------------------------
> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch
> [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Robert Hatcher
> Sent: Tuesday, 05 March 2002 21:37
> To: Faine, Valeri
> Cc: 'Joe Robe '; 'roottalk@pcroot.cern.ch '
> Subject: RE: [ROOT] system time in msec ?
>
>
> On Tue, 5 Mar 2002, Faine, Valeri wrote:
>
> > In theory (;-)the TStopwatch method is a good ROOT candidate.
> > Have a look at
> >
> >
> http://root.cern.ch/root/htmldoc/src/TStopwatch.cxx.html#TStopwatch:GetRealT
> > ime
>
> Actually, no it isn't. TStopwatch is a good candidate for a stop watch
> object. Stopwatches are good for measuring elapsed times not absolutes.
> Joe's request was:
>
> >>> [...] Any class who returns current time in msec precision ? [...]
>
> TStopwatch does not give the current time (in the sense of Tue, 5 Mar
> 2002, 2:04 CST), but instead gives (in general) the cpu or *delta*
> wall clock time since the the process began...in clock ticks converted
> to real units. Before you suggest Double_t TStopwatch::GetRealTime()
> you should look at the code, for unix this is:
>
> #elif defined(R__UNIX)
> struct tms cpt;
> Double_t trt = (Double_t)times(&cpt);
> return trt / (double)gTicks;
>
> So what does "times()" return?
> $ man -S 2 times
>
> | RETURN VALUE
> | The function times returns the number of clock ticks that
> | have elapsed since an arbitrary point in the past. For
> | Linux this point is the moment the system was booted.
> | This return value may overflow the possible range of type
> | clock_t. On error, (clock_t) -1 is returned, and errno is
> | set appropriately. The number of clock ticks per second
> | can be obtained using
> | sysconf(_SC_CLK_TCK);
> [...]
>
> So TStopwatch::GetRealTime, on Linux, returns the seconds since the
> machine was booted. I doubt this satisfies Joe's requirements.
>
> Brett Viren pointed me to gettimeofday() which is available on Linux
> (and *probably* most of UNIX as it claims "CONFORMING TO SVr4, BSD 4.3"),
> but I don't know how to asertain how uniformly it is implemented
> on other systems nor do I have enough knowledge to say anything about
> the M$ Windows side. I'm considering the following change to MINOS's
> VldTimeStamp (from whence TTimeStamp was derived):
>
> up in the beginning:
> #ifndef WIN32
> // timeval, timezone, gettimeofday()
> #include <sys/time.h>
> #endif
>
> in void VldTimeStamp::Set() replace all the code with:
>
> #ifndef WIN32
> // this should work on UNIX to get microsec precision
> // we'll stick to a ns hack to ensure calls are unique
> timeval now;
> static Int_t fake_ns = 0;
> //struct timezone tz;
>
> if (!gettimeofday(&now,0)) {
> fSec = now.tv_sec;
> fNanoSec = now.tv_usec*1000 + (++fake_ns)%1000;
> }
> else {
> time_t now;
> time(&now);
> fSec = now;
> fNanoSec = ++fake_ns;
> }
> #else
> time_t now;
> time(&now);
> fSec = now;
>
> static Int_t fake_ns = 0;
> fNanoSec = ++fake_ns;
> #endif
>
>
> -robert
>
>
> > -----Original Message-----
> > From: Robert Hatcher
> >
> > On Tue, 5 Mar 2002, Fons Rademakers wrote:
> >
> > > Check TTimeStamp.
> >
> > Well, I'm not sure that this satisfies Joe's needs (any more than
> > TDatime)
> > in that while it can handle sub-second precison it doesn't know how to
> > "get" that info. the TTimeStamp() ctor constructs a time based on
> > seconds
> > since "epoch" (1970-01-01 00:00:00). The default ctor calls Set() which
> > has:
> >
> > // Set Date/Time to current time as reported by the system.
> > // No accounting for nanoseconds with std ANSI functions,
> > // ns part faked so that subsequent calls simply add 1 to it
> > // this ensures that calls within the same second come back
> > // distinct (and sortable).
> >
> > time_t now;
> > time(&now);
> > fSec = now;
> >
> > static Int_t fake_ns = 0;
> > fNanoSec = fake_ns++;
> >
> > If there are standard ways of determining sub-second times I'd be
> > interested. But I know of no means that is consistently available on
> > all platforms.
> >
> > -robert
> >
> > > On Tue, 2002-03-05 at 15:06, Joe Robe wrote:
> > > > Hi,
> > > >
> > > > TTime seems only to be a storage class, and TDatime does only return
> > current time in sec precision. Any class who returns current time in
> > msec precision ? Since my app must run on Linux AND windoze I do not
> > want to implement it by myself ( no clue about Linux).
> > > >
> > > > Joe
> > > >
> > > --
> > > Org: CERN, European Laboratory for Particle Physics.
> > > Mail: 1211 Geneve 23, Switzerland
> > > E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248
> > > WWW: http://root.cern.ch/~rdm/ Fax: +41 22 7679480
>
> Robert W. Hatcher | rhatcher@fnal.gov 630-840-3102
> FNAL CD/CP (MINOS) | MS 220, PO Box 500, Batavia IL 60510
>
>
>
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:44 MET