In bug 38722 Mitsuru Kariya reported the map operations insert_or_assign with a hint violates the complexity requirement. The function no longer uses a lower_bound, which caused the wrong complexity.
This fixes bug 38722.
Benchmarked with: Run on (4 X 3400 MHz CPU s) CPU Caches: L1 Data 32K (x4) L1 Instruction 32K (x4) L2 Unified 256K (x4) L3 Unified 6144K (x1) Timing before: ----------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations ----------------------------------------------------------------------------------------------- BM_InsertAssignHint_MapSize=10_ExistingElement 6.99 ns 6.98 ns 121900000 BM_InsertAssignHint_MapSize=100_ExistingElement 14.4 ns 14.4 ns 48800000 BM_InsertAssignHint_MapSize=1000_ExistingElement 43.0 ns 43.0 ns 17000000 BM_InsertAssignHint_MapSize=10000_ExistingElement 56.5 ns 56.5 ns 11000000 BM_InsertAssignHint_MapSize=100000_ExistingElement 116 ns 116 ns 6000000 BM_InsertAssignHint_MapSize=1000000_ExistingElement 154 ns 154 ns 5000000 BM_InsertAssignHint_MapSize=10_NewElement 28.4 ns 28.4 ns 24690000 BM_InsertAssignHint_MapSize=100_NewElement 72.4 ns 72.4 ns 12600000 BM_InsertAssignHint_MapSize=1000_NewElement 74.3 ns 74.3 ns 9000000 BM_InsertAssignHint_MapSize=10000_NewElement 92.4 ns 92.4 ns 7000000 BM_InsertAssignHint_MapSize=100000_NewElement 151 ns 151 ns 5000000 BM_InsertAssignHint_MapSize=1000000_NewElement 194 ns 194 ns 4000000 ----------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations ----------------------------------------------------------------------------------------------- BM_InsertAssignHint_MapSize=10_ExistingElement 6.96 ns 6.96 ns 123030000 BM_InsertAssignHint_MapSize=100_ExistingElement 14.5 ns 14.4 ns 48600000 BM_InsertAssignHint_MapSize=1000_ExistingElement 43.0 ns 43.0 ns 17000000 BM_InsertAssignHint_MapSize=10000_ExistingElement 56.7 ns 56.7 ns 11000000 BM_InsertAssignHint_MapSize=100000_ExistingElement 116 ns 116 ns 6000000 BM_InsertAssignHint_MapSize=1000000_ExistingElement 153 ns 153 ns 5000000 BM_InsertAssignHint_MapSize=10_NewElement 28.6 ns 28.6 ns 24600000 BM_InsertAssignHint_MapSize=100_NewElement 76.2 ns 76.2 ns 12600000 BM_InsertAssignHint_MapSize=1000_NewElement 74.6 ns 74.6 ns 9000000 BM_InsertAssignHint_MapSize=10000_NewElement 92.4 ns 92.4 ns 7000000 BM_InsertAssignHint_MapSize=100000_NewElement 151 ns 151 ns 4000000 BM_InsertAssignHint_MapSize=1000000_NewElement 194 ns 194 ns 3000000 ----------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations ----------------------------------------------------------------------------------------------- BM_InsertAssignHint_MapSize=10_ExistingElement 6.96 ns 6.96 ns 122840000 BM_InsertAssignHint_MapSize=100_ExistingElement 14.5 ns 14.5 ns 49000000 BM_InsertAssignHint_MapSize=1000_ExistingElement 43.0 ns 43.0 ns 17000000 BM_InsertAssignHint_MapSize=10000_ExistingElement 56.4 ns 56.4 ns 11000000 BM_InsertAssignHint_MapSize=100000_ExistingElement 116 ns 116 ns 6000000 BM_InsertAssignHint_MapSize=1000000_ExistingElement 154 ns 154 ns 4000000 BM_InsertAssignHint_MapSize=10_NewElement 28.3 ns 28.3 ns 24830000 BM_InsertAssignHint_MapSize=100_NewElement 76.1 ns 76.1 ns 12500000 BM_InsertAssignHint_MapSize=1000_NewElement 74.7 ns 74.7 ns 9000000 BM_InsertAssignHint_MapSize=10000_NewElement 92.8 ns 92.8 ns 7000000 BM_InsertAssignHint_MapSize=100000_NewElement 150 ns 150 ns 4000000 BM_InsertAssignHint_MapSize=1000000_NewElement 197 ns 197 ns 3000000 Timing after: ----------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations ----------------------------------------------------------------------------------------------- BM_InsertAssignHint_MapSize=10_ExistingElement 4.30 ns 4.30 ns 167310000 BM_InsertAssignHint_MapSize=100_ExistingElement 8.18 ns 8.18 ns 85400000 BM_InsertAssignHint_MapSize=1000_ExistingElement 8.11 ns 8.11 ns 87000000 BM_InsertAssignHint_MapSize=10000_ExistingElement 8.11 ns 8.11 ns 87000000 BM_InsertAssignHint_MapSize=100000_ExistingElement 8.28 ns 8.28 ns 83000000 BM_InsertAssignHint_MapSize=1000000_ExistingElement 8.63 ns 8.62 ns 82000000 BM_InsertAssignHint_MapSize=10_NewElement 23.5 ns 23.4 ns 30110000 BM_InsertAssignHint_MapSize=100_NewElement 63.2 ns 63.0 ns 10000000 BM_InsertAssignHint_MapSize=1000_NewElement 46.7 ns 46.6 ns 15000000 BM_InsertAssignHint_MapSize=10000_NewElement 41.8 ns 41.7 ns 13000000 BM_InsertAssignHint_MapSize=100000_NewElement 42.3 ns 42.1 ns 15000000 BM_InsertAssignHint_MapSize=1000000_NewElement 47.9 ns 47.7 ns 14000000 ----------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations ----------------------------------------------------------------------------------------------- BM_InsertAssignHint_MapSize=10_ExistingElement 4.30 ns 4.30 ns 167500000 BM_InsertAssignHint_MapSize=100_ExistingElement 8.39 ns 8.39 ns 84800000 BM_InsertAssignHint_MapSize=1000_ExistingElement 8.14 ns 8.15 ns 86000000 BM_InsertAssignHint_MapSize=10000_ExistingElement 8.12 ns 8.12 ns 87000000 BM_InsertAssignHint_MapSize=100000_ExistingElement 8.37 ns 8.37 ns 85000000 BM_InsertAssignHint_MapSize=1000000_ExistingElement 8.61 ns 8.61 ns 82000000 BM_InsertAssignHint_MapSize=10_NewElement 23.4 ns 23.4 ns 29830000 BM_InsertAssignHint_MapSize=100_NewElement 66.8 ns 66.8 ns 10000000 BM_InsertAssignHint_MapSize=1000_NewElement 46.6 ns 46.6 ns 14000000 BM_InsertAssignHint_MapSize=10000_NewElement 41.3 ns 41.4 ns 14000000 BM_InsertAssignHint_MapSize=100000_NewElement 41.7 ns 41.7 ns 14000000 BM_InsertAssignHint_MapSize=1000000_NewElement 48.5 ns 48.5 ns 11000000 ----------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations ----------------------------------------------------------------------------------------------- BM_InsertAssignHint_MapSize=10_ExistingElement 4.27 ns 4.27 ns 166850000 BM_InsertAssignHint_MapSize=100_ExistingElement 8.53 ns 8.53 ns 85100000 BM_InsertAssignHint_MapSize=1000_ExistingElement 8.31 ns 8.31 ns 86000000 BM_InsertAssignHint_MapSize=10000_ExistingElement 8.17 ns 8.18 ns 86000000 BM_InsertAssignHint_MapSize=100000_ExistingElement 8.73 ns 8.73 ns 82000000 BM_InsertAssignHint_MapSize=1000000_ExistingElement 8.98 ns 8.98 ns 81000000 BM_InsertAssignHint_MapSize=10_NewElement 24.6 ns 24.6 ns 29720000 BM_InsertAssignHint_MapSize=100_NewElement 71.9 ns 71.9 ns 10000000 BM_InsertAssignHint_MapSize=1000_NewElement 46.1 ns 46.1 ns 13000000 BM_InsertAssignHint_MapSize=10000_NewElement 41.7 ns 41.8 ns 14000000 BM_InsertAssignHint_MapSize=100000_NewElement 42.1 ns 42.1 ns 13000000 BM_InsertAssignHint_MapSize=1000000_NewElement 48.6 ns 48.6 ns 13000000
I think it would be better if __emplace_hint_unique_key_args returned a pair of bool and iterator, like __emplace_unique_key_args does. We could then reuse it to implement this functionality. WDYT?