benchmark-set.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "hb-benchmark.hh"
  2. void RandomSet(unsigned size, unsigned max_value, hb_set_t* out) {
  3. hb_set_clear(out);
  4. srand(size * max_value);
  5. for (unsigned i = 0; i < size; i++) {
  6. while (true) {
  7. unsigned next = rand() % max_value;
  8. if (hb_set_has (out, next)) continue;
  9. hb_set_add(out, next);
  10. break;
  11. }
  12. }
  13. }
  14. // TODO(garretrieger): benchmark union/subtract/intersection etc.
  15. /* Insert a 1000 values into set of varying sizes. */
  16. static void BM_SetInsert_1000(benchmark::State& state) {
  17. unsigned set_size = state.range(0);
  18. unsigned max_value = state.range(0) * state.range(1);
  19. hb_set_t* original = hb_set_create ();
  20. RandomSet(set_size, max_value, original);
  21. assert(hb_set_get_population(original) == set_size);
  22. for (auto _ : state) {
  23. state.PauseTiming ();
  24. hb_set_t* data = hb_set_copy(original);
  25. state.ResumeTiming ();
  26. for (int i = 0; i < 1000; i++) {
  27. hb_set_add(data, i * 2654435761u % max_value);
  28. }
  29. hb_set_destroy(data);
  30. }
  31. hb_set_destroy(original);
  32. }
  33. BENCHMARK(BM_SetInsert_1000)
  34. ->Unit(benchmark::kMicrosecond)
  35. ->Ranges(
  36. {{1 << 10, 1 << 16}, // Set Size
  37. {2, 512}}); // Density
  38. /* Insert a 1000 values into set of varying sizes. */
  39. static void BM_SetOrderedInsert_1000(benchmark::State& state) {
  40. unsigned set_size = state.range(0);
  41. unsigned max_value = state.range(0) * state.range(1);
  42. hb_set_t* original = hb_set_create ();
  43. RandomSet(set_size, max_value, original);
  44. assert(hb_set_get_population(original) == set_size);
  45. for (auto _ : state) {
  46. state.PauseTiming ();
  47. hb_set_t* data = hb_set_copy(original);
  48. state.ResumeTiming ();
  49. for (int i = 0; i < 1000; i++) {
  50. hb_set_add(data, i);
  51. }
  52. hb_set_destroy(data);
  53. }
  54. hb_set_destroy(original);
  55. }
  56. BENCHMARK(BM_SetOrderedInsert_1000)
  57. ->Unit(benchmark::kMicrosecond)
  58. ->Ranges(
  59. {{1 << 10, 1 << 16}, // Set Size
  60. {2, 512}}); // Density
  61. /* Single value lookup on sets of various sizes. */
  62. static void BM_SetLookup(benchmark::State& state, unsigned interval) {
  63. unsigned set_size = state.range(0);
  64. unsigned max_value = state.range(0) * state.range(1);
  65. hb_set_t* original = hb_set_create ();
  66. RandomSet(set_size, max_value, original);
  67. assert(hb_set_get_population(original) == set_size);
  68. auto needle = max_value / 2;
  69. for (auto _ : state) {
  70. benchmark::DoNotOptimize(
  71. hb_set_has (original, (needle += interval) % max_value));
  72. }
  73. hb_set_destroy(original);
  74. }
  75. BENCHMARK_CAPTURE(BM_SetLookup, ordered, 3)
  76. ->Ranges(
  77. {{1 << 10, 1 << 16}, // Set Size
  78. {2, 512}}); // Density
  79. BENCHMARK_CAPTURE(BM_SetLookup, random, 12345)
  80. ->Ranges(
  81. {{1 << 10, 1 << 16}, // Set Size
  82. {2, 512}}); // Density
  83. /* Full iteration of sets of varying sizes. */
  84. static void BM_SetIteration(benchmark::State& state) {
  85. unsigned set_size = state.range(0);
  86. unsigned max_value = state.range(0) * state.range(1);
  87. hb_set_t* original = hb_set_create ();
  88. RandomSet(set_size, max_value, original);
  89. assert(hb_set_get_population(original) == set_size);
  90. hb_codepoint_t cp = HB_SET_VALUE_INVALID;
  91. for (auto _ : state) {
  92. hb_set_next (original, &cp);
  93. }
  94. hb_set_destroy(original);
  95. }
  96. BENCHMARK(BM_SetIteration)
  97. ->Ranges(
  98. {{1 << 10, 1 << 16}, // Set Size
  99. {2, 512}}); // Density
  100. /* Set copy. */
  101. static void BM_SetCopy(benchmark::State& state) {
  102. unsigned set_size = state.range(0);
  103. unsigned max_value = state.range(0) * state.range(1);
  104. hb_set_t* original = hb_set_create ();
  105. RandomSet(set_size, max_value, original);
  106. assert(hb_set_get_population(original) == set_size);
  107. for (auto _ : state) {
  108. hb_set_t *s = hb_set_create ();
  109. hb_set_set (s, original);
  110. hb_set_destroy (s);
  111. }
  112. hb_set_destroy(original);
  113. }
  114. BENCHMARK(BM_SetCopy)
  115. ->Unit(benchmark::kMicrosecond)
  116. ->Ranges(
  117. {{1 << 10, 1 << 16}, // Set Size
  118. {2, 512}}); // Density
  119. BENCHMARK_MAIN();