Add a simple benchmark for transparent lookup in raw_hash_set. This change adds a benchmark to measure the performance of `find` operations when using transparent hash and equality functors in `absl::raw_hash_set`. PiperOrigin-RevId: 974726978 Change-Id: I66c9bec30384916eb509abfebf4f1fe639a1012c
diff --git a/absl/container/BUILD.bazel b/absl/container/BUILD.bazel index c8eba69..99b1f53 100644 --- a/absl/container/BUILD.bazel +++ b/absl/container/BUILD.bazel
@@ -877,6 +877,7 @@ ":hashtable_control_bytes", ":raw_hash_set", "//absl/base:raw_logging_internal", + "//absl/hash", "//absl/random", "//absl/strings:str_format", "//absl/strings:string_view",
diff --git a/absl/container/internal/raw_hash_set_benchmark.cc b/absl/container/internal/raw_hash_set_benchmark.cc index da6e156..58baabe 100644 --- a/absl/container/internal/raw_hash_set_benchmark.cc +++ b/absl/container/internal/raw_hash_set_benchmark.cc
@@ -34,6 +34,7 @@ #include "absl/container/internal/hash_function_defaults.h" #include "absl/container/internal/hashtable_control_bytes.h" #include "absl/container/internal/raw_hash_set.h" +#include "absl/hash/hash.h" #include "absl/random/random.h" #include "absl/strings/str_format.h" #include "absl/strings/string_view.h" @@ -169,6 +170,32 @@ using Base::Base; }; +struct MyInt { + int64_t value; +}; + +struct TransparentIntHash { + using is_transparent = void; + size_t operator()(int64_t x) const { return absl::Hash<int64_t>{}(x); } + size_t operator()(MyInt x) const { return absl::Hash<int64_t>{}(x.value); } +}; + +struct TransparentIntEq { + using is_transparent = void; + bool operator()(int64_t x, MyInt y) const { return x == y.value; } + bool operator()(MyInt x, MyInt y) const { return x.value == y.value; } + bool operator()(MyInt x, int64_t y) const { return x.value == y; } + bool operator()(int64_t x, int64_t y) const { return x == y; } +}; + +struct TransparentIntTable + : raw_hash_set<IntPolicy, TransparentIntHash, TransparentIntEq, + std::allocator<int64_t>> { + using Base = typename TransparentIntTable::raw_hash_set; + TransparentIntTable() = default; + using Base::Base; +}; + struct string_generator { template <class RNG> std::string operator()(RNG& rng) const { @@ -599,6 +626,20 @@ } BENCHMARK(BM_DropDeletes); +void BM_TransparentFind(benchmark::State& state) { + TransparentIntTable table; + for (int i = 0; i < 10000; ++i) { + table.insert(i); + } + while (state.KeepRunningBatch(10000)) { + for (int i = 0; i < 10000; ++i) { + auto it = table.find(MyInt{i}); + benchmark::DoNotOptimize(it); + } + } +} +BENCHMARK(BM_TransparentFind); + void BM_Resize(benchmark::State& state) { // For now just measure a small cheap hash table since we // are mostly interested in the overhead of type-erasure