commit 1d965e021e61123954b56d9cd80c6f1c1799e8cc
parent 7c1574660a1ee13e59769e86ef6aec4c18d754d5
Author: Robert Russell <robertrussell.72001@gmail.com>
Date: Mon, 29 May 2023 00:59:15 -0700
Improve bench; add endianness detection
Diffstat:
3 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/inc/bench.h b/inc/bench.h
@@ -14,12 +14,15 @@ Usage:
<cleanup (not timed)>
}
int main(void) {
- r_bench("my benchmark", my_benchmark, 3000);
+ r_bench(my_benchmark, 3000);
}
Note that <code to benchmark> can contain calls to r_bench_stop and
r_bench_start to pause and restart timing.
*/
-void r_bench(char *name, void (*fn)(u64 N), u32 goalms);
+#define r_bench(fn, goalms, ...) \
+ r_bench_(fn, goalms, VA_DEFAULT(,##__VA_ARGS__, #fn), VA_DROP1(__VA_ARGS__, ""))
+
+void r_bench_(void (*fn)(u64 N), u32 goalms, char *name, ...);
void r_bench_start(void);
void r_bench_stop(void);
diff --git a/inc/def.h b/inc/def.h
@@ -7,6 +7,13 @@
#define JOIN_AUX(a,b) a##b
#define JOIN(a,b) JOIN_AUX(a,b)
+#define VA_DROP1_(_0, ...) __VA_ARGS__
+#define VA_DROP1(...) VA_DROP1_(__VA_ARGS__)
+#define VA_DROP2_(_0, _1, ...) __VA_ARGS__
+#define VA_DROP2(...) VA_DROP2_(__VA_ARGS__,)
+#define VA_DROP3_(_0, _1, _2, ...) __VA_ARGS__
+#define VA_DROP3(...) VA_DROP3_(__VA_ARGS__,,)
+
/* VA_DEFAULT is a helper for writing macros with an optional argument. Usage:
* #define MY_MACRO(...) VA_DEFAULT(,##__VA_ARGS__, "default")
* MY_MACRO() -> "default"
@@ -57,6 +64,15 @@
#error "Expected CHAR_BIT == 8"
#endif
+#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define R_LITTLE_ENDIAN 1
+#elif defined(__BYTE_ORDER__) && __BYTE_ORDER == __ORDER_BIG_ENDIAN__
+#define R_BIG_ENDIAN 1
+#else
+#error "Can not detect endianness"
+/* If this ever happens, improve the above tests. */
+#endif
+
#if defined(__SIZEOF_INT128__)
#define R_HAVE_128 1
#endif
diff --git a/src/bench.c b/src/bench.c
@@ -64,7 +64,7 @@ printnsop(u64 N, u64 ns) {
}
void
-r_bench(char *name, void (*fn)(u64 N), u32 goalms) {
+r_bench_(void (*fn)(u64 N), u32 goalms, char *name, ...) {
run(fn, 1); /* Warmup */
u64 goalns = (u64)goalms * U64_C(1000000);
u64 N = 1;
@@ -72,7 +72,12 @@ r_bench(char *name, void (*fn)(u64 N), u32 goalms) {
while ((ns = run(fn, N)) < goalns && N < MAXN)
N = requiredN(N, ns, goalns);
- fprintf(stderr, "benchmark: %-25s%10"PRIu64" iters ", name, N);
+ char buf[1024];
+ va_list args;
+ va_start(args, name);
+ vsnprintf(buf, sizeof buf, name, args);
+ va_end(args);
+ fprintf(stderr, "benchmark: %-25s%10"PRIu64" iters ", buf, N);
printnsop(N, ns);
fprintf(stderr, "\n");
}