RFR: 8322149: ConcurrentHashMap copy constructor should not transfer from old table on presizing
Joshua Cao
duke at openjdk.org
Fri Dec 15 01:22:57 UTC 2023
ConcurrentHashMap's copy constructor calls `putAll()` -> `tryPresize()` -> `transfer()`. When coming from the copy constructor, the Map is empty, so there is nothing to transfer. But `transfer()` will still copy all the empty nodes from the old table to the new table.
This patch avoids this work by only calling `tryPresize()` if the table is already initialized. If `table` is null, the initialization is deferred to `putVal()`, which calls `initTable()`.
---
### JMH results for testCopyConstructor
before patch:
Result "org.openjdk.bench.java.util.concurrent.Maps.testCopyConstructor":
937395.686 ±(99.9%) 99074.324 ns/op [Average]
(min, avg, max) = (825732.550, 937395.686, 1072024.041), stdev = 92674.184
CI (99.9%): [838321.362, 1036470.010] (assumes normal distribution)
after patch:
Result "org.openjdk.bench.java.util.concurrent.Maps.testCopyConstructor":
620871.469 ±(99.9%) 59195.406 ns/op [Average]
(min, avg, max) = (545304.633, 620871.469, 689013.573), stdev = 55371.419
CI (99.9%): [561676.063, 680066.875] (assumes normal distribution)
Average time is decreased by about 33%.
-------------
Commit messages:
- 8322149: ConcurrentHashMap copy constructor should not transfer from old table on presizing
Changes: https://git.openjdk.org/jdk/pull/17116/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=17116&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8322149
Stats: 22 lines in 2 files changed: 19 ins; 1 del; 2 mod
Patch: https://git.openjdk.org/jdk/pull/17116.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/17116/head:pull/17116
PR: https://git.openjdk.org/jdk/pull/17116
More information about the core-libs-dev
mailing list