[glib] mutex testcase: add a performance test



commit 406f7d2b39dab16cd38ccdbd4c978490eb1a2ba1
Author: Ryan Lortie <desrt desrt ca>
Date:   Fri Sep 30 23:05:27 2011 -0400

    mutex testcase: add a performance test
    
    Add a reasonable performance test for uncontended and contended cases.

 glib/tests/mutex.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 68 insertions(+), 0 deletions(-)
---
diff --git a/glib/tests/mutex.c b/glib/tests/mutex.c
index 6d1828a..66ec5fb 100644
--- a/glib/tests/mutex.c
+++ b/glib/tests/mutex.c
@@ -22,6 +22,8 @@
 
 #include <glib.h>
 
+#include <stdio.h>
+
 static void
 test_mutex1 (void)
 {
@@ -152,6 +154,58 @@ test_mutex5 (void)
     g_assert (owners[i] == NULL);
 }
 
+#define COUNT_TO 100000000
+
+static gboolean
+do_addition (gint *value)
+{
+  static GMutex lock = G_MUTEX_INIT;
+  gboolean more;
+
+  /* test performance of "good" cases (ie: short critical sections) */
+  g_mutex_lock (&lock);
+  if ((more = *value != COUNT_TO))
+    if (*value != -1)
+      (*value)++;
+  g_mutex_unlock (&lock);
+
+  return more;
+}
+
+static gpointer
+addition_thread (gpointer value)
+{
+  while (do_addition (value));
+
+  return NULL;
+}
+
+static void
+test_mutex_perf (gconstpointer data)
+{
+  gint n_threads = GPOINTER_TO_INT (data);
+  GThread *threads[THREADS];
+  gint64 start_time;
+  gdouble rate;
+  gint x = -1;
+  gint i;
+
+  for (i = 0; i < n_threads - 1; i++)
+    threads[i] = g_thread_create (addition_thread, &x, TRUE, NULL);
+
+  /* avoid measuring thread setup/teardown time */
+  start_time = g_get_monotonic_time ();
+  g_atomic_int_set (&x, 0);
+  addition_thread (&x);
+  g_assert_cmpint (g_atomic_int_get (&x), ==, COUNT_TO);
+  rate = g_get_monotonic_time () - start_time;
+  rate = x / rate;
+
+  for (i = 0; i < n_threads - 1; i++)
+    g_thread_join (threads[i]);
+
+  g_test_maximized_result (rate, "%f mips", rate);
+}
 
 int
 main (int argc, char *argv[])
@@ -164,5 +218,19 @@ main (int argc, char *argv[])
   g_test_add_func ("/thread/mutex4", test_mutex4);
   g_test_add_func ("/thread/mutex5", test_mutex5);
 
+  if (g_test_perf ())
+    {
+      gint i;
+
+      g_test_add_data_func ("/thread/mutex/perf/uncontended", NULL, test_mutex_perf);
+
+      for (i = 1; i <= 10; i++)
+        {
+          gchar name[80];
+          sprintf (name, "/thread/mutex/perf/contended/%d", i);
+          g_test_add_data_func (name, GINT_TO_POINTER (i), test_mutex_perf);
+        }
+    }
+
   return g_test_run ();
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]