[libcxx-commits] [libcxx] [libc++] Optimize map::insert_or_assign (PR #155816)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Aug 28 09:09:26 PDT 2025
================
@@ -259,6 +259,57 @@ void associative_container_benchmarks(std::string container) {
}
});
+ if constexpr (is_map_like && !is_multi_key_container) {
+ bench("insert_or_assign(key, value) (already present)", [=](auto& st) {
+ const std::size_t size = st.range(0) ? st.range(0) : 1;
+ std::vector<Value> in = make_value_types(generate_unique_keys(size));
+ Value to_insert = in[in.size() / 2]; // pick any existing value
+ std::vector<Container> c(BatchSize, Container(in.begin(), in.end()));
+ typename Container::iterator inserted[BatchSize];
+
+ while (st.KeepRunningBatch(BatchSize)) {
+ for (std::size_t i = 0; i != BatchSize; ++i) {
+ inserted[i] =
+ adapt_operations<Container>::get_iterator(c[i].insert_or_assign(to_insert.first, to_insert.second));
+ benchmark::DoNotOptimize(inserted[i]);
+ benchmark::DoNotOptimize(c[i]);
+ benchmark::ClobberMemory();
+ }
+
+ if constexpr (is_multi_key_container) {
+ st.PauseTiming();
+ for (std::size_t i = 0; i != BatchSize; ++i) {
+ c[i].erase(inserted[i]);
+ }
+ st.ResumeTiming();
+ }
----------------
ldionne wrote:
This is always false.
```suggestion
```
https://github.com/llvm/llvm-project/pull/155816
More information about the libcxx-commits
mailing list