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