On Thu, 6 Jun 2024 12:46:36 GMT, jengebr <d...@openjdk.org> wrote:

>> 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
>> CopyOnWriteArrayListBenchmark.readInstance                   avgt   10  
>> 2625.125 ± 71.802  ns/op
>> CopyOnWriteArrayListBenchmark.readInstanceEmpty              avgt   10  
>> 2607.447 ± 46.400  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
>> CopyOnWriteArrayListBenchmark.readInstance                   avgt   10  
>> 2615.500 ± 30.771  ns/op
>> CopyOnWriteArrayListBenchmark.readInstanceEmpty              avgt   10  
>> 2583.892 ± 62.086  ns/op
>
> jengebr has updated the pull request incrementally with one additional commit 
> since the last revision:
> 
>   Adding benchmarks for readObject

Thank you!  I've expanded coverage to remove(int) as well.

> One thing that surprises me is the change to remove(Object) to handle the 
> case where the last remaining element is removed. Does that help the 
> application that prompted this change? Part of me wonders if remove(int) 
> needs to do the same as someone will show up sometime to ask.

The application benefits most from the lower footprint of the empty 
constructors, but I tried to expand the optimization throughout the class.  
Clearly I missed a spot, thank you for catching it.

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

PR Comment: https://git.openjdk.org/jdk/pull/19527#issuecomment-2181366938

Reply via email to