> Perhaps someone should do some more benchmarks. But > that seems like an advantage of using addAll.
Hello, I've done benchmarking for all JDK 12 basic Collections eligeable for post-creation modification. Benchmark is available here: https://github.com/stsypanov/benchmarks/blob/master/benchmark-runners/src/main/java/com/luxoft/logeek/benchmark/collection/CollectionsAddAllVsAddAllBenchmark.java Results are below. Observations: - Collection.addAll massively wins for all cases when collection is array-base - HashSet is the only case where Collections.addAll mostly wins both in memory and time consumed (though only a tiny bit) - COWList.addAll works faster than ArrayList.addAll (surprise to me) I think Martin's original replacement would be enough to win in most of cases. Regards, Sergey Tsypanov Benchmark (collection) (size) Mode Cnt Score Error Units addAll ArrayList 10 avgt 50 48,130 ± 5,660 ns/op addAll ArrayList 100 avgt 50 95,261 ± 2,743 ns/op addAll ArrayList 1000 avgt 50 797,863 ± 53,899 ns/op collectionsAddAll ArrayList 10 avgt 50 45,630 ± 2,244 ns/op collectionsAddAll ArrayList 100 avgt 50 544,830 ± 24,525 ns/op collectionsAddAll ArrayList 1000 avgt 50 4920,385 ± 115,845 ns/op addAll HashSet 10 avgt 50 133,388 ± 6,139 ns/op addAll HashSet 100 avgt 50 1891,604 ± 78,514 ns/op addAll HashSet 1000 avgt 50 17725,842 ± 638,902 ns/op collectionsAddAll HashSet 10 avgt 50 121,797 ± 7,919 ns/op collectionsAddAll HashSet 100 avgt 50 1744,140 ± 105,466 ns/op collectionsAddAll HashSet 1000 avgt 50 17135,886 ± 1091,500 ns/op addAll ArrayDeque 10 avgt 50 42,847 ± 1,285 ns/op addAll ArrayDeque 100 avgt 50 272,476 ± 4,924 ns/op addAll ArrayDeque 1000 avgt 50 2485,607 ± 99,762 ns/op collectionsAddAll ArrayDeque 10 avgt 50 44,048 ± 0,998 ns/op collectionsAddAll ArrayDeque 100 avgt 50 724,373 ± 26,408 ns/op collectionsAddAll ArrayDeque 1000 avgt 50 4270,549 ± 112,438 ns/op addAll CopyOnWriteArrayList 10 avgt 50 22,990 ± 2,547 ns/op addAll CopyOnWriteArrayList 100 avgt 50 37,778 ± 0,174 ns/op addAll CopyOnWriteArrayList 1000 avgt 50 352,620 ± 5,669 ns/op collectionsAddAll CopyOnWriteArrayList 10 avgt 50 248,284 ± 4,588 ns/op collectionsAddAll CopyOnWriteArrayList 100 avgt 50 2952,605 ± 157,642 ns/op collectionsAddAll CopyOnWriteArrayList 1000 avgt 50 195007,626 ± 9350,521 ns/op addAll ConcurrentLinkedDeque 10 avgt 50 70,835 ± 0,680 ns/op addAll ConcurrentLinkedDeque 100 avgt 50 353,693 ± 9,919 ns/op addAll ConcurrentLinkedDeque 1000 avgt 50 3266,551 ± 132,046 ns/op collectionsAddAll ConcurrentLinkedDeque 10 avgt 50 172,823 ± 3,074 ns/op collectionsAddAll ConcurrentLinkedDeque 100 avgt 50 1559,449 ± 25,397 ns/op collectionsAddAll ConcurrentLinkedDeque 1000 avgt 50 16573,979 ± 972,252 ns/op ------------------------------------------------------------------------------------------------------------------------ addAll:·gc.alloc.rate.norm ArrayList 10 avgt 50 136,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm ArrayList 100 avgt 50 856,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm ArrayList 1000 avgt 50 8056,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ArrayList 10 avgt 50 56,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ArrayList 100 avgt 50 1376,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ArrayList 1000 avgt 50 15000,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm HashSet 10 avgt 50 459,200 ± 3,667 B/op addAll:·gc.alloc.rate.norm HashSet 100 avgt 50 5321,600 ± 3,920 B/op addAll:·gc.alloc.rate.norm HashSet 1000 avgt 50 48508,801 ± 3,200 B/op collectionsAddAll:·gc.alloc.rate.norm HashSet 10 avgt 50 464,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm HashSet 100 avgt 50 5328,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm HashSet 1000 avgt 50 48512,001 ± 0,001 B/op addAll:·gc.alloc.rate.norm ArrayDeque 10 avgt 50 112,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm ArrayDeque 100 avgt 50 560,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm ArrayDeque 1000 avgt 50 4160,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ArrayDeque 10 avgt 50 112,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ArrayDeque 100 avgt 50 1048,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ArrayDeque 1000 avgt 50 14928,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm CopyOnWriteArrayList 10 avgt 50 88,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm CopyOnWriteArrayList 100 avgt 50 448,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm CopyOnWriteArrayList 1000 avgt 50 4048,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm CopyOnWriteArrayList 10 avgt 50 456,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm CopyOnWriteArrayList 100 avgt 50 22056,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm CopyOnWriteArrayList 1000 avgt 50 2020056,008 ± 0,001 B/op addAll:·gc.alloc.rate.norm ConcurrentLinkedDeque 10 avgt 50 312,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm ConcurrentLinkedDeque 100 avgt 50 2472,000 ± 0,001 B/op addAll:·gc.alloc.rate.norm ConcurrentLinkedDeque 1000 avgt 50 24072,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ConcurrentLinkedDeque 10 avgt 50 288,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ConcurrentLinkedDeque 100 avgt 50 2448,000 ± 0,001 B/op collectionsAddAll:·gc.alloc.rate.norm ConcurrentLinkedDeque 1000 avgt 50 24048,001 ± 0,001 B/op
