This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Benchmark for sem_timedwait


I used a same test for sem_timedwait. Results look inconclusive for
uncontended case and in contended case assembly is bit faster.

There is again question if assembly implementation is worth it, or if it
suffices to write only hot path in assembly and refactor a cold
implementation to have a futex path in separate function that would be
called from assembly.

Comments on this?

uncontended

sem_timedwait spend time: 0.000001806
sem_timedwait spend time: 0.000000094
sem_timedwait spend time: 0.000000036
sem_timedwait spend time: 0.000000037
sem_timedwait spend time: 0.000000039
sem_timedwait spend time: 0.000000032
sem_timedwait spend time: 0.000000042
sem_timedwait spend time: 0.000000036
sem_timedwait spend time: 0.000000035
sem_timedwait spend time: 0.000000031

contended

sem_timedwait spend time: 0.000064413
sem_timedwait spend time: 0.000063634
sem_timedwait spend time: 0.000063174
sem_timedwait spend time: 0.000063345
sem_timedwait spend time: 0.000063228
sem_timedwait spend time: 0.000063356
sem_timedwait spend time: 0.000062879
sem_timedwait spend time: 0.000063077
sem_timedwait spend time: 0.000062730
sem_timedwait spend time: 0.000062778


uncontended

sem_timedwait spend time: 0.000001481
sem_timedwait spend time: 0.000000049
sem_timedwait spend time: 0.000000038
sem_timedwait spend time: 0.000000039
sem_timedwait spend time: 0.000000035
sem_timedwait spend time: 0.000000039
sem_timedwait spend time: 0.000000041
sem_timedwait spend time: 0.000000035
sem_timedwait spend time: 0.000000039
sem_timedwait spend time: 0.000000041
contended

sem_timedwait spend time: 0.000065898
sem_timedwait spend time: 0.000064411
sem_timedwait spend time: 0.000064210
sem_timedwait spend time: 0.000064394
sem_timedwait spend time: 0.000064010
sem_timedwait spend time: 0.000063595
sem_timedwait spend time: 0.000063757
sem_timedwait spend time: 0.000063138
sem_timedwait spend time: 0.000064368
sem_timedwait spend time: 0.000063642

---
 benchtests/Makefile              |    3 +-
 benchtests/bench-sem_timedwait.c |   63 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletion(-)
 create mode 100644 benchtests/bench-sem_timedwait.c

diff --git a/benchtests/Makefile b/benchtests/Makefile
index 2736f58..69a3d6b 100644
--- a/benchtests/Makefile
+++ b/benchtests/Makefile
@@ -33,11 +33,12 @@ string-bench-all := $(string-bench)
 
 stdlib-bench := strtod
 
-nptl-bench := pthread_cond_timedwait
+nptl-bench := pthread_cond_timedwait sem_timedwait
 
 
 benchset := $(nptl-bench) $(string-bench-all) $(stdlib-bench)
 
+LDLIBS-bench-sem_timedwait = -lpthread
 LDLIBS-bench-pthread_cond_timedwait = -lpthread
 LDLIBS-bench-acos = -lm
 LDLIBS-bench-acosh = -lm
diff --git a/benchtests/bench-sem_timedwait.c b/benchtests/bench-sem_timedwait.c
new file mode 100644
index 0000000..7af17b8
--- /dev/null
+++ b/benchtests/bench-sem_timedwait.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <pthread.h>
+#include <semaphore.h>
+
+int
+main ()
+{
+  struct timespec t1, t2, t3;
+  sem_t sem;
+  sem_init (&sem, 0, 0);
+
+  puts ("\nuncontended\n\n");
+  for (int i = 0; i < 10; i++)
+    {
+      clock_gettime (CLOCK_REALTIME, &t1);
+      t3 = t1;
+      t3.tv_nsec += 10000;
+      sem_post (&sem);
+      sem_timedwait (&sem, &t3);
+
+      clock_gettime (CLOCK_REALTIME, &t2);
+
+      if (t2.tv_nsec >= t1.tv_nsec)
+	{
+	  t2.tv_sec -= t1.tv_sec;
+	  t2.tv_nsec -= t1.tv_nsec;
+	}
+      else
+	{
+	  t2.tv_sec = t2.tv_sec - t1.tv_sec - 1;
+	  t2.tv_nsec = t2.tv_nsec + (1000000000 - t1.tv_nsec);
+	}
+
+      printf ("sem_timedwait spend time: %d.%.9d\n", t2.tv_sec, t2.tv_nsec);
+    }
+
+  puts ("\ncontended\n\n");
+  for (int i = 0; i < 10; i++)
+    {
+      clock_gettime (CLOCK_REALTIME, &t1);
+      t3 = t1;
+      t3.tv_nsec += 10000;
+      sem_timedwait (&sem, &t3);
+
+      clock_gettime (CLOCK_REALTIME, &t2);
+
+      if (t2.tv_nsec >= t1.tv_nsec)
+	{
+	  t2.tv_sec -= t1.tv_sec;
+	  t2.tv_nsec -= t1.tv_nsec;
+	}
+      else
+	{
+	  t2.tv_sec = t2.tv_sec - t1.tv_sec - 1;
+	  t2.tv_nsec = t2.tv_nsec + (1000000000 - t1.tv_nsec);
+	}
+
+      printf ("sem_timedwait spend time: %d.%.9d\n", t2.tv_sec, t2.tv_nsec);
+    }
+
+
+  return 0;
+}
-- 
1.7.10.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]