Kind reminder about JDK-8193031
Сергей Цыпанов
sergei.tsypanov at yandex.ru
Mon Jun 24 13:57:56 UTC 2019
> 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
More information about the core-libs-dev
mailing list