RFR: 8332842: Optimize empty CopyOnWriteArrayList allocations

jengebr duke at openjdk.org
Mon Jun 3 19:03:15 UTC 2024


Improve `java/util/concurrent/CopyOnWriteArrayList` by eliminating needless cloning of Object[0] instances. This cloning is intended to prevent callers from changing array contents, but many `CopyOnWriteArrayList`s are allocated to size zero, or are otherwise maintained empty, so cloning is unnecessary.

Results from the included JMH benchmark:
Before:

Benchmark                                                    Mode  Cnt   Score   Error  Units
CopyOnWriteArrayListBenchmark.clear                          avgt    5  74.487 ± 1.793  ns/op
CopyOnWriteArrayListBenchmark.clearEmpty                     avgt    5  27.918 ± 0.759  ns/op
CopyOnWriteArrayListBenchmark.createInstanceArray            avgt    5  16.656 ± 0.375  ns/op
CopyOnWriteArrayListBenchmark.createInstanceArrayEmpty       avgt    5  15.415 ± 0.489  ns/op
CopyOnWriteArrayListBenchmark.createInstanceCollection       avgt    5  21.608 ± 0.363  ns/op
CopyOnWriteArrayListBenchmark.createInstanceCollectionEmpty  avgt    5  15.374 ± 0.260  ns/op
CopyOnWriteArrayListBenchmark.createInstanceDefault          avgt    5  15.688 ± 0.350  ns/op


After:

Benchmark                                                    Mode  Cnt   Score   Error  Units
CopyOnWriteArrayListBenchmark.clear                          avgt    5  75.365 ± 2.092  ns/op
CopyOnWriteArrayListBenchmark.clearEmpty                     avgt    5  20.803 ± 0.539  ns/op
CopyOnWriteArrayListBenchmark.createInstanceArray            avgt    5  16.808 ± 0.582  ns/op
CopyOnWriteArrayListBenchmark.createInstanceArrayEmpty       avgt    5  12.980 ± 0.418  ns/op
CopyOnWriteArrayListBenchmark.createInstanceCollection       avgt    5  21.627 ± 0.173  ns/op
CopyOnWriteArrayListBenchmark.createInstanceCollectionEmpty  avgt    5  12.864 ± 0.408  ns/op
CopyOnWriteArrayListBenchmark.createInstanceDefault          avgt    5  12.931 ± 0.255  ns/op

-------------

Commit messages:
 - Fixing whitespace
 - Removing toArray from benchmark
 - Reverting change to clone()
 - Merge branch 'openjdk:master' into CopyOnWriteArrayList_optimization
 - Adding JMH benchmark
 - Merge branch 'openjdk:master' into CopyOnWriteArrayList_optimization
 - Merge branch 'openjdk:master' into CopyOnWriteArrayList_optimization
 - Revert "Updating copyright yeaer"
 - Merge branch 'openjdk:master' into CopyOnWriteArrayList_optimization
 - Updating copyright yeaer
 - ... and 2 more: https://git.openjdk.org/jdk/compare/9686e804...ea7a0042

Changes: https://git.openjdk.org/jdk/pull/19527/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=19527&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8332842
  Stats: 107 lines in 2 files changed: 104 ins; 0 del; 3 mod
  Patch: https://git.openjdk.org/jdk/pull/19527.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/19527/head:pull/19527

PR: https://git.openjdk.org/jdk/pull/19527


More information about the core-libs-dev mailing list