benchmark.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include <ccan/time/time.h>
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #ifdef FIRST_APPROX
  6. #include "first-approx.c"
  7. #endif
  8. #ifdef SECOND_APPROX
  9. #include "second-approx.c"
  10. #endif
  11. #ifdef NO_APPROX
  12. #include "no-approx.c"
  13. #endif
  14. int main(int argc, char *argv[])
  15. {
  16. struct timespec start, val, val2, end, diff;
  17. unsigned int i, j, limit = atoi(argv[1] ?: "100000");
  18. uint64_t val64;
  19. val = start = time_now();
  20. val64 = to_u64(start);
  21. val2.tv_sec = 0;
  22. val2.tv_nsec = 1;
  23. for (j = 0; j < limit; j++) {
  24. for (i = 0; i < limit; i++) {
  25. val = time_add(val, val2);
  26. val64 += to_u64(val2);
  27. }
  28. }
  29. end = time_now();
  30. printf("val64 says %lu.%09lu\n",
  31. from_u64(val64).tv_sec,
  32. from_u64(val64).tv_nsec);
  33. printf("val says %lu.%09lu\n",
  34. val.tv_sec,
  35. val.tv_nsec);
  36. if (time_greater(val, from_u64(val64)))
  37. diff = time_sub(val, from_u64(val64));
  38. else
  39. diff = time_sub(from_u64(val64), val);
  40. printf("Time %lluns, error = %i%%\n",
  41. (long long)time_to_nsec(time_sub(end, start)),
  42. (int)(100 * time_to_nsec(diff) / time_to_nsec(time_sub(val, start))));
  43. return 0;
  44. }