Add function call overhead tests for (1) direct calls, (2) indirect calls,
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 20 Mar 2004 01:51:01 +0000 (01:51 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 20 Mar 2004 01:51:01 +0000 (01:51 +0000)
and (3) call(func) -> func() indirect calls where (a) function 1 is passed
to the call, (b) function 1 and function 2 alternate being passed to the
call, and (c) function 2 is passed to the call (as a double check).  i.e.
call3 is explicitly testing branch prediction misses.

test/sysperf/Makefile
test/sysperf/blib.c
test/sysperf/call1.c [new file with mode: 0644]
test/sysperf/call2.c [new file with mode: 0644]
test/sysperf/call3.c [new file with mode: 0644]

index 0cd1d6e..dbbf140 100644 (file)
@@ -1,9 +1,10 @@
 #
-# $DragonFly: src/test/sysperf/Makefile,v 1.4 2003/11/21 06:58:28 dillon Exp $
+# $DragonFly: src/test/sysperf/Makefile,v 1.5 2004/03/20 01:51:01 dillon Exp $
 #
 
 TARGETS=/tmp/sc1 /tmp/sc2 /tmp/sc3 /tmp/sc4 \
        /tmp/loop1 /tmp/loop2 /tmp/loop3 \
+       /tmp/call1 /tmp/call2 /tmp/call3 \
        /tmp/mt2 \
        /tmp/fork1 /tmp/pipe1 \
        /tmp/sw1 /tmp/sw2 /tmp/sw3 \
@@ -41,6 +42,15 @@ all: $(TARGETS)
 /tmp/loop3: loop3.c blib.c
        $(CC) $(CFLAGS) loop3.c blib.c -o /tmp/loop3
 
+/tmp/call1: call1.c blib.c
+       $(CC) $(CFLAGS) call1.c blib.c -o /tmp/call1
+
+/tmp/call2: call2.c blib.c
+       $(CC) $(CFLAGS) call2.c blib.c -o /tmp/call2
+
+/tmp/call3: call3.c blib.c
+       $(CC) $(CFLAGS) call3.c blib.c -o /tmp/call3
+
 /tmp/mbw1: mbwtest.c
        $(CC) -O mbwtest.c -o /tmp/mbw1
 
index cc1bff5..b2925c0 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Simple benchmarking library
  *
- * $DragonFly: src/test/sysperf/blib.c,v 1.2 2004/02/09 18:08:57 dillon Exp $
+ * $DragonFly: src/test/sysperf/blib.c,v 1.3 2004/03/20 01:51:01 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -53,7 +53,7 @@ stop_timing2(long long count, long long us, const char *ctl, ...)
     vprintf(ctl, va);
     va_end(va);
 
-    printf("%6.3fs %lld loops = %6.3fnS/loop\n",
+    printf(" %6.3fs %lld loops = %6.3fnS/loop\n",
        (double)us / 1000000.0,
        count,
        (double)us * 1000.0 / (double)count
diff --git a/test/sysperf/call1.c b/test/sysperf/call1.c
new file mode 100644 (file)
index 0000000..6c1c2a1
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * call1.c
+ *
+ * Test a standard function call to a function which does nothing much.
+ *
+ * $DragonFly: src/test/sysperf/call1.c,v 1.1 2004/03/20 01:51:01 dillon Exp $
+ */
+
+#include "blib.h"
+
+#define LOOP 1000000000
+
+static void nop() { }
+
+int
+main(int ac, char **av)
+{
+    int i;
+
+    printf("call nop() function in loop\n");
+    start_timing();
+    for (i = 0; i < LOOP; ++i)
+       nop();
+    stop_timing(LOOP, "loop1/user");
+    return(0);
+}
+
diff --git a/test/sysperf/call2.c b/test/sysperf/call2.c
new file mode 100644 (file)
index 0000000..c86a0bd
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * call1.c
+ *
+ * Test a standard function call to a function which does nothing much.
+ *
+ * $DragonFly: src/test/sysperf/call2.c,v 1.1 2004/03/20 01:51:01 dillon Exp $
+ */
+
+#include "blib.h"
+
+#define LOOP 1000000000
+
+static void nop(void) { }
+
+static void (*nop_ptr)(void) = nop;
+
+int
+main(int ac, char **av)
+{
+    int i;
+
+    printf("call nop() function through function pointer in loop\n");
+    start_timing();
+    for (i = 0; i < LOOP; ++i)
+       nop_ptr();
+    stop_timing(LOOP, "loop1/user");
+    return(0);
+}
+
diff --git a/test/sysperf/call3.c b/test/sysperf/call3.c
new file mode 100644 (file)
index 0000000..c77c699
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * call1.c
+ *
+ * Test a standard function call to a function which does nothing much.
+ *
+ * $DragonFly: src/test/sysperf/call3.c,v 1.1 2004/03/20 01:51:01 dillon Exp $
+ */
+
+#include "blib.h"
+
+#define LOOP 500000000
+
+static void nop1(void) { }
+static void nop2(void) { }
+static void nop(void (*func)(void)) { func(); }
+
+int
+main(int ac, char **av)
+{
+    int i;
+
+    printf("call nop() function through function pointer in loop\n");
+    start_timing();
+    for (i = 0; i < LOOP; ++i) {
+       nop(nop1);
+       nop(nop1);
+    }
+    stop_timing(LOOP * 2, "call3/nop1-1");
+    start_timing();
+    for (i = 0; i < LOOP; ++i) {
+       nop(nop1);
+       nop(nop2);
+    }
+    stop_timing(LOOP * 2, "call3/nop1-2");
+    start_timing();
+    for (i = 0; i < LOOP; ++i) {
+       nop(nop2);
+       nop(nop2);
+    }
+    stop_timing(LOOP * 2, "call3/nop2-2");
+    return(0);
+}
+