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]

[RFC PATCH 11/11] benchtests: simple benchmark to measure nop effects


This is simple benchmark to measure function/nop effects.
OS noise is bigger even if it's pinned down to cpu and to make it rt
process.

$ sudo chrt -r 99 taskset 1 ./a.out

Signed-off-by: Isaku Yamahata <isaku.yamahata@gmail.com>
---
 benchtests/bench-nop.c | 128 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 128 insertions(+)
 create mode 100644 benchtests/bench-nop.c

diff --git a/benchtests/bench-nop.c b/benchtests/bench-nop.c
new file mode 100644
index 0000000000..bb98b3d371
--- /dev/null
+++ b/benchtests/bench-nop.c
@@ -0,0 +1,128 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+
+static inline unsigned long long rdtscp(void)
+{
+  unsigned int aux;
+  unsigned long long now = __builtin_ia32_rdtscp (&aux);
+  return now;
+}
+
+//#define LOOP 10000000
+#define LOOP 1000000
+
+void func0(void)
+{
+  for (int i = 0; i < LOOP; i++)
+    {
+      unsigned long ret = syscall(SYS_gettid);
+    }
+}
+
+void func1(void)
+{
+  for (int i = 0; i < LOOP; i++)
+    {
+      unsigned long ret;
+      __asm__ volatile(
+		       "syscall\n"
+		       : "=a"(ret)
+		       : "0"(SYS_gettid));
+    }
+}
+
+void func2(void)
+{
+  for (int i = 0; i < LOOP; i++)
+    {
+      unsigned long ret;
+      __asm__ volatile(
+		       "syscall\n"
+		       "nop;nop;nop\n"
+		       : "=a"(ret)
+		       : "0"(SYS_gettid));
+    }
+}
+
+void func3(void)
+{
+  for (int i = 0; i < LOOP; i++)
+    {
+      unsigned long ret;
+      __asm__ volatile(
+		       "syscall\n"
+		       "nop;nop;nop;nop;nop;nop;nop;nop;nop;nop\n"
+		       : "=a"(ret)
+		       : "0"(SYS_gettid));
+    }
+}
+
+void func4(void)
+{
+  for (int i = 0; i < LOOP; i++)
+    {
+      unsigned long ret;
+      __asm__ volatile(
+		       "jmp 1f\n"
+		       "nop\n"
+		       "1:\n"
+		       "syscall\n"
+		       : "=a"(ret)
+		       : "0"(SYS_gettid));
+    }
+}
+
+void func5(void)
+{
+  for (int i = 0; i < LOOP; i++)
+    {
+      unsigned long ret;
+      __asm__ volatile(
+		       "jmp 1f\n"
+		       "nop;nop;nop;nop;nop;nop;nop;nop\n"
+		       "1:\n"
+		       "syscall\n"
+		       : "=a"(ret)
+		       : "0"(SYS_gettid));
+    }
+}
+
+
+unsigned long long measure(void (*f)(void))
+{
+  unsigned long long start = rdtscp();
+  (*f)();
+  unsigned long long end = rdtscp();
+  return end - start;
+}
+
+int main(int argc, char** argv)
+{
+  printf("measuring syscall func\n");
+  unsigned long long time0 = measure(&func0);
+
+  printf("measuring syscall instruction\n");
+  unsigned long long time1 = measure(&func1);
+
+  printf("measuring syscall + nop * 3\n");
+  unsigned long long time2 = measure(&func2);
+
+  printf("measuring syscall + nop * 10\n");
+  unsigned long long time3 = measure(&func3);
+
+  printf("measuring jmp + nop + syscall\n");
+  unsigned long long time4 = measure(&func4);
+
+  printf("measuring jmp + nop * 8 + syscall\n");
+  unsigned long long time5 = measure(&func5);
+
+  printf("\tfunc\tinst\tnop*3\tnop*10\tjmp+nop\tjmp+nop*8\n");
+  printf("ratio\t%3.2f\t%3.2f\t%3.2f\t%3.2f\t%3.2f\t%3.2f\n",
+	 time0 * 100.0/time1,
+	 time1 * 100.0/time1,
+	 time2 * 100.0/time1,
+	 time3 * 100.0/time1,
+	 time4 * 100.0/time1,
+	 time5 * 100.0/time1);
+}
-- 
2.17.1


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