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