struct_array_traverse.c 1.4 KB

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