This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Benchmark for sem_timedwait
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: Roland McGrath <roland at hack dot frob dot com>
- Cc: libc-alpha at sourceware dot org
- Date: Tue, 11 Feb 2014 21:47:51 +0100
- Subject: Benchmark for sem_timedwait
- Authentication-results: sourceware.org; auth=none
- References: <20140211172324 dot GA31923 at domone dot podge> <20140211172720 dot 52ABB7445F at topped-with-meat dot com> <20140211184530 dot GB32451 at domone dot podge>
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