From 449b7a8ec73a8c915a17f58363add40c20899a7f Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fischer@muhq.space>
Date: Mon, 2 Aug 2021 18:15:08 +0200
Subject: [PATCH] add dataref target

---
 Makefile              | 18 +++++++++++-------
 bench.c               |  3 +--
 stats.c               |  2 +-
 tools/yaml2dataref.sh | 18 ++++++++++++++++++
 4 files changed, 31 insertions(+), 10 deletions(-)
 create mode 100755 tools/yaml2dataref.sh

diff --git a/Makefile b/Makefile
index 5cd7361..6942f4a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,6 @@
 BENCH_MAIN := bench.c
 SYSCALLS := blocking io-uring io-uring-sqpoll io-uring-no-syscall epoll paio-sig paio-thrd
 
-STATS ?=
-
 OBJ := $(addprefix bench-,$(SYSCALLS))
 
 LDFLAGS := -luring -pthread -lrt -lm
@@ -10,20 +8,26 @@ LDFLAGS := -luring -pthread -lrt -lm
 CFLAGS := -Werror -Wall -g -O3
 # CFLAGS := -Werror -Wall -g -O0
 
-.PHONY: all clean eval eval-stats docker-eval docker-eval-stats check
+.PHONY: all clean eval stats dataref docker-eval docker-stats docker-dataref check
 
 eval: all
-	@for syscall in $(SYSCALLS); do ./bench-$$syscall $(STATS); done
+	@for syscall in $(SYSCALLS); do echo -n "$$syscall "; ./bench-$$syscall; done
+
+stats:
+	@for syscall in $(SYSCALLS); do echo "$$syscall:"; ./bench-$$syscall --stats; done
 
-eval-stats:
-	@$(MAKE) STATS=--stats eval
+dataref:
+	@$(MAKE) eval-stats | tools/yaml2dataref.sh
 
 docker-eval:
 	./docker.sh make eval
 
-docker-eval-stats:
+docker-stats:
 	./docker.sh make eval-stats
 
+docker-dataref:
+	./docker.sh make dataref
+
 all: $(OBJ)
 
 define generateTargets
diff --git a/bench.c b/bench.c
index a1d9ef8..353ddd6 100644
--- a/bench.c
+++ b/bench.c
@@ -54,13 +54,12 @@ int main(int argc, char *argv[]) {
 	}
 
 	if (print_stats) {
-		printf("%s:\n", argv[0]);
 		print_desc_stats("nanos", "  ", nanos, exp_iterations);
 		print_desc_stats("cycles", "  ", cycles, exp_iterations);
 	} else {
 		uint64_t avg_nanos = calc_mean(nanos, exp_iterations);
 		uint64_t avg_cycles = calc_mean(cycles, exp_iterations);
-		printf("%s avg-nanos: %lu, avg-cycles: %lu\n", argv[0], avg_nanos, avg_cycles);
+		printf("avg-nanos: %lu, avg-cycles: %lu\n", avg_nanos, avg_cycles);
 	}
 
 	free(nanos);
diff --git a/stats.c b/stats.c
index b7a621d..70a581f 100644
--- a/stats.c
+++ b/stats.c
@@ -62,7 +62,7 @@ void print_desc_stats(const char* name, const char* indentation, const uint64_t*
 	const uint64_t var = calc_var(data, size, mean);
 	const uint64_t std = (uint64_t)sqrt((double)var);
 
-	printf("%s%s\n", indentation, name);
+	printf("%s%s:\n", indentation, name);
 	printf("%s%smin: %lu\n", indentation, indentation, min);
 	printf("%s%smax: %lu\n", indentation, indentation, max);
 	printf("%s%smedian: %lu\n", indentation, indentation, median);
diff --git a/tools/yaml2dataref.sh b/tools/yaml2dataref.sh
new file mode 100755
index 0000000..44de499
--- /dev/null
+++ b/tools/yaml2dataref.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# taken from here:
+# https://stackoverflow.com/questions/5014632/how-can-i-parse-a-yaml-file-from-a-linux-shell-script
+s='[[:space:]]*'
+w='[a-zA-Z0-9_]*'
+fs=$(echo @|tr @ '\034')
+sed -ne "s|^\($s\):|\1|" \
+    -e "s|^\($s\)\($w\)$s:${s}[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
+    -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
+awk -F"$fs" '{
+  indent = length($1)/2;
+  vname[indent] = $2;
+  for (i in vname) {if (i > indent) {delete vname[i]}}
+  if (length($3) > 0) {
+     vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("/")}
+     printf("\\setdref{%s%s}{%s}\n", vn, $2, $3);
+  }
+}'
-- 
GitLab