From 5d291c259322d91633bf237ea60817ca5f8e3438 Mon Sep 17 00:00:00 2001
From: Glauber Costa <glommer@cloudius-systems.com>
Date: Thu, 22 May 2014 19:30:59 +0400
Subject: [PATCH] tests: memcpy benchmark

How log does our memcpy take? misc-memcpy will let you find out

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 build.mk            |  1 +
 tests/misc-memcpy.c | 88 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+)
 create mode 100644 tests/misc-memcpy.c

diff --git a/build.mk b/build.mk
index ed477f0f9..0208e4ffc 100644
--- a/build.mk
+++ b/build.mk
@@ -319,6 +319,7 @@ tests += tests/misc-tcp-close-without-reading.so
 tests += tests/tst-sigwait.so
 tests += tests/tst-sampler.so
 tests += tests/misc-malloc.so
+tests += tests/misc-memcpy.so
 endif
 
 tests/hello/Hello.class: javabase=tests/hello
diff --git a/tests/misc-memcpy.c b/tests/misc-memcpy.c
new file mode 100644
index 000000000..b2b7e86cf
--- /dev/null
+++ b/tests/misc-memcpy.c
@@ -0,0 +1,88 @@
+/*
+* Copyright (C) 2014 Cloudius Systems, Ltd.
+*
+* This work is open source software, licensed under the terms of the
+* BSD license as described in the LICENSE file in the top-level directory.
+*/
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <math.h>
+#include <unistd.h>
+#include <limits.h>
+
+
+#define MIN_SIZE 4
+#define MAX_SIZE (32 << 10)
+#define LOOPS 1000000
+#define RUNS 30
+
+static float vector[RUNS];
+
+static unsigned long gtime()
+{
+    struct timeval tv;
+    gettimeofday(&tv, NULL);
+    return tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
+}
+
+void test_memcpy(size_t size)
+{
+    void *src = malloc(size);
+    void *dest= malloc(size);
+    int r, i;
+
+    memset(src, 'c', size);
+
+    for (r = 0; r < RUNS; ++r) {
+        unsigned long t1 = gtime();
+        for (i= 0; i < LOOPS; ++i) {
+            memcpy(dest, src, size);
+        }
+        unsigned long t2 = gtime();
+
+        vector[r] = (float)(t2-t1) / LOOPS;
+    }
+
+    float min, max, mean, stdev;
+    min = INT_MAX;
+    max = 0;
+    mean = 0;
+    stdev = 0;
+
+    for (r = 0; r < RUNS; ++r) {
+        mean += vector[r];
+        if (vector[r] < min) {
+            min = vector[r];
+        }
+
+        if (vector[r] > max) {
+            max = vector[r];
+        }
+    }
+    mean = mean / RUNS;
+
+    for (r = 0; r < RUNS; ++r) {
+        float d = vector[r];
+        stdev += (d - mean) * (d - mean);
+    }
+    stdev = sqrtf(stdev / RUNS);
+
+    printf("%d,%f,%f,%f,%f\n", size, min, max, mean, stdev);
+
+    free(src);
+    free(dest);
+}
+
+
+int main()
+{
+    size_t i;
+    for (i = MIN_SIZE; i <= MAX_SIZE; i <<= 1) {
+        test_memcpy(i);
+    }
+
+    return 0;
+}
-- 
GitLab