diff --git a/Makefile b/Makefile index 5e6ec9f0280747eb9ae552526c39a7fd71a5924a..5cd73619bccaae421f64fbbc38629a75362b4257 100644 --- a/Makefile +++ b/Makefile @@ -10,14 +10,20 @@ LDFLAGS := -luring -pthread -lrt -lm CFLAGS := -Werror -Wall -g -O3 # CFLAGS := -Werror -Wall -g -O0 -.PHONY: all clean eval docker-eval check +.PHONY: all clean eval eval-stats docker-eval docker-eval-stats check eval: all - @for syscall in $(SYSCALLS); do echo -n "$$syscall " ; ./bench-$$syscall $(STATS); done + @for syscall in $(SYSCALLS); do ./bench-$$syscall $(STATS); done + +eval-stats: + @$(MAKE) STATS=--stats eval docker-eval: ./docker.sh make eval +docker-eval-stats: + ./docker.sh make eval-stats + all: $(OBJ) define generateTargets diff --git a/bench.c b/bench.c index abe96b5d16d27cfc4b31df82d153c1561549fb20..a1d9ef8c102a0d37240fe554c49c63c91400df8a 100644 --- a/bench.c +++ b/bench.c @@ -49,17 +49,18 @@ int main(int argc, char *argv[]) { for (int64_t i = 1; i <= exp_iterations; ++i) { do_write(fd, &write_buf, sizeof(write_buf)); - nanos[i] = clock_diff_nanos(); - cycles[i] = clock_diff_cycles(); + nanos[i - 1] = clock_diff_nanos(); + cycles[i - 1] = clock_diff_cycles(); } if (print_stats) { - print_desc_stats("nanos", nanos, exp_iterations); - print_desc_stats("cycles", cycles, exp_iterations); + 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("avg-nanos: %lu, avg-cycles: %lu\n", avg_nanos, avg_cycles); + printf("%s avg-nanos: %lu, avg-cycles: %lu\n", argv[0], avg_nanos, avg_cycles); } free(nanos); diff --git a/stats.c b/stats.c index 5ceaa9ca2b797526390400084d46e232e12fcbc0..b7a621d0cb51206b5d1ab791221853dae75d3163 100644 --- a/stats.c +++ b/stats.c @@ -5,7 +5,7 @@ #include <stdint.h> #include <stdio.h> -uint64_t calc_median(uint64_t* data, size_t size) { +uint64_t calc_median(const uint64_t* data, size_t size) { // sample size is odd -> there is a middle value if (size % 2 == 1) return data[size / 2]; @@ -15,7 +15,12 @@ uint64_t calc_median(uint64_t* data, size_t size) { return before_median + ((after_median - before_median) / 2); } -uint64_t calc_mean(uint64_t* data, size_t size) { +static void check_saple_size(size_t size) { + if (size == 0) errx(EXIT_FAILURE, "data size must not be zero"); +} + +uint64_t calc_mean(const uint64_t* data, size_t size) { + check_saple_size(size); uint64_t sum = 0; for (size_t i = 0; i < size; ++i) { if (__builtin_add_overflow(sum, data[i], &sum)) errx(EXIT_FAILURE, "sum overflowed at %ld", i); @@ -23,10 +28,11 @@ uint64_t calc_mean(uint64_t* data, size_t size) { return sum / size; } -uint64_t calc_var(uint64_t* data, size_t size, uint64_t mean) { +uint64_t calc_var(const uint64_t* data, size_t size, uint64_t mean) { + check_saple_size(size); uint64_t sum = 0; for (size_t i = 0; i < size; ++i) { - const int64_t delta = mean - data[i]; + const uint64_t delta = mean - data[i]; const uint64_t delta_pow = (uint64_t)pow((double)delta, 2); if (__builtin_add_overflow(sum, delta_pow, &sum)) errx(EXIT_FAILURE, "sum overflowed at %ld", i); @@ -44,9 +50,10 @@ static int compare_uint64_t(const void* v1, const void* v2) { return 0; } -void print_desc_stats(const char* name, uint64_t* data, size_t size) { +void print_desc_stats(const char* name, const char* indentation, const uint64_t* data, + size_t size) { // sort our data - qsort(data, size, sizeof(uint64_t), compare_uint64_t); + qsort((void*)data, size, sizeof(uint64_t), compare_uint64_t); const uint64_t min = data[0]; const uint64_t max = data[size - 1]; @@ -55,10 +62,11 @@ void print_desc_stats(const char* name, uint64_t* data, size_t size) { const uint64_t var = calc_var(data, size, mean); const uint64_t std = (uint64_t)sqrt((double)var); - printf("%s-min: %lu\n", name, min); - printf("%s-max: %lu\n", name, max); - printf("%s-median: %lu\n", name, median); - printf("%s-mean: %lu\n", name, mean); - printf("%s-var: %lu\n", name, var); - printf("%s-std: %lu\n", name, std); + 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); + printf("%s%smean: %lu\n", indentation, indentation, mean); + printf("%s%svar: %lu\n", indentation, indentation, var); + printf("%s%sstd: %lu\n", indentation, indentation, std); } diff --git a/stats.h b/stats.h index db45f46ff7bb28c6258ed87c71036f25f8e5cc87..8c210ce209c09579b82e5bb9b0147fe3c0cb1f96 100644 --- a/stats.h +++ b/stats.h @@ -3,7 +3,7 @@ #include "stdint.h" #include "stdlib.h" -uint64_t calc_mean(uint64_t* data, size_t size); -uint64_t calc_median(uint64_t* data, size_t size); -uint64_t calc_var(uint64_t* data, size_t size, uint64_t mean); -void print_desc_stats(const char* name, uint64_t* data, size_t size); \ No newline at end of file +uint64_t calc_mean(const uint64_t* data, size_t size); +uint64_t calc_median(const uint64_t* data, size_t size); +uint64_t calc_var(const uint64_t* data, size_t size, uint64_t mean); +void print_desc_stats(const char* name, const char* indentation, const uint64_t* data, size_t size); \ No newline at end of file