Preheat CPU in benchtests.
authorOndrej Bilka <neleai@seznam.cz>
Wed, 8 May 2013 06:21:05 +0000 (08:21 +0200)
committerOndrej Bilka <neleai@seznam.cz>
Wed, 8 May 2013 06:25:08 +0000 (08:25 +0200)
A benchmark could be skewed by CPU initialy working on minimal
frequency and speeding up later. We first run code in loop
to partialy fix this issue.

ChangeLog
benchtests/bench-skeleton.c

index fa12634..c681271 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-05-08  Ondřej Bílka  <neleai@seznam.cz>
+
+       * benchtests/bench-skeleton.c (main): Preheat CPU.
+
 2013-05-07  Aurelien Jarno <aurelien@aurel32.net>
 
        * misc/sys/param.h (DEV_BSIZE): Define only if not already defined.
index 7359184..a13ad02 100644 (file)
 #include <time.h>
 #include <inttypes.h>
 
+volatile unsigned int dontoptimize = 0;
+void startup ()
+{
+  /* This loop should cause CPU to switch to maximal freqency.
+     This makes subsequent measurement more accurate.  We need a side effect
+     to prevent the loop being deleted by compiler.
+     This should be enough to cause CPU to speed up and it is simpler than
+     running loop for constant time. This is used when user does not have root
+     access to set a constant freqency.  */
+
+  int k;
+  for (k = 0; k < 10000000; k++)
+    dontoptimize += 23 * dontoptimize + 2;
+}
+
 #define TIMESPEC_AFTER(a, b) \
   (((a).tv_sec == (b).tv_sec) ?                                                      \
      ((a).tv_nsec > (b).tv_nsec) :                                           \
@@ -32,6 +47,8 @@ main (int argc, char **argv)
   unsigned long i, k;
   struct timespec start, end, runtime;
 
+  startup();
+
   memset (&runtime, 0, sizeof (runtime));
   memset (&start, 0, sizeof (start));
   memset (&end, 0, sizeof (end));