RE: [ROOT] system time in msec ?

From: Faine, Valeri (fine@bnl.gov)
Date: Tue Mar 05 2002 - 22:14:28 MET


 

> 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:GetR
ealT
> > 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.

  I think ( under Windows at least) the method TStopwatch::GetRealTime()
does what he wants. Namely it returns:

  the (Double_t)FILETIME structure, that is a 64-bit value representing 
  the number of 100-nanosecond intervals since January 1, 1601. 

  I agree it is not true under UNIX. This is why I called this
  method "the candidate". Otherwise I would say USE that method.

   Best regards, Valeri

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