// #include "absl/container/flat_hash_map.h" #include // for map, operator== #include #include #if __has_include("boost/unordered/unordered_flat_map.hpp") # if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wold-style-cast" # endif # include "boost/unordered/unordered_flat_map.hpp" # define HAS_BOOST_UNORDERED_FLAT_MAP() 1 // NOLINT(cppcoreguidelines-macro-usage) #else # define HAS_BOOST_UNORDERED_FLAT_MAP() 0 // NOLINT(cppcoreguidelines-macro-usage) #endif #include #include #include #include #include #include template void evaluate_map(Map& map) { auto rng = ankerl::nanobench::Rng{1234}; auto num_elements = size_t{10'000'000}; for (uint64_t i = 0; i < num_elements; ++i) { map[rng()] = i; } REQUIRE(map.size() == num_elements); } using hash_t = ankerl::unordered_dense::hash; using eq_t = std::equal_to; using pair_t = std::pair; using pair_const_t = std::pair; using alloc_t = counting_allocator; using alloc_const_t = counting_allocator; TEST_CASE("allocated_memory_std_vector" * doctest::skip()) { auto counters = counts_for_allocator{}; { using vec_t = std::vector; using map_t = ankerl::unordered_dense::map; auto map = map_t(0, hash_t{}, eq_t{}, alloc_t{&counters}); evaluate_map(map); } counters.save("allocated_memory_std_vector.txt"); } #if HAS_BOOST_UNORDERED_FLAT_MAP() TEST_CASE("allocated_memory_boost_flat_map" * doctest::skip()) { auto counters = counts_for_allocator{}; { using map_t = boost::unordered_flat_map; auto map = map_t(alloc_t{&counters}); evaluate_map(map); } counters.save("allocated_memory_unordered_flat_map.txt"); } #endif TEST_CASE("allocated_memory_std_deque" * doctest::skip()) { auto counters = counts_for_allocator{}; { using vec_t = std::deque; using map_t = ankerl::unordered_dense::map; auto map = map_t(0, hash_t{}, eq_t{}, alloc_t{&counters}); evaluate_map(map); } counters.save("allocated_memory_std_deque.txt"); } TEST_CASE("allocated_memory_segmented_vector" * doctest::skip()) { auto counters = counts_for_allocator{}; { using vec_t = ankerl::unordered_dense::segmented_vector; using map_t = ankerl::unordered_dense::segmented_map; auto map = map_t{0, hash_t{}, eq_t{}, alloc_t{&counters}}; evaluate_map(map); } counters.save("allocated_memory_segmented_vector.txt"); } #if 0 TEST_CASE("allocated_memory_std_unordered_map" * doctest::skip()) { auto counters = counts_for_allocator{}; { using map_t = std::unordered_map; auto map = map_t(0, alloc_t{&counters}); evaluate_map(map); } counters.save("allocated_memory_std_unordered_map.txt"); } TEST_CASE("allocated_memory_boost_unordered_flat_map" * doctest::skip()) { auto counters = counts_for_allocator{}; { using map_t = absl:: flat_hash_map, eq_t, alloc_const_t>; auto map = map_t(0, alloc_t{&counters}); evaluate_map(map); } counters.save("allocated_memory_absl_flat_hash_map.txt"); } #endif