diff --git a/benchmarks/struct_array_traverse b/benchmarks/struct_array_traverse new file mode 100755 index 00000000..7716aa63 Binary files /dev/null and b/benchmarks/struct_array_traverse differ diff --git a/benchmarks/struct_array_traverse.c b/benchmarks/struct_array_traverse.c new file mode 100644 index 00000000..2e7efb46 --- /dev/null +++ b/benchmarks/struct_array_traverse.c @@ -0,0 +1,53 @@ +#define _POSIX_C_SOURCE 199309L +#include +#include +#include + +static inline uint64_t nanos(void) { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000ull + (uint64_t)ts.tv_nsec; +} + +static uint64_t bench_int(void) { + int arr[1000]; + for (int i = 0; i < 1000; ++i) arr[i] = 1; + + volatile long long total = 0; + uint64_t start = nanos(); + for (int round = 0; round < 1000; ++round) { + long long sum = 0; + for (int i = 0; i < 1000; ++i) sum += arr[i]; + total += sum; + } + uint64_t end = nanos(); + // prevent optimization + if (total == 0) printf("unused: %lld\n", total); + return (end - start) / 1000; +} + +static uint64_t bench_char(void) { + char arr[1000]; + for (int i = 0; i < 1000; ++i) arr[i] = 1; + + volatile long long total = 0; + uint64_t start = nanos(); + for (int round = 0; round < 1000; ++round) { + long long sum = 0; + for (int i = 0; i < 1000; ++i) sum += arr[i]; + total += sum; + } + uint64_t end = nanos(); + if (total == 0) printf("unused: %lld\n", total); + return (end - start) / 1000; +} + +int main(void) { + uint64_t int_avg = bench_int(); + uint64_t char_avg = bench_char(); + printf("int[1000] average traversal (ns): %llu\n", + (unsigned long long)int_avg); + printf("char[1000] average traversal (ns): %llu\n", + (unsigned long long)char_avg); + return 0; +}