Hi Eric,
this erroneous behavior has been fixed in the cvs head. Thanks for
reporting the bug.
Cheers, Fons.
ANCIANT E. wrote:
> Hello rooters,
>
> I've been fooled several times by the TStopwatch behaviour, for
> example doing the following :
>
> TStopwatch watch; // ... Constructor ...
>
> < ... Lots of stuff ... >
>
> watch.Start(); // or watch.Start(kTRUE) which is the same
>
> < things whose timing I would like to measure >
>
> watch.Stop(); // optional in fact ... cout << watch.CpuTime() <<
> endl;
>
> The timing I got is not the timing between the call to Start() and
> the call to Stop() (which I tend to expect ) but between the
> constructor and the call to Stop() !
>
> The reason is that the constructor Starts the stopwath (therefore in
> a 'kRunning' state), Then the Start(kTRUE), though reseting the total
> CPU and Real times, does not reset The Start times, which are left to
> there values that got set at construction time.
>
> Practicaly, to have things working (the way I expect it) is to have
> to Stop() any stopwatch once (typically just after constructing it)
> before using it (especially 'global' or class-member stopwatches )
>
> So I wonder : - Starting the stopwatch at creation sounds harmless, -
> Protecting the start time against several call to Start(kFALSE)
> through the kRunning mechanism is fine (...) - However I really
> wonder what is point, when Start( bool reset = kTRUE ) is invoqued,
> to reset the 'total' times and NOT the 'start' ones ? i.e shouldn't
> the Start() implementation be ? :
>
> void TStopwatch::Start(Bool_t reset) { // Start the stopwatch. If
> reset is kTRUE reset the stopwatch before // starting it (including
> the stopwatch counter). // Use kFALSE to continue timing after a
> Stop() without // resetting the stopwatch.
>
> if (reset) { fTotalCpuTime = 0; fTotalRealTime = 0; fCounter =
> 0; fStartRealTime = GetRealTime(); fStartCpuTime = GetCPUTime(); }
> if (fState != kRunning) { fStartRealTime = GetRealTime();
> fStartCpuTime = GetCPUTime(); } fState = kRunning; fCounter++; }
>
> I know it is not easy to change a default behaviour of a class, but I
> also bet in a few months from now I'll get fooled again (Am I the
> only one ?) Am I missing somethings ?
>
> eric
>
>
>
> /************* QUOTE FROM Tstopwath.cxx
> ***********************************************************/
> //______________________________________________________________________
> ________ TStopwatch::TStopwatch() { // Create a stopwatch and start
> it.
>
> #ifdef R__UNIX if (!gTicks) gTicks = (Double_t)sysconf(_SC_CLK_TCK);
> #endif fState = kUndefined; fTotalCpuTime = 0;
> fTotalRealTime = 0; fCounter = 0; Start(); }
>
> //______________________________________________________________________
> ________ void TStopwatch::Start(Bool_t reset) { // Start the
> stopwatch. If reset is kTRUE reset the stopwatch before // starting
> it (including the stopwatch counter). // Use kFALSE to continue
> timing after a Stop() without // resetting the stopwatch.
>
> if (reset) { fTotalCpuTime = 0; fTotalRealTime = 0; fCounter =
> 0; } if (fState != kRunning) { // !!! <<============ because the
> watch is running, start times are not reset fStartRealTime =
> GetRealTime(); fStartCpuTime = GetCPUTime(); } fState = kRunning;
> fCounter++; }
>
>
> //______________________________________________________________________
> ________ void TStopwatch::Stop() { // Stop the stopwatch.
>
> fStopRealTime = GetRealTime(); fStopCpuTime = GetCPUTime();
>
> if (fState == kRunning) { fTotalCpuTime += fStopCpuTime -
> fStartCpuTime; fTotalRealTime += fStopRealTime - fStartRealTime; }
> fState = kStopped; }
>
> //______________________________________________________________________
> ________ Double_t TStopwatch::CpuTime() { // Return the cputime
> passed between the start and stop events. If the // stopwatch was
> still running stop it first.
>
> if (fState == kUndefined) Error("CpuTime", "stopwatch not started");
>
> if (fState == kRunning) Stop();
>
> return fTotalCpuTime; }
>
> *********** Ce message et eventuellement les pieces jointes sont
> exclusivement transmis a l'usage de leur destinataire. Leur contenu
> est confidentiel. Si vous n etes pas le bon destinataire nous vous
> demandons de ne pas conserver, copier, utiliser ou divulguer cette
> communication. Merci de le detruire et de me notifier cette erreur.
>
> INTERNET ne permettant pas d assurer l integrite de ce message,
> SODERN decline toute responsabilite au cas ou il aurait ete
> intercepte ou modifie.
>
>
> This message and possibly any attachments are transmitted for the
> exclusive use of their addressee. Their content is confidential. If
> you are not the intended recipient please do not keep, copy, use or
> disclose this communication to others. Also Please delete it and
> notify the sender at once.
>
> Because of the nature of INTERNET the sender is not in a position to
> ensure the integrity of this message, therefore SODERN disclaims any
> liability whatsoever in the event of this message having been
> intercepted and/or altered.
--
Org: CERN, European Laboratory for Particle Physics.
Mail: 1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248
WWW: http://www.rademakers.org/fons/ Fax: +41 22 7679480
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:09 MET