This is the mail archive of the
mailing list for the GCC project.
Re: Where is gethrtime()?
- From: "Ernest L. Williams Jr." <ernesto at ornl dot gov>
- To: "Nelson H. F. Beebe" <beebe at math dot utah dot edu>
- Cc: GCC-Help <gcc-help at gcc dot gnu dot org>
- Date: Mon, 24 Oct 2005 08:45:31 -0400
- Subject: Re: Where is gethrtime()?
- References: <CMM.firstname.lastname@example.org>
On Mon, 2005-10-24 at 06:29 -0600, Nelson H. F. Beebe wrote:
> Ernesto L. Williams, Jr. <email@example.com> asks about the
> availability of high-resolution timers, and whether the gethrtime()
> function is found only on Solaris.
> Although this question is off-topic on the gcc-help list, it may
> nevertheless be of interest to readers, because it is question that
> many of us have probably raised, and for which Unix vendors and
> programming-language standards bodies have provided little help.
> Today, with GHz clocks on modern processors, the 60 and 100 ticks per
> second of the default CPU timer is completely inadequate for serious
> The profiling version of awk, pawk, that I prepared in 2002 has some
> notes and code on the topic. This is an interest of mine, and pawk is
> available at:
> ftp://ftp.math.utah.edu/pub pawk
> There are implementations in pawk of high-resolution timers in
> cpuclock.c for GNU/Linux on PowerPC, Sun Solaris, and for the
> DEC/Compaq/HP Alpha architecture. The files README.PROFILE, mail.txt,
> and TIMER.NOTES record additional information that I collected.
> If others on this list of new information to contribute that would
> extend coverage to other platforms, I'll be happy to make an updated
> version of cpuclock.c, and prepare an improved version of the
> TIMER.NOTES file.
I ask this question on the Fedora mailing list after realizing this was
the wrong place. However, I did receive the following response from one
of the developers:
======== message from Ulrich Drepper =================================
gethrtime on Solaris is using the cycle counters. This is an unreliable
clock, at least on x86/x86-64 since the clock speed can vary and, more
importantly, the cycle counter value could vary between different
processors on the system. Although the latter works correctly on most
small SMP machines it is not guaranteed.
Having said that, the C library provides the POSIX interfaces
clock_gettime and friends. Before the kernel support was added to
support them, the clock_gettime interface for the CPU clocks was using
the rdtsc instruction on x86 and x86-64. So the interfaces were really
equivalent to the gethrtime interface on Solaris. With kernel support
available now these calls are syscalls but they still provide a high
resolution (still based on rdtsc data, but more reliable). The big
difference is that now the CPU clock really only counts the time the
thread/process uses the CPU. If you just need an incremental time, then
use CLOCK_REALTIME instead. Its exported resolution isn't quite as high
but it runs continuously.
â Ulrich Drepper â Red Hat, Inc. â 444 Castro St â Mountain View, CA