about summary refs log tree commit diff stats
path: root/archive/2024/winter/bsc_dichler/experiments/contiguous/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'archive/2024/winter/bsc_dichler/experiments/contiguous/main.c')
-rw-r--r--archive/2024/winter/bsc_dichler/experiments/contiguous/main.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/archive/2024/winter/bsc_dichler/experiments/contiguous/main.c b/archive/2024/winter/bsc_dichler/experiments/contiguous/main.c
new file mode 100644
index 000000000..87de6c418
--- /dev/null
+++ b/archive/2024/winter/bsc_dichler/experiments/contiguous/main.c
@@ -0,0 +1,49 @@
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <time.h>
+#include "../allocator/allocator.h"
+
+struct node {
+    uint64_t val;
+    uint8_t arr[16 - sizeof(uint64_t)];
+};
+static_assert(sizeof(struct node) == 16, "cannot run experiment, size of node is not 16");
+
+extern void benchmark(uint32_t *ptr, size_t len);
+
+#define WARUM_UP 5
+
+int main(int argc, char *args[]) {
+    if (argc != 4) {
+        printf("Usage: %s <iterations> <len> <runs>\n", args[0]);
+        exit(EXIT_FAILURE);
+    }
+
+    size_t iterations = atoll(args[1]);
+    size_t len = atoll(args[2]);
+    size_t runs = atoll(args[3]);
+
+    // we only test with lengths of power of 2 - this is done to simplify the benchmark
+    assert((len & (len - 1)) == 0);
+
+    for (size_t i = 0; i < iterations + WARUM_UP; ++i) {
+        size_t num_bytes = len * 64;
+        uint8_t *region = alloc(num_bytes);
+
+        struct timespec s, e;
+        clock_gettime(CLOCK_MONOTONIC_RAW, &s);
+        benchmark((uint32_t *)region, num_bytes / 4); 
+        clock_gettime(CLOCK_MONOTONIC_RAW, &e);
+        
+        if (i > WARUM_UP) {
+          uint64_t duration = 1e9 * (e.tv_sec - s.tv_sec) + (e.tv_nsec - s.tv_nsec);
+          printf("%ld;%ld;%ld\n", len, duration, runs);
+        }
+
+        alloc_free(region, num_bytes);
+    }
+
+}