<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <HTML> <HEAD> <TITLE>nevrax.org : docs</TITLE> <LINK REL=stylesheet TYPE="text/css" HREF="/inc/css/nevrax.css"> <link href="doxygen.css" rel="stylesheet" type="text/css"> </HEAD> <BODY MARGINHEIGHT="0" MARGINWIDTH="0"> <!-- uplinks --> <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> <TR> <TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> <TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> <TD><IMG width=6 height=14 SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF='/'><b>Home</B></FONT></A> </TD> <TD><IMG width=6 height=14 SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF='/'><b>nevrax.com</B></FONT></A> </TD> </TR> </TABLE> <!-- banner Nevrax --> <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> <TR><TD BGCOLOR="#000000" BACKGROUND="/inc/img/black_banner.jpg"><A HREF=""><IMG SRC="/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> </TABLE> <!-- main table --> <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> <TR> <TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> <!------ Begin Box ------> <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> <TABLE cellspacing=0 cellpadding=1 border=0> <tr><td ALIGN=middle><a class='linkbox' href="/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="/news/" TITLE="News">News</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="/docs/" TITLE="Documentation">Documentation</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="/cvs/" TITLE="CVS Web">CVS</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> <tr><td ALIGN=middle><a class='linkbox' href="/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="/GPL.php3" TITLE="License">License</a></td></tr> </TABLE> </TD></TR></TABLE></TD></TR></TABLE> <!------ End Box ------> </TD> <TD WIDTH=15><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> <TD ALIGN=left valign=top><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> <!-- title --> <TABLE background="/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> <A HREF="/docs/"><img src="/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> </td><td><IMG SRC="/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> </td></tr></table> <!-- block --> <TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="/inc/img/reddots.gif"></TD> <TD><B>Documentation</B></TD> <TD ALIGN=RIGHT> </td> </tr></table> <!-- Generated by Doxygen 1.2.14 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:/cgi-bin/nel-search.cgi" href="/cgi-bin/nel-search.cgi">Search</a> </center> <hr><h1>hierarchical_timer.cpp</h1><a href="hierarchical__timer_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 00007 <font class="comment">/* Copyright, 2000, 2001 Nevrax Ltd.</font> 00008 <font class="comment"> *</font> 00009 <font class="comment"> * This file is part of NEVRAX NeL Network Services.</font> 00010 <font class="comment"> * NEVRAX NeL Network Services is free software; you can redistribute it and/or modify</font> 00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> 00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> 00013 <font class="comment"> * any later version.</font> 00014 <font class="comment"></font> 00015 <font class="comment"> * NEVRAX NeL Network Services is distributed in the hope that it will be useful, but</font> 00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> 00018 <font class="comment"> * General Public License for more details.</font> 00019 <font class="comment"></font> 00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font> 00021 <font class="comment"> * along with NEVRAX NeL Network Services; see the file COPYING. If not, write to the</font> 00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> 00023 <font class="comment"> * MA 02111-1307, USA.</font> 00024 <font class="comment"> */</font> 00025 00026 <font class="preprocessor">#include "<a class="code" href="stdmisc_8h.html">stdmisc.h</a>"</font> 00027 00028 <font class="preprocessor">#include "<a class="code" href="hierarchical__timer_8h.html">nel/misc/hierarchical_timer.h</a>"</font> 00029 <font class="preprocessor">#include "<a class="code" href="common_8h.html">nel/misc/common.h</a>"</font> 00030 <font class="preprocessor">#include "<a class="code" href="debug_8h.html">nel/misc/debug.h</a>"</font> 00031 00032 <font class="preprocessor">#ifdef NL_CPU_INTEL</font> 00033 <font class="preprocessor"></font><font class="preprocessor">#include "<a class="code" href="time__nl_8h.html">nel/misc/time_nl.h</a>"</font> 00034 <font class="preprocessor">#endif</font> 00035 <font class="preprocessor"></font> 00036 <font class="preprocessor">#include <map></font> 00037 00038 <font class="keyword">namespace </font>NLMISC 00039 { 00040 00041 <a name="l00042"></a><a class="code" href="classNLMISC_1_1CSimpleClock.html#r0">00042</a> <font class="keywordtype">bool</font> CSimpleClock::_InitDone = <font class="keyword">false</font>; <a name="l00043"></a><a class="code" href="classNLMISC_1_1CSimpleClock.html#r1">00043</a> uint64 CSimpleClock::_StartStopNumTicks = 0; 00044 00045 00046 <font class="comment">// root node for all execution paths</font> <a name="l00047"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r0">00047</a> CHTimer::CNode CHTimer::_RootNode; <a name="l00048"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r1">00048</a> CHTimer::CNode *CHTimer::_CurrNode = &_RootNode; <a name="l00049"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r3">00049</a> CSimpleClock CHTimer::_PreambuleClock; 00050 CHTimer CHTimer::_RootTimer(<font class="stringliteral">"root"</font>, <font class="keyword">true</font>); <a name="l00051"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r5">00051</a> <font class="keywordtype">bool</font> CHTimer::_Benching = <font class="keyword">false</font>; <a name="l00052"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r6">00052</a> <font class="keywordtype">bool</font> CHTimer::_BenchStartedOnce = <font class="keyword">false</font>; <a name="l00053"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r4">00053</a> <font class="keywordtype">double</font> CHTimer::_MsPerTick; <a name="l00054"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r7">00054</a> <font class="keywordtype">bool</font> CHTimer::_WantStandardDeviation = <font class="keyword">false</font>; <a name="l00055"></a><a class="code" href="classNLMISC_1_1CHTimer.html#r8">00055</a> CHTimer *CHTimer::_CurrTimer = &_RootTimer; 00056 00057 00058 00059 00060 00061 00062 00063 <font class="comment">//=================================================================</font> <a name="l00064"></a><a class="code" href="classNLMISC_1_1CSimpleClock.html#d0">00064</a> <font class="keywordtype">void</font> CSimpleClock::init() 00065 { 00066 <font class="keywordflow">if</font> (_InitDone) <font class="keywordflow">return</font>; 00067 <font class="keyword">const</font> uint numSamples = 10000; 00068 00069 <a class="code" href="classNLMISC_1_1CSimpleClock.html#a0">CSimpleClock</a> observedClock; 00070 <a class="code" href="classNLMISC_1_1CSimpleClock.html#a0">CSimpleClock</a> measuringClock; 00071 00072 measuringClock.start(); 00073 <font class="keywordflow">for</font>(uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < numSamples; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) 00074 { 00075 observedClock.start(); 00076 observedClock.stop(); 00077 } 00078 measuringClock.stop(); 00079 00080 <a class="code" href="classNLMISC_1_1CSimpleClock.html#r1">_StartStopNumTicks</a> = (measuringClock.getNumTicks() >> 1) / numSamples; 00081 <a class="code" href="classNLMISC_1_1CSimpleClock.html#r0">_InitDone</a> = <font class="keyword">true</font>; 00082 } 00083 00084 00085 00086 <font class="comment">//=================================================================</font> 00089 <font class="comment"></font><font class="comment">/*static void PerformStatistics(const std::vector<double> &values, double &standardDeviation)</font> 00090 <font class="comment">{</font> 00091 <font class="comment"> nlassert(!values.empty());</font> 00092 <font class="comment"> double total = 0; </font> 00093 <font class="comment"> double variance = 0;</font> 00094 <font class="comment"> uint k;</font> 00095 <font class="comment"> for(k = 0; k < values.size(); ++k)</font> 00096 <font class="comment"> {</font> 00097 <font class="comment"> total += (double) values[k]; </font> 00098 <font class="comment"> }</font> 00099 <font class="comment"> meanValue = total / values.size();</font> 00100 <font class="comment"> if (values.size() <= 1)</font> 00101 <font class="comment"> {</font> 00102 <font class="comment"> standardDeviation = 0.f;</font> 00103 <font class="comment"> return;</font> 00104 <font class="comment"> }</font> 00105 <font class="comment"> for(k = 0; k < values.size(); ++k)</font> 00106 <font class="comment"> {</font> 00107 <font class="comment"> variance += NLMISC::sqr((values[k] - meanValue));</font> 00108 <font class="comment"> }</font> 00109 <font class="comment"> standardDeviation = ::sqrt(variance / values.size() - 1);</font> 00110 <font class="comment">}*/</font> 00111 00112 00113 00114 <font class="comment">//=================================================================</font> <a name="l00115"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a1">00115</a> CHTimer::CNode::~CNode() 00116 { 00117 <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a3">releaseSons</a>(); 00118 <font class="keywordflow">for</font>(uint k = 0; k < <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.size(); ++k) 00119 <font class="keyword">delete</font> <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>[k]; 00120 } 00121 00122 <font class="comment">//=================================================================</font> <a name="l00123"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a3">00123</a> <font class="keywordtype">void</font> CHTimer::CNode::releaseSons() 00124 { 00125 <font class="keywordflow">for</font>(uint k = 0; k < <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.size(); ++k) 00126 <font class="keyword">delete</font> <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>[k]; 00127 <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.clear(); 00128 } 00129 00130 <font class="comment">//=================================================================</font> <a name="l00131"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a5">00131</a> <font class="keywordtype">void</font> CHTimer::CNode::displayPath(CLog *log)<font class="keyword"> const</font> 00132 <font class="keyword"></font>{ 00133 std::string path; 00134 <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a6">getPath</a>(path); 00135 log->displayRawNL((<font class="stringliteral">"HTIMER: "</font> + path).c_str()); 00136 } 00137 00138 <font class="comment">//=================================================================</font> <a name="l00139"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a6">00139</a> <font class="keywordtype">void</font> CHTimer::CNode::getPath(std::string &path)<font class="keyword"> const</font> 00140 <font class="keyword"></font>{ 00141 path.clear(); 00142 <font class="keyword">const</font> <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a0">CNode</a> *currNode = <font class="keyword">this</font>; 00143 <font class="keywordflow">do</font> 00144 { 00145 path = path.empty() ? currNode->Owner->getName() 00146 : currNode->Owner->getName() + std::string(<font class="stringliteral">"::"</font>) + path; 00147 currNode = currNode->Parent; 00148 } 00149 <font class="keywordflow">while</font> (currNode); 00150 } 00151 00152 00153 <font class="comment">//=================================================================</font> <a name="l00154"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a2">00154</a> uint CHTimer::CNode::getNumNodes()<font class="keyword"> const</font> 00155 <font class="keyword"></font>{ 00156 uint sum = 1; 00157 <font class="keywordflow">for</font>(uint k = 0; k < <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.size(); ++k) 00158 { 00159 sum += <a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>[k]->getNumNodes(); 00160 } 00161 <font class="keywordflow">return</font> sum; 00162 } 00163 00164 00165 <font class="comment">//=================================================================</font> <a name="l00166"></a><a class="code" href="classNLMISC_1_1CHTimer.html#c0">00166</a> <font class="keywordtype">void</font> CHTimer::walkTreeToCurrent() 00167 { 00168 <font class="keywordflow">if</font> (_IsRoot) <font class="keywordflow">return</font>; 00169 <font class="keywordtype">bool</font> found = <font class="keyword">false</font>; 00170 <font class="keywordflow">for</font>(uint k = 0; k < <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.size(); ++k) 00171 { 00172 <font class="keywordflow">if</font> (<a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>[k]->Owner == <font class="keyword">this</font>) 00173 { 00174 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a> = <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>[k]; 00175 found = <font class="keyword">true</font>; 00176 <font class="keywordflow">break</font>; 00177 } 00178 } 00179 <font class="keywordflow">if</font> (!found) 00180 { 00181 <font class="comment">// no node for this execution path : create a new one</font> 00182 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.push_back(<font class="keyword">new</font> CNode(<font class="keyword">this</font>, <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>)); 00183 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.back()->Parent = <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>; 00184 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a> = <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m1">Sons</a>.back(); 00185 } 00186 } 00187 00188 <font class="preprocessor">#ifdef NL_CPU_INTEL</font> 00189 <font class="preprocessor"></font><font class="comment">//=================================================================</font> 00190 uint64 CHTimer::getProcessorFrequency(<font class="keywordtype">bool</font> quick) 00191 { 00192 <font class="keyword">static</font> uint64 freq; 00193 <font class="keyword">static</font> <font class="keywordtype">bool</font> freqComputed = <font class="keyword">false</font>; 00194 <font class="keywordflow">if</font> (freqComputed) <font class="keywordflow">return</font> freq; 00195 00196 <font class="keywordflow">if</font> (!quick) 00197 { 00198 <a class="code" href="namespaceNLMISC.html#a184">TTicks</a> bestNumTicks = 0; 00199 uint64 bestNumCycles; 00200 uint64 numCycles; 00201 <font class="keyword">const</font> uint numSamples = 5; 00202 <font class="keyword">const</font> uint numLoops = 50000000; 00203 00204 <font class="keyword">volatile</font> uint k; <font class="comment">// prevent optimisation for the loop</font> 00205 <font class="keyword">volatile</font> dummy = 0; 00206 <font class="keywordflow">for</font>(uint <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < numSamples; ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) 00207 { 00208 <a class="code" href="namespaceNLMISC.html#a184">TTicks</a> startTick = <a class="code" href="classNLMISC_1_1CTime.html#d2">NLMISC::CTime::getPerformanceTime</a>(); 00209 uint64 startCycle = rdtsc(); 00210 uint dummy = 0; 00211 <font class="keywordflow">for</font>(k = 0; k < numLoops; ++k) 00212 { 00213 ++ dummy; 00214 } 00215 numCycles = rdtsc() - startCycle; 00216 <a class="code" href="namespaceNLMISC.html#a184">TTicks</a> numTicks = <a class="code" href="classNLMISC_1_1CTime.html#d2">NLMISC::CTime::getPerformanceTime</a>() - startTick; 00217 <font class="keywordflow">if</font> (numTicks > bestNumTicks) 00218 { 00219 bestNumTicks = numTicks; 00220 bestNumCycles = numCycles; 00221 } 00222 } 00223 freq = (uint64) ((double) bestNumCycles * 1 / CTime::ticksToSecond(bestNumTicks)); 00224 } 00225 <font class="keywordflow">else</font> 00226 { 00227 <a class="code" href="namespaceNLMISC.html#a184">TTicks</a> timeBefore = <a class="code" href="classNLMISC_1_1CTime.html#d2">NLMISC::CTime::getPerformanceTime</a>(); 00228 uint64 tickBefore = rdtsc(); 00229 <a class="code" href="namespaceNLMISC.html#a236">nlSleep</a> (100); 00230 <a class="code" href="namespaceNLMISC.html#a184">TTicks</a> timeAfter = <a class="code" href="classNLMISC_1_1CTime.html#d2">NLMISC::CTime::getPerformanceTime</a>(); 00231 <a class="code" href="namespaceNLMISC.html#a184">TTicks</a> tickAfter = rdtsc(); 00232 00233 <font class="keywordtype">double</font> timeDelta = CTime::ticksToSecond(timeAfter - timeBefore); 00234 <a class="code" href="namespaceNLMISC.html#a184">TTicks</a> tickDelta = tickAfter - tickBefore; 00235 00236 freq = (uint64) ((double)tickDelta / timeDelta); 00237 } 00238 00239 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"HTIMER: Processor frequency is %.0f MHz"</font>, (<font class="keywordtype">float</font>)freq/1000000.0); 00240 freqComputed = <font class="keyword">true</font>; 00241 <font class="keywordflow">return</font> freq; 00242 } 00243 <font class="preprocessor">#endif</font> 00244 <font class="preprocessor"></font> 00245 00246 <font class="comment">//=================================================================</font> <a name="l00247"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d0">00247</a> <font class="keywordtype">void</font> CHTimer::startBench(<font class="keywordtype">bool</font> wantStandardDeviation <font class="comment">/*= false*/</font>, <font class="keywordtype">bool</font> quick) 00248 { 00249 <a class="code" href="debug_8h.html#a6">nlassert</a>(!<a class="code" href="classNLMISC_1_1CHTimer.html#r5">_Benching</a>) 00250 <a class="code" href="classNLMISC_1_1CHTimer.html#d9">clear</a>(); 00251 <a class="code" href="classNLMISC_1_1CHTimer.html#r5">_Benching</a> = <font class="keyword">true</font>; 00252 <a class="code" href="classNLMISC_1_1CHTimer.html#r6">_BenchStartedOnce</a> = <font class="keyword">true</font>; 00253 <a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>.<a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m2">Owner</a> = &<a class="code" href="classNLMISC_1_1CHTimer.html#r2">_RootTimer</a>; 00254 <font class="preprocessor"># ifdef NL_CPU_INTEL</font> 00255 <font class="preprocessor"></font> <font class="keywordtype">double</font> freq = (double) getProcessorFrequency(quick); 00256 <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a> = 1000 / (double) freq; 00257 <font class="preprocessor"># else</font> 00258 <font class="preprocessor"></font> <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a> = CTime::ticksToSecond(1000); 00259 <font class="preprocessor"># endif</font> 00260 <font class="preprocessor"></font> CSimpleClock::init(); 00261 <a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>.<a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m2">Owner</a> = &<a class="code" href="classNLMISC_1_1CHTimer.html#r2">_RootTimer</a>; 00262 <a class="code" href="classNLMISC_1_1CHTimer.html#r7">_WantStandardDeviation</a> = wantStandardDeviation; 00263 <a class="code" href="classNLMISC_1_1CHTimer.html#r2">_RootTimer</a>.before(); 00264 } 00265 00266 <font class="comment">//=================================================================</font> <a name="l00267"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d3">00267</a> <font class="keywordtype">void</font> CHTimer::endBench() 00268 { 00269 <font class="keywordflow">if</font> (!<a class="code" href="classNLMISC_1_1CHTimer.html#r5">_Benching</a>) 00270 <font class="keywordflow">return</font>; 00271 00272 <font class="keywordflow">if</font> (<a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a> == &<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>) 00273 { 00274 <a class="code" href="classNLMISC_1_1CHTimer.html#r2">_RootTimer</a>.after(); 00275 } 00276 <font class="keywordflow">else</font> 00277 { 00278 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"FEHTIMER> Stopping the bench inside a benched functions !"</font>); 00279 } 00280 <a class="code" href="classNLMISC_1_1CHTimer.html#r5">_Benching</a> = <font class="keyword">false</font>; 00281 } 00282 00283 <font class="comment">//=================================================================</font> <a name="l00284"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d4">00284</a> <font class="keywordtype">void</font> CHTimer::display(CLog *log, TSortCriterion criterion, <font class="keywordtype">bool</font> displayInline <font class="comment">/*= true*/</font>, <font class="keywordtype">bool</font> displayEx) 00285 { 00286 CSimpleClock benchClock; 00287 benchClock.start(); 00288 <font class="keywordflow">if</font>(!<a class="code" href="classNLMISC_1_1CHTimer.html#r6">_BenchStartedOnce</a>) <font class="comment">// should have done at least one bench </font> 00289 { 00290 benchClock.stop(); 00291 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> += benchClock.getNumTicks(); 00292 <font class="keywordflow">return</font>; 00293 } 00294 log->displayNL(<font class="stringliteral">"HTIMER: ========================================================================="</font>); 00295 log->displayRawNL(<font class="stringliteral">"HTIMER: Bench cumuled results"</font>); 00296 <font class="keyword">typedef</font> std::map<CHTimer *, TNodeVect> TNodeMap; 00297 TNodeMap nodeMap; 00298 <a class="code" href="classNLMISC_1_1CHTimer.html#u0">TNodeVect</a> nodeLeft; 00299 nodeLeft.push_back(&<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>); 00301 <font class="keywordflow">while</font> (!nodeLeft.empty()) 00302 { 00303 CNode *currNode = nodeLeft.back(); 00304 nodeMap[currNode->Owner].push_back(currNode); 00305 nodeLeft.pop_back(); 00306 nodeLeft.insert(nodeLeft.end(), currNode->Sons.begin(), currNode->Sons.end()); 00307 00308 } 00309 <font class="comment">// </font> 00310 <font class="comment">// 2 ) build statistics </font> 00311 <font class="keyword">typedef</font> std::vector<CTimerStat> TTimerStatVect; 00312 <font class="keyword">typedef</font> std::vector<CTimerStat *> TTimerStatPtrVect; 00313 TTimerStatVect stats(nodeMap.size()); 00314 TTimerStatPtrVect statsPtr(stats.size()); 00315 <font class="comment">//</font> 00316 uint k = 0; 00317 <font class="keywordflow">for</font>(TNodeMap::iterator it = nodeMap.begin(); it != nodeMap.end(); ++it) 00318 { 00319 statsPtr[k] = &stats[k]; 00320 stats[k].Timer = it->first; 00321 stats[k].buildFromNodes(&(it->second[0]), it->second.size(), <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00322 ++k; 00323 } 00324 <font class="comment">// 3 ) sort statistics</font> 00325 <font class="keywordflow">if</font> (criterion != <a class="code" href="classNLMISC_1_1CHTimer.html#s8s0">NoSort</a>) 00326 { 00327 CStatSorter sorter(criterion); 00328 std::sort(statsPtr.begin(), statsPtr.end(), sorter); 00329 } 00330 00331 <font class="comment">// 4 ) get root total time.</font> 00332 CStats rootStats; 00333 rootStats.buildFromNode( &<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>, <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00334 00335 <font class="comment">// 5 ) display statistics</font> 00336 uint maxNodeLenght = 0; 00337 std::string <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>; 00338 <font class="keywordflow">if</font> (displayInline) 00339 { 00340 <font class="keywordflow">for</font>(TTimerStatPtrVect::iterator statIt = statsPtr.begin(); statIt != statsPtr.end(); ++statIt) 00341 { 00342 maxNodeLenght = std::max(maxNodeLenght, strlen((*statIt)->Timer->_Name)); 00343 } 00344 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a> = <font class="stringliteral">"HTIMER: %-"</font> + <a class="code" href="namespaceNLMISC.html#a243">NLMISC::toString</a>(maxNodeLenght + 1) + <font class="stringliteral">"s %s"</font>; 00345 } 00346 std::string statsInline; 00347 00348 log->displayRawNL(<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.c_str(), <font class="stringliteral">""</font>, <font class="stringliteral">" | total | local | visits | loc%/ glb% | min | max | mean"</font>); 00349 00350 <font class="keywordflow">for</font>(TTimerStatPtrVect::iterator statIt = statsPtr.begin(); statIt != statsPtr.end(); ++statIt) 00351 { 00352 <font class="keywordflow">if</font> (!displayInline) 00353 { 00354 log->displayRawNL(<font class="stringliteral">"HTIMER: ================================="</font>); 00355 log->displayRawNL(<font class="stringliteral">"HTIMER: Node %s"</font>, (*statIt)->Timer->_Name); 00356 (*statIt)->display(log, displayEx, <a class="code" href="classNLMISC_1_1CHTimer.html#r7">_WantStandardDeviation</a>); 00357 } 00358 <font class="keywordflow">else</font> 00359 { 00360 (*statIt)->getStats(statsInline, displayEx, rootStats.TotalTime, <a class="code" href="classNLMISC_1_1CHTimer.html#r7">_WantStandardDeviation</a>); 00361 <font class="keywordtype">char</font> out[4096]; 00362 <a class="code" href="namespaceNLMISC.html#a211">NLMISC::smprintf</a>(out, 2048, <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.c_str(), (*statIt)->Timer->_Name, statsInline.c_str()); 00363 log->displayRawNL(out); 00364 } 00365 } 00366 benchClock.stop(); 00367 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> += benchClock.getNumTicks(); 00368 } 00369 00370 <font class="comment">//================================================================================================</font> <a name="l00371"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d5">00371</a> <font class="keywordtype">void</font> CHTimer::displayByExecutionPath(CLog *log, TSortCriterion criterion, <font class="keywordtype">bool</font> displayInline, <font class="keywordtype">bool</font> alignPaths, <font class="keywordtype">bool</font> displayEx) 00372 { 00373 CSimpleClock benchClock; 00374 benchClock.start(); 00375 log->displayRawNL(<font class="stringliteral">"HTIMER: ========================================================================="</font>); 00376 log->displayRawNL(<font class="stringliteral">"HTIMER: Bench by execution path"</font>); 00377 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNLMISC_1_1CHTimer.html#r6">_BenchStartedOnce</a>); <font class="comment">// should have done at least one bench </font> 00378 <font class="comment">//</font> 00379 <font class="keyword">typedef</font> std::vector<CNodeStat> TNodeStatVect; 00380 <font class="keyword">typedef</font> std::vector<CNodeStat *> TNodeStatPtrVect; 00381 00382 TNodeStatVect nodeStats; 00383 nodeStats.reserve(<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>.<a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a2">getNumNodes</a>()); 00384 <a class="code" href="classNLMISC_1_1CHTimer.html#u0">TNodeVect</a> nodeLeft; 00385 nodeLeft.push_back(&<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>); 00387 <font class="keywordflow">while</font> (!nodeLeft.empty()) 00388 { 00389 CNode *currNode = nodeLeft.back(); 00390 00391 nodeStats.push_back(CNodeStat()); 00392 nodeStats.back().buildFromNode(currNode, <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00393 nodeStats.back().Node = currNode; 00394 00395 nodeLeft.pop_back(); 00396 nodeLeft.insert(nodeLeft.end(), currNode->Sons.begin(), currNode->Sons.end()); 00397 00398 } 00399 00401 <font class="comment">// create a pointer list</font> 00402 TNodeStatPtrVect nodeStatsPtrs(nodeStats.size()); 00403 <font class="keywordflow">for</font>(uint k = 0; k < nodeStats.size(); ++k) 00404 { 00405 nodeStatsPtrs[k] = &nodeStats[k]; 00406 } 00407 00408 <font class="comment">// 3 ) sort statistics</font> 00409 <font class="keywordflow">if</font> (criterion != <a class="code" href="classNLMISC_1_1CHTimer.html#s8s0">NoSort</a>) 00410 { 00411 CStatSorter sorter(criterion); 00412 std::sort(nodeStatsPtrs.begin(), nodeStatsPtrs.end(), sorter); 00413 } 00414 00415 <font class="comment">// 4 ) get root total time.</font> 00416 CStats rootStats; 00417 rootStats.buildFromNode(&<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>, <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00418 00419 <font class="comment">// 5 ) display statistics</font> 00420 std::string statsInline; 00421 std::string nodePath; 00422 00423 std::string <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>; 00424 <font class="keywordflow">if</font> (displayInline) 00425 { 00426 <font class="keywordflow">if</font> (alignPaths) 00427 { 00428 uint maxSize = 0; 00429 std::string nodePath; 00430 <font class="keywordflow">for</font>(TNodeStatPtrVect::iterator it = nodeStatsPtrs.begin(); it != nodeStatsPtrs.end(); ++it) 00431 { 00432 (*it)->Node->getPath(nodePath); 00433 maxSize = std::max(maxSize, nodePath.size()); 00434 } 00435 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a> = <font class="stringliteral">"HTIMER: %-"</font> + <a class="code" href="namespaceNLMISC.html#a243">NLMISC::toString</a>(maxSize) +<font class="stringliteral">"s %s"</font>; 00436 } 00437 <font class="keywordflow">else</font> 00438 { 00439 <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a> = <font class="stringliteral">"HTIMER: %s %s"</font>; 00440 } 00441 } 00442 00443 log->displayRawNL(<a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.c_str(), <font class="stringliteral">""</font>, <font class="stringliteral">" | total | local | visits | loc%/ glb% | min | max | mean"</font>); 00444 00445 <font class="keywordflow">for</font>(TNodeStatPtrVect::iterator it = nodeStatsPtrs.begin(); it != nodeStatsPtrs.end(); ++it) 00446 { 00447 <font class="keywordflow">if</font> (!displayInline) 00448 { 00449 log->displayRawNL(<font class="stringliteral">"HTIMER: ================================="</font>); 00450 (*it)->Node->displayPath(log); 00451 (*it)->display(log, displayEx, <a class="code" href="classNLMISC_1_1CHTimer.html#r7">_WantStandardDeviation</a>); 00452 } 00453 <font class="keywordflow">else</font> 00454 { 00455 (*it)->getStats(statsInline, displayEx, rootStats.TotalTime, <a class="code" href="classNLMISC_1_1CHTimer.html#r7">_WantStandardDeviation</a>); 00456 (*it)->Node->getPath(nodePath); 00457 00458 <font class="keywordtype">char</font> out[2048]; 00459 <a class="code" href="namespaceNLMISC.html#a211">NLMISC::smprintf</a>(out, 2048, <a class="code" href="driver__opengl__extension__def_8h.html#a398">format</a>.c_str(), nodePath.c_str(), statsInline.c_str()); 00460 log->displayRawNL(out); 00461 } 00462 } 00463 benchClock.stop(); 00464 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> += benchClock.getNumTicks(); 00465 } 00466 00467 <font class="comment">//=================================================================</font> <a name="l00468"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d6">00468</a> <font class="comment">/*static*/</font> <font class="keywordtype">void</font> CHTimer::displayHierarchical(CLog *log, <font class="keywordtype">bool</font> displayEx <font class="comment">/*=true*/</font>,uint labelNumChar <font class="comment">/*=32*/</font>, uint indentationStep <font class="comment">/*= 2*/</font>) 00469 { 00470 CSimpleClock benchClock; 00471 benchClock.start(); 00472 log->displayNL(<font class="stringliteral">"HTIMER: ========================================================================="</font>); 00473 log->displayRawNL(<font class="stringliteral">"HTIMER: Hierarchical display of bench"</font>); 00474 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNLMISC_1_1CHTimer.html#r6">_BenchStartedOnce</a>); <font class="comment">// should have done at least one bench</font> 00475 <font class="keyword">typedef</font> std::map<CHTimer *, TNodeVect> TNodeMap; 00476 TNodeMap nodeMap; 00477 <a class="code" href="classNLMISC_1_1CHTimer.html#u0">TNodeVect</a> nodeLeft; 00478 nodeLeft.push_back(&<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>); 00480 <font class="keywordflow">while</font> (!nodeLeft.empty()) 00481 { 00482 CNode *currNode = nodeLeft.back(); 00483 nodeMap[currNode->Owner].push_back(currNode); 00484 nodeLeft.pop_back(); 00485 nodeLeft.insert(nodeLeft.end(), currNode->Sons.begin(), currNode->Sons.end()); 00486 00487 } 00488 log->displayRawNL(<font class="stringliteral">"HTIMER: %*s | total | local | visits | loc%%/ glb%% | min | max | mean"</font>, labelNumChar, <font class="stringliteral">""</font>); 00489 00491 CStats rootStats; 00492 rootStats.buildFromNode(&<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>, <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00493 00495 CStats currNodeStats; 00496 std::vector<uint> sonsIndex; 00497 uint <a class="code" href="driver__opengl__extension__def_8h.html#a391">depth</a> = 0; 00498 <a class="code" href="classNLMISC_1_1CHTimer.html#a0">CHTimer</a> *currTimer = &<a class="code" href="classNLMISC_1_1CHTimer.html#r2">_RootTimer</a>; 00499 sonsIndex.push_back(0); 00500 <font class="keywordtype">bool</font> displayStat = <font class="keyword">true</font>; 00501 std::string resultName; 00502 std::string resultStats; 00503 <font class="keywordflow">while</font> (!sonsIndex.empty()) 00504 { 00505 <font class="keywordflow">if</font> (displayStat) 00506 { 00507 resultName.resize(labelNumChar); 00508 std::fill(resultName.begin(), resultName.end(), <font class="charliteral">'.'</font>); 00509 uint startIndex = <a class="code" href="driver__opengl__extension__def_8h.html#a391">depth</a> * indentationStep; 00510 uint endIndex = <a class="code" href="bit__set_8cpp.html#a0">std::min</a>(startIndex + ::strlen(currTimer->_Name), labelNumChar); 00511 <font class="keywordflow">if</font> ((sint) (endIndex - startIndex) >= 1) 00512 { 00513 std::copy(currTimer->_Name, currTimer->_Name + (endIndex - startIndex), resultName.begin() + startIndex); 00514 } 00515 <a class="code" href="classNLMISC_1_1CHTimer.html#u0">TNodeVect</a> &execNodes = nodeMap[currTimer]; 00516 currNodeStats.buildFromNodes(&execNodes[0], execNodes.size(), <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00517 currNodeStats.getStats(resultStats, displayEx, rootStats.TotalTime, <a class="code" href="classNLMISC_1_1CHTimer.html#r7">_WantStandardDeviation</a>); 00518 log->displayRawNL(<font class="stringliteral">"HTIMER: %s"</font>, (resultName + resultStats).c_str()); 00519 } 00520 <font class="keywordflow">if</font> (sonsIndex.back() == currTimer->_Sons.size()) 00521 { 00522 sonsIndex.pop_back(); 00523 currTimer = currTimer->_Parent; 00524 displayStat = <font class="keyword">false</font>; 00525 -- <a class="code" href="driver__opengl__extension__def_8h.html#a391">depth</a>; 00526 } 00527 <font class="keywordflow">else</font> 00528 { 00529 currTimer = currTimer->_Sons[sonsIndex.back()]; 00530 ++ sonsIndex.back(); 00531 sonsIndex.push_back(0); 00532 displayStat = <font class="keyword">true</font>; 00533 ++ <a class="code" href="driver__opengl__extension__def_8h.html#a391">depth</a>; 00534 } 00535 } 00536 benchClock.stop(); 00537 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> += benchClock.getNumTicks(); 00538 } 00539 00540 00541 <font class="comment">//=================================================================</font> <a name="l00542"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d7">00542</a> <font class="comment">/*static*/</font> <font class="keywordtype">void</font> CHTimer::displayHierarchicalByExecutionPath(CLog *log, <font class="keywordtype">bool</font> displayEx, uint labelNumChar, uint indentationStep) 00543 { 00544 <a class="code" href="classNLMISC_1_1CHTimer.html#d8">displayHierarchicalByExecutionPathSorted</a>(log, <a class="code" href="classNLMISC_1_1CHTimer.html#s8s0">NoSort</a>, displayEx, labelNumChar, indentationStep); 00545 } 00546 00547 00548 <font class="comment">//=================================================================</font> <a name="l00549"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d8">00549</a> <font class="comment">/*static*/</font> <font class="keywordtype">void</font> CHTimer::displayHierarchicalByExecutionPathSorted(CLog *log, TSortCriterion criterion, <font class="keywordtype">bool</font> displayEx, uint labelNumChar, uint indentationStep) 00550 { 00551 00552 CSimpleClock benchClock; 00553 benchClock.start(); 00554 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNLMISC_1_1CHTimer.html#r6">_BenchStartedOnce</a>); <font class="comment">// should have done at least one bench</font> 00555 00556 <font class="comment">// get root total time.</font> 00557 CStats rootStats; 00558 rootStats.buildFromNode(&<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>, <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00559 00560 00561 <font class="comment">// display header.</font> 00562 TDisplayInfo dummyDspInfo; 00563 log->displayNL(<font class="stringliteral">"HTIMER: ========================================================================="</font>); 00564 log->displayRawNL(<font class="stringliteral">"HTIMER: Hierarchical display of bench by execution path"</font>); 00565 log->displayRawNL(<font class="stringliteral">"HTIMER: %*s | total | local | visits | loc%%/ glb%% | min | max | mean"</font>, labelNumChar, <font class="stringliteral">""</font>); 00566 00567 00568 <font class="comment">// use list because vector of vector is bad.</font> 00569 <a class="code" href="classstd_1_1list.html">std::list< CExamStackEntry ></a> examStack; 00570 00571 <font class="comment">// Add the root to the stack.</font> 00572 examStack.push_back( CExamStackEntry( &<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a> ) ); 00573 CStats currNodeStats; 00574 std::string resultName; 00575 std::string resultStats; 00576 00577 <font class="keywordflow">while</font> (!examStack.empty()) 00578 { 00579 CNode *node = examStack.back().Node; 00580 std::vector<CNode*> &children= examStack.back().Children; 00581 uint child = examStack.back().CurrentChild; 00582 00583 <font class="comment">// If child 0, then must first build children info and display me.</font> 00584 <font class="keywordflow">if</font> (child == 0) 00585 { 00586 <font class="comment">// Build Sons Infos.</font> 00587 <font class="comment">// ==============</font> 00588 00589 <font class="comment">// resize array</font> 00590 children.resize(node->Sons.size()); 00591 00592 <font class="comment">// If no sort, easy.</font> 00593 <font class="keywordflow">if</font>(criterion == <a class="code" href="classNLMISC_1_1CHTimer.html#s8s0">NoSort</a>) 00594 { 00595 children= node->Sons; 00596 } 00597 <font class="comment">// else, Sort them with criterion.</font> 00598 <font class="keywordflow">else</font> 00599 { 00600 std::vector<CNodeStat> stats; 00601 std::vector<CNodeStat *> ptrStats; 00602 stats.resize(children.size()); 00603 ptrStats.resize(children.size()); 00604 00605 <font class="comment">// build stats.</font> 00606 uint i; 00607 <font class="keywordflow">for</font>(i=0; i<children.size(); i++) 00608 { 00609 CNode *childNode= node->Sons[i]; 00610 stats[i].buildFromNode(childNode, <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00611 stats[i].Node = childNode; 00612 ptrStats[i]= &stats[i]; 00613 } 00614 00615 <font class="comment">// sort.</font> 00616 CStatSorter sorter; 00617 sorter.Criterion= criterion; 00618 std::sort(ptrStats.begin(), ptrStats.end(), sorter); 00619 00620 <font class="comment">// fill children.</font> 00621 <font class="keywordflow">for</font>(i=0; i<children.size(); i++) 00622 { 00623 children[i]= ptrStats[i]->Node; 00624 } 00625 } 00626 00627 00628 <font class="comment">// Display our infos</font> 00629 <font class="comment">// ==============</font> 00630 <font class="comment">// build the indented node name.</font> 00631 resultName.resize(labelNumChar); 00632 std::fill(resultName.begin(), resultName.end(), <font class="charliteral">'.'</font>); 00633 uint startIndex = (examStack.size()-1) * indentationStep; 00634 uint endIndex = <a class="code" href="bit__set_8cpp.html#a0">std::min</a>(startIndex + ::strlen(node->Owner->_Name), labelNumChar); 00635 <font class="keywordflow">if</font> ((sint) (endIndex - startIndex) >= 1) 00636 { 00637 std::copy(node->Owner->_Name, node->Owner->_Name + (endIndex - startIndex), resultName.begin() + startIndex); 00638 } 00639 00640 <font class="comment">// build the stats string.</font> 00641 currNodeStats.buildFromNode(node, <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00642 currNodeStats.getStats(resultStats, displayEx, rootStats.TotalTime, <a class="code" href="classNLMISC_1_1CHTimer.html#r7">_WantStandardDeviation</a>); 00643 00644 <font class="comment">// display</font> 00645 log->displayRawNL(<font class="stringliteral">"HTIMER: %s"</font>, (resultName + resultStats).c_str()); 00646 } 00647 00648 <font class="comment">// End of sons?? stop.</font> 00649 <font class="keywordflow">if</font> (child >= children.size()) 00650 { 00651 examStack.pop_back(); 00652 <font class="keywordflow">continue</font>; 00653 } 00654 00655 <font class="comment">// next son.</font> 00656 ++(examStack.back().CurrentChild); 00657 00658 <font class="comment">// process the current son.</font> 00659 examStack.push_back( CExamStackEntry( children[child] ) ); 00660 } 00661 00662 <font class="comment">//</font> 00663 benchClock.stop(); 00664 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> += benchClock.getNumTicks(); 00665 } 00666 00667 <font class="comment">//=================================================================</font> <a name="l00668"></a><a class="code" href="classNLMISC_1_1CHTimer.html#d9">00668</a> <font class="keywordtype">void</font> CHTimer::clear() 00669 { 00670 <font class="comment">// should not be benching !</font> 00671 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a> == &<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>) 00672 <a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>.<a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a3">releaseSons</a>(); 00673 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a> = &<a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>; 00674 <a class="code" href="classNLMISC_1_1CHTimer.html#r0">_RootNode</a>.<a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#a4">reset</a>(); 00675 } 00676 00677 <font class="comment">//=================================================================</font> <a name="l00678"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#a0">00678</a> <font class="keywordtype">void</font> CHTimer::CStats::buildFromNode(CNode *node, <font class="keywordtype">double</font> msPerTick) 00679 { 00680 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#a1">buildFromNodes</a>(&node, 1, msPerTick); 00681 } 00682 00683 <font class="comment">//=================================================================</font> <a name="l00684"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#a1">00684</a> <font class="keywordtype">void</font> CHTimer::CStats::buildFromNodes(CNode **nodes, uint numNodes, <font class="keywordtype">double</font> msPerTick) 00685 { 00686 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a> = 0; 00687 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a> = 0; 00688 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m4">NumVisits</a> = 0; 00689 00690 uint64 minTime = (uint64) -1; 00691 uint64 maxTime = 0; 00692 00693 uint k, <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>; 00694 <font class="keywordflow">for</font>(k = 0; k < numNodes; ++k) 00695 { 00696 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a> += nodes[k]->TotalTime * msPerTick; 00697 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a> += (nodes[k]->TotalTime - nodes[k]->LastSonsTotalTime) * msPerTick; 00698 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m4">NumVisits</a> += nodes[k]->NumVisits; 00699 minTime = <a class="code" href="bit__set_8cpp.html#a0">std::min</a>(minTime, nodes[k]-><a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m5">MinTime</a>); 00700 maxTime = std::max(maxTime, nodes[k]-><a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m6">MaxTime</a>); 00701 } 00702 <font class="keywordflow">if</font> (minTime == (uint64) -1) 00703 { 00704 minTime = 0; 00705 } 00706 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m5">MinTime</a> = minTime * msPerTick; 00707 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m6">MaxTime</a> = maxTime * msPerTick; 00708 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m3">MeanTime</a> = <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a> / <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m4">NumVisits</a>; 00709 00710 <font class="comment">// compute standard deviation</font> 00711 <font class="keywordtype">double</font> varianceSum = 0; 00712 uint numMeasures = 0; 00713 <font class="keywordflow">for</font>(k = 0; k < numNodes; ++k) 00714 { 00715 numMeasures += nodes[k]->Measures.size(); 00716 <font class="keywordflow">for</font>(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> = 0; <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a> < nodes[k]->Measures.size(); ++<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>) 00717 { 00718 varianceSum += <a class="code" href="namespaceNLMISC.html#a214">NLMISC::sqr</a>(nodes[k]->Measures[<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>] - <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m3">MeanTime</a>); 00719 } 00720 } 00721 <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m0">TimeStandardDeviation</a> = numMeasures == 0 ? 0 00722 : ::sqrt(varianceSum / (numMeasures +1)); 00723 } 00724 00725 <font class="comment">//=================================================================</font> <a name="l00726"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#a2">00726</a> <font class="keywordtype">void</font> CHTimer::CStats::display(CLog *log, <font class="keywordtype">bool</font> displayEx, <font class="keywordtype">bool</font> wantStandardDeviation <font class="comment">/* = false*/</font>) 00727 { 00728 log->displayRawNL(<font class="stringliteral">"HTIMER: Total time = %.3f ms"</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a>); 00729 log->displayRawNL(<font class="stringliteral">"HTIMER: Total time without sons = %.3f ms"</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a>); 00730 log->displayRawNL((<font class="stringliteral">"HTIMER: Num visits = "</font> + NLMISC::toString(<a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m4">NumVisits</a>)).c_str()); 00731 <font class="keywordflow">if</font> (displayEx) 00732 { 00733 log->displayRawNL(<font class="stringliteral">"HTIMER: Min time = %.3f ms"</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m5">MinTime</a>); 00734 log->displayRawNL(<font class="stringliteral">"HTIMER: Max time = %.3f ms"</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m6">MaxTime</a>); 00735 log->displayRawNL(<font class="stringliteral">"HTIMER: Mean time = %.3f ms"</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m3">MeanTime</a>); 00736 <font class="keywordflow">if</font> (wantStandardDeviation) 00737 { 00738 log->displayRawNL(<font class="stringliteral">"HTIMER: Standard deviation = %.3f ms"</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m0">TimeStandardDeviation</a>); 00739 } 00740 <font class="comment">//log->displayRawNL("Time standard deviation = %.3f ms", (float) TimeStandardDeviation);</font> 00741 } 00742 } 00743 00744 00745 <font class="comment">//=================================================================</font> <a name="l00746"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#a3">00746</a> <font class="keywordtype">void</font> CHTimer::CStats::getStats(std::string &dest, <font class="keywordtype">bool</font> statEx, <font class="keywordtype">double</font> rootTotalTime, <font class="keywordtype">bool</font> wantStandardDeviation <font class="comment">/*= false*/</font>) 00747 { 00748 <font class="keywordtype">char</font> buf[1024]; 00749 <font class="keywordflow">if</font> (!wantStandardDeviation) 00750 { 00751 <font class="keywordflow">if</font> (!statEx) 00752 { 00753 <a class="code" href="namespaceNLMISC.html#a211">NLMISC::smprintf</a>(buf, 1024, <font class="stringliteral">" | %10.3f | %10.3f | %12s "</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a>, <a class="code" href="namespaceNLMISC.html#a243">toString</a>(NumVisits).c_str()); 00754 } 00755 <font class="keywordflow">else</font> 00756 { 00757 <a class="code" href="namespaceNLMISC.html#a211">NLMISC::smprintf</a>(buf, 1024, <font class="stringliteral">" | %10.3f | %10.3f | %12s | %5.1f/%5.1f | %9.3f | %9.3f | %9.3f"</font>, 00758 (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a>, <a class="code" href="namespaceNLMISC.html#a243">toString</a>(NumVisits).c_str(), 00759 float(100*<a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a>/rootTotalTime), float(100*<a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a>/rootTotalTime), 00760 (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m5">MinTime</a>, (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m6">MaxTime</a>, (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m3">MeanTime</a> 00761 ); 00762 } 00763 } 00764 <font class="keywordflow">else</font> 00765 { 00766 <font class="keywordflow">if</font> (!statEx) 00767 { 00768 <a class="code" href="namespaceNLMISC.html#a211">NLMISC::smprintf</a>(buf, 1024, <font class="stringliteral">" | %10.3f | %10.3f | %12s | std deviation %9.3f"</font>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a>, <a class="code" href="namespaceNLMISC.html#a243">toString</a>(NumVisits).c_str(), (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m0">TimeStandardDeviation</a>); 00769 } 00770 <font class="keywordflow">else</font> 00771 { 00772 <a class="code" href="namespaceNLMISC.html#a211">NLMISC::smprintf</a>(buf, 1024, <font class="stringliteral">" | %10.3f | %10.3f | %12s | %5.1f/%5.1f | %9.3f | %9.3f | %9.3f | std deviation %9.3f"</font>, 00773 (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a>, (<font class="keywordtype">float</font>) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a>, <a class="code" href="namespaceNLMISC.html#a243">toString</a>(NumVisits).c_str(), 00774 float(100*<a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m2">TotalTimeWithoutSons</a>/rootTotalTime), float(100*<a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m1">TotalTime</a>/rootTotalTime), 00775 (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m5">MinTime</a>, (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m6">MaxTime</a>, (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m3">MeanTime</a>, 00776 (float) <a class="code" href="structNLMISC_1_1CHTimer_1_1CStats.html#m0">TimeStandardDeviation</a> 00777 ); 00778 } 00779 } 00780 dest = buf; 00781 } 00782 00783 00784 <font class="comment">//=================================================================</font> <a name="l00785"></a><a class="code" href="structNLMISC_1_1CHTimer_1_1CStatSorter.html#a1">00785</a> <font class="keywordtype">bool</font> CHTimer::CStatSorter::operator()(<font class="keyword">const</font> CHTimer::CStats *lhs, <font class="keyword">const</font> CHTimer::CStats *rhs) 00786 { 00787 <font class="keywordflow">switch</font>(Criterion) 00788 { 00789 <font class="keywordflow">case</font> CHTimer::TotalTime: <font class="keywordflow">return</font> lhs->TotalTime >= rhs->TotalTime; 00790 <font class="keywordflow">case</font> CHTimer::TotalTimeWithoutSons: <font class="keywordflow">return</font> lhs->TotalTimeWithoutSons >= rhs->TotalTimeWithoutSons; 00791 <font class="keywordflow">case</font> CHTimer::MeanTime: <font class="keywordflow">return</font> lhs->MeanTime >= rhs->MeanTime; 00792 <font class="keywordflow">case</font> CHTimer::NumVisits: <font class="keywordflow">return</font> lhs->NumVisits >= rhs->NumVisits; 00793 <font class="keywordflow">case</font> CHTimer::MaxTime: <font class="keywordflow">return</font> lhs->MaxTime >= rhs->MaxTime; 00794 <font class="keywordflow">case</font> CHTimer::MinTime: <font class="keywordflow">return</font> lhs->MinTime < rhs->MinTime; 00795 <font class="keywordflow">default</font>: 00796 <a class="code" href="debug_8h.html#a6">nlassert</a>(0); <font class="comment">// not a valid criterion</font> 00797 <font class="keywordflow">break</font>; 00798 } 00799 <font class="keywordflow">return</font> <font class="keyword">false</font>; 00800 } 00801 00802 00803 <font class="comment">//===============================================</font> <a name="l00804"></a><a class="code" href="classNLMISC_1_1CHTimer.html#a1">00804</a> <font class="keywordtype">void</font> CHTimer::before() 00805 { 00806 <font class="keywordflow">if</font> (!<a class="code" href="classNLMISC_1_1CHTimer.html#r5">_Benching</a>) <font class="keywordflow">return</font>; 00807 <a class="code" href="classNLMISC_1_1CHTimer.html#r3">_PreambuleClock</a>.start(); 00808 <a class="code" href="classNLMISC_1_1CHTimer.html#c0">walkTreeToCurrent</a>(); 00809 ++ <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m9">NumVisits</a>; 00810 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> = 0; 00811 <font class="keywordflow">if</font> (!<a class="code" href="classNLMISC_1_1CHTimer.html#o1">_Parent</a> && <a class="code" href="classNLMISC_1_1CHTimer.html#r8">_CurrTimer</a> != <font class="keyword">this</font>) 00812 { 00813 <a class="code" href="classNLMISC_1_1CHTimer.html#o1">_Parent</a> = <a class="code" href="classNLMISC_1_1CHTimer.html#r8">_CurrTimer</a>; 00814 <font class="comment">// register as a son of the parent</font> 00815 <a class="code" href="classNLMISC_1_1CHTimer.html#o1">_Parent</a>->_Sons.push_back(<font class="keyword">this</font>); 00816 } 00817 <a class="code" href="classNLMISC_1_1CHTimer.html#r8">_CurrTimer</a> = <font class="keyword">this</font>; 00818 <a class="code" href="classNLMISC_1_1CHTimer.html#r3">_PreambuleClock</a>.stop(); 00819 <font class="keywordflow">if</font> (<a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m0">Parent</a>) 00820 { 00821 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m0">Parent</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> += <a class="code" href="classNLMISC_1_1CHTimer.html#r3">_PreambuleClock</a>.getNumTicks(); 00822 } 00823 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m11">Clock</a>.start(); 00824 } 00825 00826 <font class="comment">//===============================================</font> <a name="l00827"></a><a class="code" href="classNLMISC_1_1CHTimer.html#a2">00827</a> <font class="keywordtype">void</font> CHTimer::after(<font class="keywordtype">bool</font> displayAfter <font class="comment">/*= false*/</font>) 00828 { 00829 <font class="keywordflow">if</font> (!<a class="code" href="classNLMISC_1_1CHTimer.html#r5">_Benching</a>) <font class="keywordflow">return</font>; 00830 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m11">Clock</a>.stop(); 00831 <a class="code" href="classNLMISC_1_1CHTimer.html#r3">_PreambuleClock</a>.start(); 00832 <font class="comment">// </font> 00833 <font class="comment">//nlinfo((std::string("clock ") + _Name + std::string(" time = ") + NLMISC::toString(_CurrNode->Clock.getNumTicks())).c_str());</font> 00834 sint64 numTicks = <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m11">Clock</a>.getNumTicks() - <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> - (CSimpleClock::getStartStopNumTicks() << 1); 00835 numTicks= std::max((sint64)0, numTicks); 00836 00837 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m3">TotalTime</a> += numTicks; 00838 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m7">MinTime</a> = <a class="code" href="bit__set_8cpp.html#a0">std::min</a>(<a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m7">MinTime</a>, (uint64)numTicks); 00839 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m8">MaxTime</a> = std::max(<a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m8">MaxTime</a>, (uint64)numTicks); 00840 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m4">LastSonsTotalTime</a> = <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m5">SonsTotalTime</a>; 00841 00842 <font class="keywordflow">if</font> (displayAfter) 00843 { 00844 <a class="code" href="debug_8h.html#a1">nlinfo</a>(<font class="stringliteral">"FEHTIMER> %s %.3fms loop number %d"</font>, <a class="code" href="classNLMISC_1_1CHTimer.html#o0">_Name</a>, numTicks * <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>, <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m9">NumVisits</a>); 00845 } 00846 <font class="comment">//</font> 00847 <font class="keywordflow">if</font> (_WantStandardDeviation) 00848 { 00849 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m6">Measures</a>.push_back(numTicks * <a class="code" href="classNLMISC_1_1CHTimer.html#r4">_MsPerTick</a>); 00850 } 00851 <font class="comment">//</font> 00852 <font class="keywordflow">if</font> (_Parent) 00853 { 00854 <a class="code" href="classNLMISC_1_1CHTimer.html#r8">_CurrTimer</a> = <a class="code" href="classNLMISC_1_1CHTimer.html#o1">_Parent</a>; 00855 } 00856 <font class="comment">//</font> 00857 <font class="keywordflow">if</font> (<a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m0">Parent</a>) 00858 { 00859 <a class="code" href="classNLMISC_1_1CHTimer.html#r3">_PreambuleClock</a>.stop(); 00860 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a> = <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m0">Parent</a>; 00861 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m5">SonsTotalTime</a> += numTicks; 00862 <a class="code" href="classNLMISC_1_1CHTimer.html#r1">_CurrNode</a>-><a class="code" href="structNLMISC_1_1CHTimer_1_1CNode.html#m10">SonsPreambule</a> += <a class="code" href="classNLMISC_1_1CHTimer.html#r3">_PreambuleClock</a>.getNumTicks(); 00863 } 00864 <font class="keywordflow">else</font> 00865 { 00866 <a class="code" href="classNLMISC_1_1CHTimer.html#r3">_PreambuleClock</a>.stop(); 00867 } 00868 } 00869 00870 } <font class="comment">// NLMISC</font> 00871 </pre></div> <!-- footer --> <BR><FONT Size=+5> </FONT> </TD> <TD WIDTH=15><IMG SRC=/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> </TR> </TABLE> </BODY> </HTML>