This falls back to clock(), just like in e.g. nettle-benchmark.

This makes building succeed on e.g. OS X.
---
 examples/ecc-benchmark.c     |   69 +++++++++++++++++++++++++++++++++++++-----
 examples/hogweed-benchmark.c |   69 +++++++++++++++++++++++++++++++++++++-----
 2 files changed, 122 insertions(+), 16 deletions(-)

diff --git a/examples/ecc-benchmark.c b/examples/ecc-benchmark.c
index 596b2ff..e2ee3d5 100644
--- a/examples/ecc-benchmark.c
+++ b/examples/ecc-benchmark.c
@@ -70,22 +70,75 @@ xalloc_limbs (mp_size_t size)
   return xalloc (size * sizeof(mp_limb_t));
 }
 
+#if HAVE_CLOCK_GETTIME && defined CLOCK_PROCESS_CPUTIME_ID
+#define TRY_CLOCK_GETTIME 1
+struct timespec cgt_start;
+
+static int
+cgt_works_p(void)
+{
+  struct timespec now;
+  return clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &now) == 0;
+}
+
 inline static void
-time_start(struct timespec *start)
+cgt_time_start(void)
 {
-  if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, start) < 0)
+  if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cgt_start) < 0)
     die("clock_gettime failed: %s\n", strerror(errno));
 }
 
 static inline double
-time_end(struct timespec *start)
+cgt_time_end(void)
 {
   struct timespec end;
   if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end) < 0)
     die("clock_gettime failed: %s\n", strerror(errno));
 
-  return end.tv_sec - start->tv_sec
-    + 1e-9 * (end.tv_nsec - start->tv_nsec);
+  return end.tv_sec - cgt_start.tv_sec
+    + 1e-9 * (end.tv_nsec - cgt_start.tv_nsec);
+}
+
+static void (*time_start)(void);
+static double (*time_end)(void);
+static void clock_time_start(void);
+static double clock_time_end(void);
+
+static void time_init(void)
+{
+  /* Choose timing function */
+  if (cgt_works_p())
+    {
+      time_start = cgt_time_start;
+      time_end = cgt_time_end;
+    }
+  else
+    {
+      fprintf(stderr, "clock_gettime not working, falling back to clock\n");
+      time_start = clock_time_start;
+      time_end = clock_time_end;
+    }
+}
+
+#else /* !HAVE_CLOCK_GETTIME */
+#define TRY_CLOCK_GETTIME 0
+#define time_start clock_time_start
+#define time_end clock_time_end
+#define time_init()
+#endif /* !HAVE_CLOCK_GETTIME */
+
+static clock_t clock_start;
+
+static void
+clock_time_start(void)
+{
+  clock_start = clock();
+}
+
+static double
+clock_time_end(void)
+{
+  return (double) (clock() - (clock_start)) / CLOCKS_PER_SEC;
 }
 
 /* Returns second per function call */
@@ -100,12 +153,11 @@ time_function(void (*f)(void *arg), void *arg)
   for (ncalls = 10 ;;)
     {
       unsigned i;
-      struct timespec t;
 
-      time_start(&t);
+      time_start();
       for (i = 0; i < ncalls; i++)
        f(arg);
-      elapsed = time_end(&t);
+      elapsed = time_end();
       if (elapsed > BENCH_INTERVAL)
        break;
       else if (elapsed < BENCH_INTERVAL / 10)
@@ -293,6 +345,7 @@ main (int argc UNUSED, char **argv UNUSED)
 {
   unsigned i;
 
+  time_init();
   printf ("%4s %6s %6s %6s %6s %6s %6s %6s %6s %6s %6s (us)\n",
          "size", "modp", "redc", "modq", "modinv", "mi_gcd",
          "dup_jj", "ad_jja", "ad_jjj",
diff --git a/examples/hogweed-benchmark.c b/examples/hogweed-benchmark.c
index 6a7da96..803f056 100644
--- a/examples/hogweed-benchmark.c
+++ b/examples/hogweed-benchmark.c
@@ -90,22 +90,75 @@ hash_string (const struct nettle_hash *hash,
   return digest;
 }
 
+#if HAVE_CLOCK_GETTIME && defined CLOCK_PROCESS_CPUTIME_ID
+#define TRY_CLOCK_GETTIME 1
+struct timespec cgt_start;
+
+static int
+cgt_works_p(void)
+{
+  struct timespec now;
+  return clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &now) == 0;
+}
+
 inline static void
-time_start(struct timespec *start)
+cgt_time_start(void)
 {
-  if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, start) < 0)
+  if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cgt_start) < 0)
     die("clock_gettime failed: %s\n", strerror(errno));
 }
 
 static inline double
-time_end(struct timespec *start)
+cgt_time_end(void)
 {
   struct timespec end;
   if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end) < 0)
     die("clock_gettime failed: %s\n", strerror(errno));
 
-  return end.tv_sec - start->tv_sec
-    + 1e-9 * (end.tv_nsec - start->tv_nsec);
+  return end.tv_sec - cgt_start.tv_sec
+    + 1e-9 * (end.tv_nsec - cgt_start.tv_nsec);
+}
+
+static void (*time_start)(void);
+static double (*time_end)(void);
+static void clock_time_start(void);
+static double clock_time_end(void);
+
+static void time_init(void)
+{
+  /* Choose timing function */
+  if (cgt_works_p())
+    {
+      time_start = cgt_time_start;
+      time_end = cgt_time_end;
+    }
+  else
+    {
+      fprintf(stderr, "clock_gettime not working, falling back to clock\n");
+      time_start = clock_time_start;
+      time_end = clock_time_end;
+    }
+}
+
+#else /* !HAVE_CLOCK_GETTIME */
+#define TRY_CLOCK_GETTIME 0
+#define time_start clock_time_start
+#define time_end clock_time_end
+#define time_init()
+#endif /* !HAVE_CLOCK_GETTIME */
+
+static clock_t clock_start;
+
+static void
+clock_time_start(void)
+{
+  clock_start = clock();
+}
+
+static double
+clock_time_end(void)
+{
+  return (double) (clock() - (clock_start)) / CLOCKS_PER_SEC;
 }
 
 struct alg {
@@ -129,12 +182,11 @@ time_function(void (*f)(void *arg), void *arg)
   for (ncalls = 10 ;;)
     {
       unsigned i;
-      struct timespec t;
 
-      time_start(&t);
+      time_start();
       for (i = 0; i < ncalls; i++)
        f(arg);
-      elapsed = time_end(&t);
+      elapsed = time_end();
       if (elapsed > BENCH_INTERVAL)
        break;
       else if (elapsed < BENCH_INTERVAL / 10)
@@ -625,6 +677,7 @@ main (int argc, char **argv)
   if (argc > 1)
     filter = argv[1];
 
+  time_init();
   printf ("%15s %4s %9s %9s\n",
          "name", "size", "sign/ms", "verify/ms");
 
-- 
1.7.9.4

_______________________________________________
nettle-bugs mailing list
[email protected]
http://lists.lysator.liu.se/mailman/listinfo/nettle-bugs

Reply via email to