Main.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <stdio.h>
  2. #include "core/HashMap.h"
  3. #include "core/Random.h"
  4. #include "core/Utility.h"
  5. static i64 testSearch(const HashMap* m) {
  6. i64 nanos = coreGetNanos();
  7. volatile int sum = 0;
  8. for(int i = 0; i < 10000; i++) {
  9. for(int k = -5000; k < 5000; k++) {
  10. const int* s = coreSearchTypedHashMapKey(m, int, i + k, int);
  11. if(s != nullptr) {
  12. sum = sum + *s;
  13. }
  14. }
  15. }
  16. return coreGetNanos() - nanos;
  17. }
  18. static i64 testEmptySearch(const HashMap* m) {
  19. i64 nanos = coreGetNanos();
  20. volatile int sum = 0;
  21. for(int i = 0; i < 100'000'000; i++) {
  22. const int* s = coreSearchTypedHashMapKey(m, int, -i, int);
  23. if(s != nullptr) {
  24. sum = sum + *s;
  25. }
  26. }
  27. return coreGetNanos() - nanos;
  28. }
  29. static void fillOrder(HashMap* m) {
  30. i64 nanos = coreGetNanos();
  31. for(int i = 0; i < 10000; i++) {
  32. corePutTypedHashMapPair(m, int, i, int, i* i);
  33. }
  34. printf("Fill Order: %ldns\n", coreGetNanos() - nanos);
  35. }
  36. static void fillChaos(HashMap* m) {
  37. i64 nanos = coreGetNanos();
  38. Random random;
  39. coreInitRandom(&random, 0);
  40. for(int i = 0; i < 10000; i++) {
  41. int r = coreRandomI32(&random, 0, 10000);
  42. corePutTypedHashMapPair(m, int, r, int, r* r);
  43. }
  44. printf("Fill Chaos: %ldns\n", coreGetNanos() - nanos);
  45. }
  46. static i64 average(HashMap* m, i64 (*f)(const HashMap* m), int n) {
  47. i64 sum = 0;
  48. for(int i = 0; i < n; i++) {
  49. sum += f(m);
  50. }
  51. return (i64)(sum / (n * 1'000'000));
  52. }
  53. static void order(int n) {
  54. HashMap m;
  55. coreInitHashMap(&m, sizeof(int), sizeof(int));
  56. fillOrder(&m);
  57. puts("Order Probing");
  58. printf("Search | %ld ms\n", average(&m, testSearch, n));
  59. printf("EmptySearch | %ld ms\n", average(&m, testEmptySearch, n));
  60. coreDestroyHashMap(&m);
  61. }
  62. static void chaos(int n) {
  63. HashMap m;
  64. coreInitHashMap(&m, sizeof(int), sizeof(int));
  65. fillChaos(&m);
  66. puts("Chaos Probing");
  67. printf("Search | %ld ms\n", average(&m, testSearch, n));
  68. printf("EmptySearch | %ld ms\n", average(&m, testEmptySearch, n));
  69. coreDestroyHashMap(&m);
  70. }
  71. int main() {
  72. order(3);
  73. chaos(3);
  74. return 0;
  75. }