[Python-checkins] peps: PEP 418: Add tables of clock accuracy

victor.stinner python-checkins at python.org
Tue Apr 3 00:18:54 CEST 2012


http://hg.python.org/peps/rev/8fbc2d2213b9
changeset:   4188:8fbc2d2213b9
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Apr 03 00:18:51 2012 +0200
summary:
  PEP 418: Add tables of clock accuracy

 * Add a "NTP adjusted" section
 * Don't use CLOCK_MONOTONIC_RAW on Linux for time.monotonic()

files:
  pep-0418.txt |  95 ++++++++++++++++++++++++++++++++++-----
  1 files changed, 82 insertions(+), 13 deletions(-)


diff --git a/pep-0418.txt b/pep-0418.txt
--- a/pep-0418.txt
+++ b/pep-0418.txt
@@ -143,12 +143,9 @@
                     clk_id = monotonic.clocks[0]
                     return time.clock_gettime(clk_id)
                 except OSError:
-                    # CLOCK_MONOTONIC_RAW requires a Linux kernel >= 2.6.28
                     del monotonic.clocks[0]
             return time.time()
         monotonic.clocks = []
-        if hasattr(time, 'CLOCK_MONOTONIC_RAW'):
-            monotonic.clocks.append(time.CLOCK_MONOTONIC_RAW)
         if hasattr(time, 'CLOCK_HIGHRES'):
             monotonic.clocks.append(time.CLOCK_HIGHRES)
         monotonic.clocks.append(time.CLOCK_MONOTONIC)
@@ -246,6 +243,32 @@
   32,768 Hz
 
 
+NTP adjusted
+============
+
+NTP has diffent methods to adjust a clock:
+
+ * "slewing": change the clock frequency to be slightly faster or slower
+   (which is done with adjtime()). Since the slew rate is limited to 0.5 ms/s,
+   each second of adjustment requires an amortization interval of 2000 s. Thus,
+   an adjustment of many seconds can take hours or days to amortize.
+ * "stepping": jump by a large amount in a single discrete step (which is done
+   with settimeofday())
+
+By default, the time is slewed if the offset is less than 128 ms, or stepped
+otherwise.
+
+Slewing is generally desirable (i.e. we should use CLOCK_MONOTONIC, not
+CLOCK_MONOTONIC_RAW) if one wishes to measure "real" time (and not a time-like
+object like CPU cycles). This is because the clock on the other end of the NTP
+connection from you is probably better at keeping time: hopefully that thirty
+five thousand dollars of Cesium timekeeping goodness is doing something better
+than your PC's $3 quartz crystal, after all.
+
+Get more detail in the `documentation of the NTP daemon
+<http://doc.ntp.org/4.1.2/ntpd.htm>`_.
+
+
 Operating system clocks
 =======================
 
@@ -258,7 +281,7 @@
 CLOCK_MONOTONIC_RAW       1 ns            (*)             No               Stopped
 gethrtime                 1 ns            (*)             No               Not stopped
 CLOCK_HIGHRES             1 ns            (*)             No               ?
-CLOCK_MONOTONIC           1 ns            (*)             Yes on Linux     Stopped on Linux
+CLOCK_MONOTONIC           1 ns            (*)             Slewed on Linux  Stopped on Linux
 mach_absolute_time()      1 ns            (*)             No               ?
 QueryPerformanceCounter() \-              0.3 ns - 5 ns   No               Accuracy issue
 GetTickCount[64]()        1 ms            1 ms - 15 ms    No               Include suspend time
@@ -278,6 +301,25 @@
 example, QueryPerformanceCounter() has a good accuracy but is known to
 not have a steady rate.
 
+Examples of clock accuracy on x86_64:
+
+=========================  ================  ===============
+Name                       Operating system  Accuracy
+=========================  ================  ===============
+CLOCK_MONOTONIC_RAW        Linux 3.2         1 ns
+CLOCK_MONOTONIC            Linux 3.2         1 ns
+CLOCK_HIGHRES              SunOS 5.11        2 ns
+CLOCK_MONOTONIC            SunOS 5.11        2 ns
+QueryPerformanceCounter    Windows Vista     10 ns
+CLOCK_MONOTONIC            FreeBSD 8.2       11 ns
+CLOCK_MONOTONIC            OpenBSD 5.0       10 ms
+GetTickCount               Windows Vista     15.6 ms
+=========================  ================  ===============
+
+For CLOCK_MONOTONIC and CLOCK_MONOTONIC_RAW, the accuracy of this table is the
+result of clock_getres(). It looks like Linux does not implement
+clock_getres() and always return 1 nanosecond.
+
 
 mach_absolute_time
 ^^^^^^^^^^^^^^^^^^
@@ -325,14 +367,12 @@
 * Mac OS X
 * Windows
 
-CLOCK_MONOTONIC_RAW is specific to Linux.  It is similar to
-CLOCK_MONOTONIC, but provides access to a raw hardware-based time that
-is not subject to NTP adjustments.  CLOCK_MONOTONIC_RAW requires Linux
-2.6.28 or later.
+On Linux, NTP may adjust the CLOCK_MONOTONIC rate (slewed), but it cannot
+jump backward.
 
-On Linux, NTP may adjust the CLOCK_MONOTONIC rate, but it cannot jump
-backward.  If available, CLOCK_MONOTONIC_RAW should be used instead of
-CLOCK_MONOTONIC to avoid the NTP adjustment.
+CLOCK_MONOTONIC_RAW is specific to Linux. It is similar to CLOCK_MONOTONIC, but
+provides access to a raw hardware-based time that is not subject to NTP
+adjustments. CLOCK_MONOTONIC_RAW requires Linux 2.6.28 or later.
 
 CLOCK_MONOTONIC stops while the machine is suspended.
 
@@ -504,8 +544,23 @@
 ========================= =============== ===============
 
 (*) The accuracy of system clocks depends on the operating system and
-the hardware clock.  On Windows, the accuracy is in the range 1 ms -
-15 ms.
+the hardware clock.
+
+Examples of clock accuracy on x86_64:
+
+=========================  ================  ===============
+Name                       Operating system  Accuracy
+=========================  ================  ===============
+CLOCK_REALTIME             Linux 3.2         1 ns
+CLOCK_REALTIME             FreeBSD 8.2       11 ns
+CLOCK_REALTIME             SunOS 5.11        10 ms
+CLOCK_REALTIME             OpenBSD 5.0       10 ms
+GetSystemTimeAsFileTime    Windows Vista     15.6 ms
+=========================  ================  ===============
+
+For CLOCK_REALTIME, the accuracy of this table is the result of clock_getres().
+It looks like Linux does not implement clock_getres() and always return 1
+nanosecond.
 
 
 Windows: GetSystemTimeAsFileTime
@@ -573,6 +628,20 @@
   clock_getres(CLOCK_REALTIME) is 1 nanosecond on Linux.
 * GetProcessTimes(): call GetSystemTimeAdjustment().
 
+Examples of clock accuracy on x86_64:
+
+=========================  ================  ===============
+Name                       Operating system  Accuracy
+=========================  ================  ===============
+clock()                    Linux 3.2         1 ms
+clock()                    SunOS 5.11        1 ms
+clock()                    FreeBSD 8.2       7.8 ms
+clock()                    OpenBSD 5.0       10 ms
+=========================  ================  ===============
+
+The accuracy of clock() in this table is the result of 1 / CLOCKS_PER_SEC.
+
+
 Thread
 ^^^^^^
 

-- 
Repository URL: http://hg.python.org/peps


More information about the Python-checkins mailing list