Fixes #108624 This allows `flat_map::insert(Iter, Iter)` to directly forward to underlying containers' `insert(Iter, Iter)`, instead of inserting one element at a time, when input models "product iterator". atm, `flat_map::iterator` and `zip_view::iterator` are "product iterator"s. This gives about almost 10x speed up in my benchmark with -03 (for both before and after) ```cpp Benchmark Time CPU Time Old Time New CPU Old CPU New ----------------------------------------------------------------------------------------------------------------------------------------------- flat_map::insert_product_iterator_flat_map/32 -0.5028 -0.5320 149 74 149 70 flat_map::insert_product_iterator_flat_map/1024 -0.8617 -0.8618 3113 430 3112 430 flat_map::insert_product_iterator_flat_map/8192 -0.8877 -0.8877 26682 2995 26679 2995 flat_map::insert_product_iterator_flat_map/65536 -0.8769 -0.8769 226235 27844 226221 27841 flat_map::insert_product_iterator_zip/32 -0.5844 -0.5844 162 67 162 67 flat_map::insert_product_iterator_zip/1024 -0.8754 -0.8754 3427 427 3427 427 flat_map::insert_product_iterator_zip/8192 -0.8934 -0.8934 28134 3000 28132 3000 flat_map::insert_product_iterator_zip/65536 -0.8783 -0.8783 229783 27960 229767 27958 OVERALL_GEOMEAN -0.8319 -0.8332 0 0 0 0 ``` --------- Co-authored-by: Louis Dionne <ldionne.2@gmail.com>
36 lines
1.3 KiB
C++
36 lines
1.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// REQUIRES: std-at-least-c++23
|
|
|
|
#include <flat_map>
|
|
|
|
#include "associative_container_benchmarks.h"
|
|
#include "../../GenerateInput.h"
|
|
#include "benchmark/benchmark.h"
|
|
|
|
template <class K, class V>
|
|
struct support::adapt_operations<std::flat_multimap<K, V>> {
|
|
using ValueType = typename std::flat_multimap<K, V>::value_type;
|
|
using KeyType = typename std::flat_multimap<K, V>::key_type;
|
|
static ValueType value_from_key(KeyType const& k) { return {k, Generate<V>::arbitrary()}; }
|
|
static KeyType key_from_value(ValueType const& value) { return value.first; }
|
|
|
|
using InsertionResult = typename std::flat_multimap<K, V>::iterator;
|
|
static auto get_iterator(InsertionResult const& result) { return result; }
|
|
};
|
|
|
|
int main(int argc, char** argv) {
|
|
support::associative_container_benchmarks<std::flat_multimap<int, int>>("std::flat_multimap<int, int>");
|
|
|
|
benchmark::Initialize(&argc, argv);
|
|
benchmark::RunSpecifiedBenchmarks();
|
|
benchmark::Shutdown();
|
|
return 0;
|
|
}
|