struct_array_traverse.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #define _POSIX_C_SOURCE 199309L
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #define ARRAY_SIZE 1000
  6. #define NUM_ROUNDS 100000
  7. static inline uint64_t nanos(void) {
  8. struct timespec ts;
  9. clock_gettime(CLOCK_MONOTONIC, &ts);
  10. return (uint64_t)ts.tv_sec * 1000000000ull + (uint64_t)ts.tv_nsec;
  11. }
  12. static uint64_t bench_int(void) {
  13. int arr[ARRAY_SIZE];
  14. for (int i = 0; i < ARRAY_SIZE; ++i) arr[i] = 1;
  15. volatile long long total = 0;
  16. uint64_t start = nanos();
  17. for (int round = 0; round < NUM_ROUNDS; ++round) {
  18. long long sum = 0;
  19. for (int i = 0; i < ARRAY_SIZE; ++i) sum += arr[i];
  20. total += sum;
  21. }
  22. uint64_t end = nanos();
  23. // prevent optimization
  24. if (total == 0) printf("unused: %lld\n", total);
  25. return (end - start) / NUM_ROUNDS;
  26. }
  27. static uint64_t bench_char(void) {
  28. char arr[ARRAY_SIZE];
  29. for (int i = 0; i < ARRAY_SIZE; ++i) arr[i] = 1;
  30. volatile long long total = 0;
  31. uint64_t start = nanos();
  32. for (int round = 0; round < NUM_ROUNDS; ++round) {
  33. long long sum = 0;
  34. for (int i = 0; i < ARRAY_SIZE; ++i) sum += arr[i];
  35. total += sum;
  36. }
  37. uint64_t end = nanos();
  38. if (total == 0) printf("unused: %lld\n", total);
  39. return (end - start) / NUM_ROUNDS;
  40. }
  41. int main(void) {
  42. uint64_t int_avg = bench_int();
  43. uint64_t char_avg = bench_char();
  44. printf("int[%d] average traversal (ns): %llu\n", ARRAY_SIZE,
  45. (unsigned long long)int_avg);
  46. printf("char[%d] average traversal (ns): %llu\n", ARRAY_SIZE,
  47. (unsigned long long)char_avg);
  48. return 0;
  49. }