Table of Contents
This test is practically exactly the same as Find 1-2000 size_t , except that it uses 100 byte long std::string
. There are 4000 lookups every 4 inserts, until 100k entries inserts.
Results
Hashes
In Insert & Erase std::string we have evaluated that robin_hood::hash
is fastest for 100 byte strings, and this is also the case in this benchmark. libstdc++-v3
s performance is a tad slower, FNV1a
is very slow.
Hashmaps
Here, the robin_hood::unordered_node_map
is the clear winner, only narrowly followed by robin_hood::unordered_flat_map
. It can clearly be seen that the 1-byte overhead structure is quite important here: in the 0% lookup success case, the performance is much higher because this byte saves us from a lot of std::string
comparison checks.
Not only is robin_hood::unordered_node_map
the fastest, it has also quite low peak memory usage, only beaten by tsl::sparse_map
. E.g. tsl::robin_map
uses more than 3 times as much memory.
Chart
Each entry shows average time for a single find
and access operation (if found). The final number is average over all entries.
blue : 0% find success, 100 byte size std::string
orange : 25% find success, 100 byte size std::string
green : 50% find success, 100 byte size std::string
red : 75% find success, 100 byte size std::string
magenta : 100% find success, 100 byte size std::string
88.6ns avg 8.80MB 88.4ns avg 9.00MB 79.3ns avg 10.2MB 77.3ns avg 7.51MB 76.2ns avg 7.69MB 73.7ns avg 8.93MB 72.1ns avg 6.70MB 70.7ns avg 11.7MB 68.4ns avg 23.5MB 67.0ns avg 10.5MB 66.5ns avg 22.7MB 66.0ns avg 12.1MB 64.1ns avg 6.58MB 53.0ns avg 18.1MB 48.1ns avg 10.3MB 46.9ns avg 11.2MB 45.2ns avg 8.54MB 44.9ns avg 8.53MB 44.0ns avg 7.72MB 41.1ns avg 9.46MB 40.6ns avg 7.01MB std::unordered_map boost::unordered_map emilib1::HashMap phmap:: parallel_flat_hash_map phmap:: parallel_node_hash_map eastl::hash_map spp::sparse_hash_map boost::multi_index:: hashed_unique ska::flat_hash_map tsl::hopscotch_map tsl::robin_map ska::bytell_hash_map tsl::sparse_map folly::F14ValueMap folly::F14NodeMap absl::flat_hash_map absl::node_hash_map phmap::flat_hash_map phmap::node_hash_map robin_hood:: unordered_flat_map robin_hood:: unordered_node_map 90.7ns avg 8.79MB 90.5ns avg 9.10MB 81.3ns avg 9.49MB 78.2ns avg 7.42MB 77.2ns avg 7.74MB 76.1ns avg 8.93MB 71.5ns avg 6.46MB 71.5ns avg 11.8MB 70.0ns avg 22.3MB 69.4ns avg 23.5MB 68.0ns avg 9.46MB 67.1ns avg 9.21MB 66.2ns avg 6.48MB 53.8ns avg 17.4MB 49.1ns avg 10.2MB 46.8ns avg 10.2MB 46.2ns avg 9.90MB 45.8ns avg 8.45MB 45.1ns avg 7.70MB 43.0ns avg 9.49MB 42.3ns avg 7.05MB std::unordered_map boost::unordered_map emilib1::HashMap phmap:: parallel_flat_hash_map phmap:: parallel_node_hash_map eastl::hash_map spp::sparse_hash_map boost::multi_index:: hashed_unique tsl::robin_map ska::flat_hash_map tsl::hopscotch_map ska::bytell_hash_map tsl::sparse_map folly::F14ValueMap folly::F14NodeMap absl::flat_hash_map phmap::flat_hash_map absl::node_hash_map phmap::node_hash_map robin_hood:: unordered_flat_map robin_hood:: unordered_node_map 101ns avg 9.26MB 98.8ns avg 8.72MB 92.6ns avg 10.8MB 88.6ns avg 7.44MB 87.2ns avg 7.81MB 84.0ns avg 8.94MB 81.5ns avg 6.67MB 80.7ns avg 11.8MB 80.2ns avg 23.0MB 80.1ns avg 23.7MB 77.6ns avg 10.4MB 77.3ns avg 9.61MB 76.6ns avg 6.65MB 65.4ns avg 17.4MB 60.2ns avg 10.1MB 58.4ns avg 9.18MB 57.6ns avg 8.42MB 57.6ns avg 9.16MB 56.4ns avg 7.68MB 53.1ns avg 9.48MB 52.3ns avg 7.03MB boost::unordered_map std::unordered_map emilib1::HashMap phmap:: parallel_flat_hash_map phmap:: parallel_node_hash_map eastl::hash_map spp::sparse_hash_map boost::multi_index:: hashed_unique tsl::robin_map ska::flat_hash_map tsl::hopscotch_map ska::bytell_hash_map tsl::sparse_map folly::F14ValueMap folly::F14NodeMap absl::flat_hash_map absl::node_hash_map phmap::flat_hash_map phmap::node_hash_map robin_hood:: unordered_flat_map robin_hood:: unordered_node_map 103ns avg 8.81MB 103ns avg 9.00MB 93.1ns avg 13.8MB 89.8ns avg 7.21MB 89.6ns avg 7.74MB 86.8ns avg 8.99MB 84.1ns avg 11.8MB 82.8ns avg 6.92MB 82.3ns avg 24.1MB 82.3ns avg 22.8MB 80.2ns avg 13.8MB 79.5ns avg 12.0MB 77.3ns avg 6.50MB 62.1ns avg 19.2MB 59.5ns avg 9.45MB 58.5ns avg 8.42MB 58.0ns avg 10.0MB 57.9ns avg 10.2MB 57.3ns avg 7.75MB 56.0ns avg 9.50MB 55.5ns avg 7.03MB std::unordered_map boost::unordered_map emilib1::HashMap phmap:: parallel_flat_hash_map phmap:: parallel_node_hash_map eastl::hash_map boost::multi_index:: hashed_unique spp::sparse_hash_map ska::flat_hash_map tsl::robin_map tsl::hopscotch_map ska::bytell_hash_map tsl::sparse_map folly::F14ValueMap absl::flat_hash_map absl::node_hash_map phmap::flat_hash_map folly::F14NodeMap phmap::node_hash_map robin_hood:: unordered_flat_map robin_hood:: unordered_node_map 191ns avg 9.08MB 189ns avg 8.78MB 181ns avg 10.6MB 178ns avg 7.39MB 177ns avg 7.80MB 174ns avg 8.98MB 171ns avg 11.7MB 171ns avg 6.89MB 169ns avg 22.6MB 169ns avg 23.8MB 168ns avg 10.4MB 166ns avg 12.0MB 163ns avg 6.53MB 151ns avg 19.6MB 146ns avg 9.90MB 142ns avg 10.3MB 141ns avg 8.47MB 140ns avg 8.42MB 139ns avg 7.67MB 138ns avg 6.98MB 137ns avg 9.51MB 0 0.2μ 0.4μ 0.6μ 0.8μ 1μ boost::unordered_map std::unordered_map emilib1::HashMap phmap:: parallel_flat_hash_map phmap:: parallel_node_hash_map eastl::hash_map boost::multi_index:: hashed_unique spp::sparse_hash_map tsl::robin_map ska::flat_hash_map tsl::hopscotch_map ska::bytell_hash_map tsl::sparse_map folly::F14ValueMap folly::F14NodeMap absl::flat_hash_map phmap::flat_hash_map absl::node_hash_map phmap::node_hash_map robin_hood:: unordered_node_map robin_hood:: unordered_flat_map
robin_hood::hash libstdc++-v3 absl::Hash folly::hasher FNV1a