RFR: 8324573: HashMap::putAll add notes for conservative resizing [v4]
Joshua Cao
duke at openjdk.org
Fri Feb 16 23:32:55 UTC 2024
On Fri, 2 Feb 2024 17:38:13 GMT, Joshua Cao <duke at openjdk.org> wrote:
>> Add notes for `HashMap::putAll()` conservative resizing.
>>
>> Note: everything below this line is from the original change. After discussion, we decided to keep the conservative resizing, but we should add an `@implNote` for the decision.
>>
>> ---
>>
>> This change mirrors what we did for ConcurrentHashMap in https://github.com/openjdk/jdk/pull/17116. When we add all entries from one map to anther, we should resize that map to the size of the sum of both maps.
>>
>> I used the command below to run the benchmarks. I set a high heap to reduce garbage collection noise.
>>
>> java -Xms25G -jar benchmarks.jar -p size=100000 -p addSize=100000 -gc true org.openjdk.bench.java.util.HashMapBench
>>
>>
>> Before change
>>
>>
>> Benchmark (addSize) (mapType) (size) Mode Cnt Score Error Units
>> HashMapBench.putAll 100000 HASH_MAP 100000 avgt 4 22.927 ± 3.170 ms/op
>> HashMapBench.putAll 100000 LINKED_HASH_MAP 100000 avgt 4 25.198 ± 2.189 ms/op
>>
>>
>> After change
>>
>>
>> Benchmark (addSize) (mapType) (size) Mode Cnt Score Error Units
>> HashMapBench.putAll 100000 HASH_MAP 100000 avgt 4 16.780 ± 0.526 ms/op
>> HashMapBench.putAll 100000 LINKED_HASH_MAP 100000 avgt 4 19.721 ± 0.349 ms/op
>>
>>
>> We see about average time improvements of 26% in HashMap and 20% in LinkedHashMap.
>>
>> ---
>>
>> In the worse case, we may have two maps with identical keys. In this case, we would aggressively resize when we do not need to. I'm also adding an additional `putAllSameKeys` benchmark.
>>
>> Before change:
>>
>>
>> Benchmark (addSize) (mapType) (size) Mode Cnt Score Error Units
>> HashMapBench.putAllSameKeys 100000 HASH_MAP 100000 avgt 6.956 ms/op
>> HashMapBench.putAllSameKeys:gc.alloc.rate 100000 HASH_MAP 100000 avgt 1091.383 MB/sec
>> HashMapBench.putAllSameKeys:gc.alloc.rate.norm 100000 HASH_MAP 100000 avgt 7968871.917 B/op
>> HashMapBench.putAllSameKeys:gc.count 100000 HASH_MAP 100000 avgt ≈ 0 counts
>> HashMapBench.putAllSameKeys 100000 LINKED_HASH_MAP 100000 avgt 8.417 ms/op
>> HashMapBench.putAllSameKeys:gc.alloc.rate 100000 LINKED_HASH_MAP 100000 avgt 992.543 MB/sec
>> HashM...
>
> Joshua Cao has updated the pull request incrementally with one additional commit since the last revision:
>
> extract msize variable
I copy and pasted the text on conservative resizing that was removed in the past as an `@implNote`. I removed the functionality change. Keeping the benchmark in here cause why not.
> give the advice that users can presize the destination map accordingly if they want to avoid resizing when merging in other maps
I don't think there is a public API for this, so omitting from the comments.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/17544#issuecomment-1949481110
More information about the core-libs-dev
mailing list