2010/6/11 Marcin Gozdalik <span dir="ltr"><<a href="mailto:gozdal@gmail.com" target="_blank">gozdal@gmail.com</a>></span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



2010/6/11 Steven McCoy <span dir="ltr"><<a href="mailto:steven.mccoy@miru.hk" target="_blank">steven.mccoy@miru.hk</a>></span><br><div class="gmail_quote"><div><div></div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204, 204, 204);padding-left:1ex">




<div>On 11 June 2010 16:11, Steven McCoy <span dir="ltr"><<a href="mailto:steven.mccoy@miru.hk" target="_blank">steven.mccoy@miru.hk</a>></span> wrote:<br></div><div class="gmail_quote"><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204, 204, 204);padding-left:1ex">






<div>"<span style="font-family:'Lucida Grande',Verdana,Arial,sans-serif;font-size:12px;color:rgb(68, 68, 68);line-height:21px">It takes 324 cycles per call to complete 1 million GTOD calls without RDTSCP and 221 cycles per call with the capability."</span></div>






<div class="gmail_quote">
<div><br></div><div><br></div></div></blockquote><div><br></div></div><div>Compare this with HPET which I clock about 500ns when using mmap(), it would be significantly slower when using libc IO to read from the device.</div>




<div>

<br></div><div>WIthout RDTSCP or HPET you can use CPUID+RDTSC or complicated tracking of current cores and TSC offsets, etc, which is absolutely broken on hyperthreading processors.</div></div></blockquote></div></div><div>



<br>A micro-benchmark comparing various time-tracking methods (for FreeBSD but probably easily portable) was posted on <a href="http://unix.derkeiler.com/Mailing-Lists/FreeBSD/performance/2008-06/msg00000.html" target="_blank">http://unix.derkeiler.com/Mailing-Lists/FreeBSD/performance/2008-06/msg00000.html</a> On Linux the fastest is clock_getttime(CLOCK_MONOTONIC_COARSE) (recently introduced in 2.6.3X - see <a href="http://lwn.net/Articles/347811/" target="_blank">http://lwn.net/Articles/347811/</a>)<br>



</div></div></blockquote></div><div><br></div>I did some testing on 2 Ubuntu 10.04 machines. The code I used is at <a href="http://gozdal.com/bench_time.c" target="_blank">http://gozdal.com/bench_time.c</a> <div><br></div>

<div>On the first machine: </div>
<div><br></div><div>uname -a</div><div><div>Linux monster 2.6.32-22-generic #36-Ubuntu SMP Thu Jun 3 19:31:57 UTC 2010 x86_64 GNU/Linux</div></div><div><br></div><div>/proc/cpuinfo</div><div><br></div><div><div>processor<span style="white-space:pre">    </span>: 0..3</div>


<div>model name<span style="white-space:pre">     </span>: AMD Phenom(tm) II X4 940 Processor</div><div>cpu MHz<span style="white-space:pre">           </span>: 3000.000</div></div><div><br>
</div><div><div>gozdal@monster:~/workspace/timebench$ ./bench_time 10000000 | sort -rnk1</div><div><br></div><div>Timing micro-benchmark.  10000000 syscall iterations.</div><div>Avg. us/call<span style="white-space:pre">       </span>Elapsed<span style="white-space:pre">              </span>Name</div>


<div>Value from time(3): 1276256828</div><div>Last value from gettimeofday(2): 1276256828.115517</div><div>Last value from clock_gettime(2/CLOCK_THREAD_CPUTIME_ID): 7.304321731</div><div>Last value from clock_gettime(2/CLOCK_REALTIME): 1276256829.413954584</div>


<div>Last value from clock_gettime(2/CLOCK_REALTIME_COARSE): 1276256829.503674678</div><div>Last value from clock_gettime(2/CLOCK_PROCESS_CPUTIME_ID): 5.629295133</div><div>Last value from clock_gettime(2/CLOCK_MONOTONIC): 3012.553881518</div>


<div>Last value from clock_gettime(2/CLOCK_MONOTONIC_RAW): 3013.496360362</div><div>Last value from clock_gettime(2/CLOCK_MONOTONIC_COARSE): 3013.710833565</div><div>0.176539<span style="white-space:pre">      </span>1.765387<span style="white-space:pre">     </span>clock_gettime(2/CLOCK_PROCESS_CPUTIME_ID)</div>


<div>0.167505<span style="white-space:pre">       </span>1.675046<span style="white-space:pre">     </span>clock_gettime(2/CLOCK_THREAD_CPUTIME_ID)</div><div>0.104913<span style="white-space:pre">      </span>1.049130<span style="white-space:pre">     </span>clock_gettime(2/CLOCK_MONOTONIC_RAW)</div>


<div>0.065641<span style="white-space:pre">       </span>0.656409<span style="white-space:pre">     </span>clock_gettime(2/CLOCK_MONOTONIC)</div><div>0.065080<span style="white-space:pre">      </span>0.650796<span style="white-space:pre">     </span>gettimeofday(2)</div>


<div>0.065006<span style="white-space:pre">       </span>0.650058<span style="white-space:pre">     </span>time(3)</div><div>0.064833<span style="white-space:pre">       </span>0.648334<span style="white-space:pre">     </span>clock_gettime(2/CLOCK_REALTIME)</div>


<div>0.011304<span style="white-space:pre">       </span>0.113035<span style="white-space:pre">     </span>clock_gettime(2/CLOCK_MONOTONIC_COARSE)</div><div>0.009635<span style="white-space:pre">       </span>0.096351<span style="white-space:pre">     </span>clock_gettime(2/CLOCK_REALTIME_COARSE)</div>


</div><div><br></div><div>On the second one (MacBook laptop running under Ubuntu 10.04)</div><div><br></div><div><div>Linux gozdal 2.6.32-22-generic #36-Ubuntu SMP Thu Jun 3 22:02:19 UTC 2010 i686 GNU/Linux</div></div><div>

<br></div><div><div><div>processor<span class="Apple-tab-span" style="white-space:pre"> </span>: 0..1</div><div>model name<span class="Apple-tab-span" style="white-space:pre">     </span>: Intel(R) Core(TM)2 CPU         T7200  @ 2.00GHz</div>

</div></div><div><div>cpu MHz<span class="Apple-tab-span" style="white-space:pre">            </span>: 2000.000</div></div><div><br></div><div><div>gozdal@gozdal:~/bench_time$ ./bench_time 1000000 | sort -rnk1</div><div>Timing micro-benchmark.  1000000 syscall iterations.</div>

<div>Avg. us/call<span class="Apple-tab-span" style="white-space:pre">  </span>Elapsed<span class="Apple-tab-span" style="white-space:pre">             </span>Name</div><div>Value from time(3): 1276256889</div><div>Last value from gettimeofday(2): 1276256888.761737</div>

<div>Last value from clock_gettime(2/CLOCK_THREAD_CPUTIME_ID): 7.657109212</div><div>Last value from clock_gettime(2/CLOCK_REALTIME): 1276256890.434721507</div><div>Last value from clock_gettime(2/CLOCK_REALTIME_COARSE): 1276256890.793074738</div>

<div>Last value from clock_gettime(2/CLOCK_PROCESS_CPUTIME_ID): 7.078902976</div><div>Last value from clock_gettime(2/CLOCK_MONOTONIC): 508.237703705</div><div>Last value from clock_gettime(2/CLOCK_MONOTONIC_RAW): 509.592515633</div>

<div>Last value from clock_gettime(2/CLOCK_MONOTONIC_COARSE): 509.961003092</div><div><div>1.375865<span class="Apple-tab-span" style="white-space: pre; ">   </span>1.375865<span class="Apple-tab-span" style="white-space: pre; "> </span>gettimeofday(2)</div>

<div>1.354788<span class="Apple-tab-span" style="white-space: pre; ">   </span>1.354788<span class="Apple-tab-span" style="white-space: pre; "> </span>clock_gettime(2/CLOCK_MONOTONIC_RAW)</div><div>1.354032<span class="Apple-tab-span" style="white-space: pre; ">      </span>1.354032<span class="Apple-tab-span" style="white-space: pre; "> </span>clock_gettime(2/CLOCK_MONOTONIC)</div>

<div>1.350675<span class="Apple-tab-span" style="white-space: pre; ">   </span>1.350675<span class="Apple-tab-span" style="white-space: pre; "> </span>clock_gettime(2/CLOCK_REALTIME)</div></div><div>0.625702<span class="Apple-tab-span" style="white-space:pre">  </span>0.625702<span class="Apple-tab-span" style="white-space:pre">    </span>clock_gettime(2/CLOCK_PROCESS_CPUTIME_ID)</div>

<div>0.578193<span class="Apple-tab-span" style="white-space:pre">      </span>0.578193<span class="Apple-tab-span" style="white-space:pre">    </span>clock_gettime(2/CLOCK_THREAD_CPUTIME_ID)</div><div>0.370512<span class="Apple-tab-span" style="white-space:pre">     </span>0.370512<span class="Apple-tab-span" style="white-space:pre">    </span>clock_gettime(2/CLOCK_MONOTONIC_COARSE)</div>

<div>0.361006<span class="Apple-tab-span" style="white-space:pre">      </span>0.361006<span class="Apple-tab-span" style="white-space:pre">    </span>clock_gettime(2/CLOCK_REALTIME_COARSE)</div><div>0.322257<span class="Apple-tab-span" style="white-space:pre">       </span>0.322257<span class="Apple-tab-span" style="white-space:pre">    </span>time(3)</div>

</div><div><br></div><div>It's little surprising to see simple time the fastest on my laptop.</div><div><br></div><div>Under MacOS AFAIK there is no clock_gettime</div><div><br>-- <br>Marcin Gozdalik<br>
</div>