[Python-checkins] peps: PEP 418: Patch bench_time.c to support systems without clock_gettime()

victor.stinner python-checkins at python.org
Thu Apr 19 23:26:53 CEST 2012


http://hg.python.org/peps/rev/0705221c05c3
changeset:   4279:0705221c05c3
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Thu Apr 19 23:26:51 2012 +0200
summary:
  PEP 418: Patch bench_time.c to support systems without clock_gettime()

files:
  pep-0418/bench_time.c |  47 ++++++++++++++++++++++++------
  1 files changed, 37 insertions(+), 10 deletions(-)


diff --git a/pep-0418/bench_time.c b/pep-0418/bench_time.c
--- a/pep-0418/bench_time.c
+++ b/pep-0418/bench_time.c
@@ -8,12 +8,20 @@
 #include <stdio.h>
 #include <sys/time.h>
 
+#ifdef CLOCK_REALTIME
+#  define HAVE_CLOCK_GETTIME
+#else
+typedef int clockid_t;
+#endif
+
 #define NRUN 5
-#define NLOOP 1000000
+#define NLOOP 100000
 #define UNROLL(expr) \
     expr; expr; expr; expr; expr; expr; expr; expr; expr; expr
 #define NUNROLL 10
 
+#ifdef HAVE_CLOCK_GETTIME
+
 typedef struct {
     const char *name;
     clockid_t identifier;
@@ -80,6 +88,8 @@
     }
 }
 
+#endif   /* HAVE_CLOCK_GETTIME */
+
 void bench_time(clockid_t clkid)
 {
     unsigned long loop;
@@ -117,25 +127,40 @@
 {
     unsigned int run;
     double dt, best;
-    struct timespec before, after, tmpspec;
+#ifdef HAVE_CLOCK_GETTIME
+    struct timespec before, after;
+#else
+    struct timeval before, after;
+#endif
     struct timeval tmpval;
 
-    best = 0;
+    best = -1.0;
     for (run=0; run<NRUN; run++) {
+#ifdef HAVE_CLOCK_GETTIME
         clock_gettime(CLOCK_MONOTONIC, &before);
         (*func) (clkid);
         clock_gettime(CLOCK_MONOTONIC, &after);
 
-        dt = after.tv_sec - before.tv_sec;
+        dt = (after.tv_sec - before.tv_sec) * 1e9;
         if (after.tv_nsec >= before.tv_nsec)
-            dt += (after.tv_nsec - before.tv_nsec) * 1e-9;
+            dt += (after.tv_nsec - before.tv_nsec);
         else
-        {
-            dt -= (before.tv_nsec - after.tv_nsec) * 1e-9;
-        }
-        dt *= (double)1e9 / NLOOP / NUNROLL;
+            dt -= (before.tv_nsec - after.tv_nsec);
+#else
+        gettimeofday(&before, NULL);
+        (*func) (clkid);
+        gettimeofday(&after, NULL);
 
-        if (best != 0.0) {
+        dt = (after.tv_sec - before.tv_sec) * 1e9;
+        if (after.tv_usec >= before.tv_usec)
+            dt += (after.tv_usec - before.tv_usec) * 1e3;
+        else
+            dt -= (before.tv_usec - after.tv_usec) * 1e3;
+#endif
+        dt /= NLOOP;
+        dt /= NUNROLL;
+
+        if (best != -1.0) {
             if (dt < best)
                 best = dt;
         }
@@ -147,12 +172,14 @@
 
 int main()
 {
+#ifdef HAVE_CLOCK_GETTIME
     clockid_t clkid;
     int i;
 
     for (i=0; i<NCLOCKS; i++) {
         benchmark(clocks[i].name, bench_clock_gettime, clocks[i].identifier);
     }
+#endif
     benchmark("clock()", bench_clock, 0);
     benchmark("gettimeofday()", bench_gettimeofday, 0);
     benchmark("time()", bench_time, 0);

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


More information about the Python-checkins mailing list