ContainerBenchmarks.hpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #ifndef BENCHMARK_CONTAINER_BENCHMARKS_HPP
  2. #define BENCHMARK_CONTAINER_BENCHMARKS_HPP
  3. #include <cassert>
  4. #include "benchmark/benchmark_api.h"
  5. namespace ContainerBenchmarks {
  6. template <class Container, class GenInputs>
  7. void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
  8. auto in = gen(st.range_x());
  9. const auto end = in.end();
  10. while (st.KeepRunning()) {
  11. c.clear();
  12. for (auto it = in.begin(); it != end; ++it) {
  13. benchmark::DoNotOptimize(&(*c.insert(*it).first));
  14. }
  15. benchmark::ClobberMemory();
  16. }
  17. }
  18. template <class Container, class GenInputs>
  19. void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
  20. auto in = gen(st.range_x());
  21. const auto end = in.end();
  22. while (st.KeepRunning()) {
  23. c.clear();
  24. c.rehash(16);
  25. for (auto it = in.begin(); it != end; ++it) {
  26. benchmark::DoNotOptimize(&(*c.insert(*it).first));
  27. }
  28. benchmark::ClobberMemory();
  29. }
  30. }
  31. template <class Container, class GenInputs>
  32. void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
  33. auto in = gen(st.range_x());
  34. const auto end = in.end();
  35. c.insert(in.begin(), in.end());
  36. benchmark::DoNotOptimize(&c);
  37. benchmark::DoNotOptimize(&in);
  38. while (st.KeepRunning()) {
  39. for (auto it = in.begin(); it != end; ++it) {
  40. benchmark::DoNotOptimize(&(*c.insert(*it).first));
  41. }
  42. benchmark::ClobberMemory();
  43. }
  44. }
  45. template <class Container, class GenInputs>
  46. void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
  47. auto in = gen(st.range_x());
  48. const auto end = in.end();
  49. c.insert(in.begin(), in.end());
  50. benchmark::DoNotOptimize(&c);
  51. benchmark::DoNotOptimize(&in);
  52. while (st.KeepRunning()) {
  53. for (auto it = in.begin(); it != end; ++it) {
  54. benchmark::DoNotOptimize(&(*c.emplace(*it).first));
  55. }
  56. benchmark::ClobberMemory();
  57. }
  58. }
  59. template <class Container, class GenInputs>
  60. static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
  61. auto in = gen(st.range_x());
  62. c.insert(in.begin(), in.end());
  63. benchmark::DoNotOptimize(&(*c.begin()));
  64. const auto end = in.data() + in.size();
  65. while (st.KeepRunning()) {
  66. for (auto it = in.data(); it != end; ++it) {
  67. benchmark::DoNotOptimize(&(*c.find(*it)));
  68. }
  69. benchmark::ClobberMemory();
  70. }
  71. }
  72. template <class Container, class GenInputs>
  73. static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
  74. c.rehash(8);
  75. auto in = gen(st.range_x());
  76. c.insert(in.begin(), in.end());
  77. benchmark::DoNotOptimize(&(*c.begin()));
  78. const auto end = in.data() + in.size();
  79. while (st.KeepRunning()) {
  80. for (auto it = in.data(); it != end; ++it) {
  81. benchmark::DoNotOptimize(&(*c.find(*it)));
  82. }
  83. benchmark::ClobberMemory();
  84. }
  85. }
  86. } // end namespace ContainerBenchmarks
  87. #endif // BENCHMARK_CONTAINER_BENCHMARKS_HPP