Guest User

Untitled

a guest
Jan 8th, 2020
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.03 KB | None | 0 0
  1. /*
  2. ---------------------------------------------------------------------------------------
  3. Benchmark                                                Time           CPU Iterations
  4. ---------------------------------------------------------------------------------------
  5. BM_UniqueSort/10000                                 427641 ns     427878 ns       1623   22.2884M items/s
  6. BM_UniqueSort/32768                                1574255 ns    1575103 ns        440     19.84M items/s
  7. BM_UniqueSort/262144                              14759406 ns   14767144 ns         47   16.9295M items/s
  8. BM_UniqueSort/2097152                            139690581 ns  139767236 ns          5   14.3095M items/s
  9. BM_UniqueSort/16777216                          1281876575 ns 1282551187 ns          1   12.4751M items/s
  10. BM_UniqueSort/100000000                         8465389316 ns 8469560234 ns          1     11.26M items/s
  11. BM_UniqueSet<std::set<int>>/10000                   920241 ns     920688 ns        767   10.3583M items/s
  12. BM_UniqueSet<std::set<int>>/32768                  4468282 ns    4470346 ns        157   6.99051M items/s
  13. BM_UniqueSet<std::set<int>>/262144                59091943 ns   59118904 ns         13   4.22877M items/s
  14. BM_UniqueSet<std::set<int>>/2097152              916682350 ns  917108834 ns          1   2.18077M items/s
  15. BM_UniqueSet<std::set<int>>/16777216            12306704851 ns 12311840027 ns          1   1.29956M items/s
  16. BM_UniqueSet<std::set<int>>/100000000           105985874336 ns 106006139165 ns          1   921.232k items/s
  17. BM_UniqueSet<std::unordered_set<int>>/10000         385781 ns     385818 ns       1835   24.7182M items/s
  18. BM_UniqueSet<std::unordered_set<int>>/32768        1359416 ns    1359437 ns        520   22.9875M items/s
  19. BM_UniqueSet<std::unordered_set<int>>/262144      11666135 ns   11667829 ns         58   21.4264M items/s
  20. BM_UniqueSet<std::unordered_set<int>>/2097152    179158325 ns  179174401 ns          4   11.1623M items/s
  21. BM_UniqueSet<std::unordered_set<int>>/16777216  1753106587 ns 1753300050 ns          1   9.12565M items/s
  22. BM_UniqueSet<std::unordered_set<int>>/100000000 10425629809 ns 10426576113 ns          1   9.14657M items/s
  23. BM_UniqueSet<ska::flat_hash_set<int>>/10000         150666 ns     150677 ns       4707   63.2925M items/s
  24. BM_UniqueSet<ska::flat_hash_set<int>>/32768         551839 ns     551921 ns       1251   56.6204M items/s
  25. BM_UniqueSet<ska::flat_hash_set<int>>/262144       4581551 ns    4582179 ns        152   54.5592M items/s
  26. BM_UniqueSet<ska::flat_hash_set<int>>/2097152     55052293 ns   55061662 ns         12   36.3229M items/s
  27. BM_UniqueSet<ska::flat_hash_set<int>>/16777216   494396740 ns  494457701 ns          2   32.3587M items/s
  28. BM_UniqueSet<ska::flat_hash_set<int>>/100000000 3777955780 ns 3777951981 ns          1   25.2432M items/s
  29. */
  30. // Benchmark file contents, depends on google-benchmark and flat_hash_map (from abseil or Chrome/ska).
  31. #include <benchmark/benchmark.h>
  32. #include <iostream>
  33. #include <set>
  34. #include <unordered_set>
  35. #include <vector>
  36.  
  37. #include "flat_hash_map/flat_hash_map.hpp"
  38.  
  39. namespace {
  40.  
  41. #define TEST_RANGE ->Range(10000, 100000000);
  42.  
  43. // Generate an array of int32s where 50% of the values are unique.
  44. std::vector<int> MakeVector(std::size_t n) {
  45.   std::vector<int> result(n);
  46.   for (int i = 1; i < n; ++i) {
  47.     int val = rand();
  48.     result[i] = val & 0x1 ? val >> 1 : result[val % i];
  49.   }
  50.   return result;
  51. }
  52.  
  53.  
  54. static void BM_UniqueSort(benchmark::State &state) {
  55.   const int size = state.range(0);
  56.   const auto input_data = MakeVector(size);
  57.   std::vector<int> output_data;
  58.   output_data.reserve(size);
  59.   for (auto _ : state) {
  60.      output_data = input_data;
  61.      std::sort(output_data.begin(), output_data.end());
  62.      output_data.erase(std::unique(output_data.begin(), output_data.end()),
  63.                        output_data.end());
  64.   }
  65.   state.SetItemsProcessed(state.iterations() * size);
  66. }
  67. BENCHMARK(BM_UniqueSort) TEST_RANGE;
  68.  
  69.  
  70. template <typename T> void reserve(T* set, int n) {}
  71. template <typename T> void reserve(std::unordered_set<T>* set, int n) {  set->reserve(n); }
  72. template <typename T> void reserve(ska::flat_hash_set<T>* set, int n) {  set->reserve(n); }
  73.  
  74. template <typename Set> static void BM_UniqueSet(benchmark::State &state) {
  75.   const int size = state.range(0);
  76.   const auto input_data = MakeVector(size);
  77.   std::vector<int> output_data;
  78.   output_data.reserve(size);
  79.  
  80.   for (auto _ : state) {
  81.     Set set;
  82.     reserve(&set, size);  // Specialized to allow usage with std::set.
  83.     output_data.resize(size);
  84.     auto output_iter = output_data.begin();
  85.     for (const int value : input_data) {
  86.       if (set.insert(value).second) {
  87.         *output_iter++ = value;
  88.       }
  89.     }
  90.     output_data.erase(output_iter, output_data.end());
  91.   }
  92.   state.SetItemsProcessed(state.iterations() * size);
  93. }
  94. BENCHMARK_TEMPLATE(BM_UniqueSet, std::set<int>) TEST_RANGE;
  95. BENCHMARK_TEMPLATE(BM_UniqueSet, std::unordered_set<int>) TEST_RANGE;
  96. BENCHMARK_TEMPLATE(BM_UniqueSet, ska::flat_hash_set<int>) TEST_RANGE;
  97.  
  98. }  // namespace
  99.  
  100. BENCHMARK_MAIN();
Advertisement
Add Comment
Please, Sign In to add comment