rcx

library of miscellaneous bits of C code
git clone git://git.rr3.xyz/rcx
Log | Files | Refs | README | LICENSE

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:
Minc/bench.h | 7+++++--
Minc/def.h | 16++++++++++++++++
Msrc/bench.c | 9+++++++--
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"); }