TL; DR en raison de l'architecture informatique moderne, ArrayList
sera considérablement plus efficace pour presque tous les cas d'utilisation possibles - et LinkedList
doit donc être évité, sauf dans certains cas très uniques et extrêmes.
En théorie, LinkedList a un O (1) pour le add(E element)
L'ajout d'un élément au milieu d'une liste devrait également être très efficace.
La pratique est très différente, puisque LinkedList est une structure de cache de données hostiles . Du POV de performance - il y a très peu de cas où les LinkedList
performances pourraient être meilleures que celles compatibles avec le cacheArrayList
.
Voici les résultats d'un test de référence insérant des éléments dans des emplacements aléatoires. Comme vous pouvez le voir - la liste des tableaux est beaucoup plus efficace, bien qu'en théorie chaque insertion au milieu de la liste nécessite de "déplacer" les n derniers éléments du tableau (les valeurs inférieures sont meilleures):
Travailler sur un matériel de dernière génération (caches plus gros et plus efficaces) - les résultats sont encore plus concluants:
LinkedList prend beaucoup plus de temps pour accomplir le même travail. code source source
Il y a deux raisons principales pour cela:
Principalement - que les nœuds du LinkedList
sont dispersés au hasard dans la mémoire. La RAM ("Random Access Memory") n'est pas vraiment aléatoire et des blocs de mémoire doivent être récupérés pour être mis en cache. Cette opération prend du temps, et lorsque ces récupérations se produisent fréquemment - les pages de mémoire dans le cache doivent être remplacées tout le temps -> Le cache manque -> Le cache n'est pas efficace.
ArrayList
les éléments sont stockés dans une mémoire continue, ce qui est exactement ce que l'architecture CPU moderne optimise.
Secondaire LinkedList
requis pour retenir les pointeurs arrière / avant, ce qui signifie 3 fois la consommation de mémoire par valeur stockée par rapport à ArrayList
.
DynamicIntArray , btw, est une mise en œuvre personnalisée d'ArrayList Int
(type primitif) et non des objets - par conséquent, toutes les données sont réellement stockées de manière adjacente - donc encore plus efficace.
Un élément clé à retenir est que le coût de l'extraction d'un bloc de mémoire est plus important que le coût d'accès à une seule cellule de mémoire. C'est pourquoi le lecteur 1 Mo de mémoire séquentielle est jusqu'à 400 fois plus rapide que la lecture de cette quantité de données à partir de différents blocs de mémoire:
Latency Comparison Numbers (~2012)
----------------------------------
L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns 14x L1 cache
Mutex lock/unlock 25 ns
Main memory reference 100 ns 20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy 3,000 ns 3 us
Send 1K bytes over 1 Gbps network 10,000 ns 10 us
Read 4K randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD
Read 1 MB sequentially from memory 250,000 ns 250 us
Round trip within same datacenter 500,000 ns 500 us
Read 1 MB sequentially from SSD* 1,000,000 ns 1,000 us 1 ms ~1GB/sec SSD, 4X memory
Disk seek 10,000,000 ns 10,000 us 10 ms 20x datacenter roundtrip
Read 1 MB sequentially from disk 20,000,000 ns 20,000 us 20 ms 80x memory, 20X SSD
Send packet CA->Netherlands->CA 150,000,000 ns 150,000 us 150 ms
Source: chiffres de latence que chaque programmeur devrait connaître
Juste pour rendre le point encore plus clair, veuillez vérifier la référence de l'ajout d'éléments au début de la liste. C'est un cas d'utilisation où, en théorie, le LinkedList
devrait vraiment briller, et ArrayList
devrait présenter des résultats médiocres ou pire encore:
Remarque: il s'agit d'une référence de la bibliothèque C ++ Std, mais mon expérience précédente a montré que les résultats C ++ et Java sont très similaires. Code source
Copier une masse séquentielle de mémoire est une opération optimisée par les processeurs modernes - changer la théorie et rendre, encore une fois, ArrayList
/ Vector
beaucoup plus efficace
Crédits: Tous les benchmarks publiés ici sont créés par Kjell Hedström . Encore plus de données peuvent être trouvées sur son blog