SlideShare a Scribd company logo
1 of 125
Download to read offline
#DVXFR #ListJ9
ArrayList et LinkedList
sont dans un bateau
Qu’est-ce qu’il reste ?
José Paumard
#DVXFR #ListJ9 @JosePaumard
Tout commença…
• Le 22 novembre 2015 par un tweet
#DVXFR #ListJ9 @JosePaumard
Tout commença…
• Puis par une discussion
#DVXFR #ListJ9 @JosePaumard
Tout commença…
• Une trentaine d’échanges plus tard :
#DVXFR #ListJ9 @JosePaumard
Questions ?
#ListJ9
#DVXFR #ListJ9 @JosePaumard
Conclusion de cette discussion
• Le débat ArrayList vs LinkedList n’est pas qu’un troll…
 Même si cela ressemble à de la provoc !
• Y a-t-il une réponse à la question : une des deux
implémentations est-elle meilleure que l’autre ?
 Oui !
#DVXFR #ListJ9 @JosePaumard
Conclusion de cette discussion
• Mais pour arriver à cette réponse, on a besoin de
comprendre beaucoup de choses
#DVXFR #ListJ9 @JosePaumard
Conclusion de cette discussion
• Mais pour arriver à cette réponse, on a besoin de
comprendre beaucoup de choses
• Et une fois que l’on y a répondu (à peu près)
complètement, on a répondu à de nombreuses autres
questions !
#DVXFR #ListJ9 @JosePaumard
1ère partie
• Algorithmique
• Complexité
• Implémentation
• Structure des CPU
• « cache friendly »
• Des slides, des bullet points…
#DVXFR #ListJ9 @JosePaumard
2ème partie
• Implémentation efficace de List et Map (surprise
inside)
• Live coding !
• Quasiment pas de slides
 Mais toujours des bullet points !
#DVXFR #ListJ9 @JosePaumard
Quel point de départ ?
• En fait on peut en trouver plusieurs…
#DVXFR #ListJ9 @JosePaumard
Quel point de départ ?
• En fait on peut en trouver plusieurs…
• L’algorithmique !
#DVXFR #ListJ9 @JosePaumard
Quel point de départ ?
• En fait on peut en trouver plusieurs…
• L’algorithmique !
• L’implémentation sur le CPU
#DVXFR #ListJ9 @JosePaumard
Quel point de départ ?
• En fait on peut en trouver plusieurs…
• L’algorithmique !
• L’implémentation sur le CPU
• L’utilisation…
#DVXFR #ListJ9 @JosePaumard
Que sait-on ?
1) ArrayList est construite sur un tableau
2) LinkedList est construite sur une liste chaînée
On a des résultats là-dessus
#DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
 Ajout d’un élément à la fin / au milieu de la liste
 Effacement d’un élément par son index
 Effacement d’un élément
 Appel à contains()
 Méthode removeIf() et sort()
#DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
List<String> list = ...
list.add("one"); // add
list.add(12, "one"); // insert
#DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
List<String> list = ...
list.remove("one"); // remove
list.remove(12); // remove by index
#DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
List<String> list = ...
list.sort(comparingBy(String::length)); // sort
list.removeIf(s -> s.length() > 10); // remove if
#DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Lecture :
 Itération
 Accès à un élément par son index
 Construction d’un stream
#DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Lecture :
List<String> list = ...
list.forEach(System.out::println); // list traversal
list.get(12); // access by index
list.stream(); // stream creation
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Accès au nème élément : instantané
• Ajout : à peu près gratuit sauf si…
• Insertion : décalage des éléments vers la droite
• Suppression : décalage des éléments vers la gauche
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Accès au nème élément : instantané
n
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Ajout : à peu près gratuit sauf si…
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData, newCapacity);
}
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Ajout : à peu près gratuit sauf si…
• De temps en temps le tableau doit grandir
• On peut fixer à l’avance la taille du tableau
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Insertion
n, one
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Insertion
public void add(int index, E element) {
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Insertion
one
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Suppression
n
X
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Suppression
public E remove(int index) {
E oldValue = elementData(index);
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
return oldValue;
}
#DVXFR #ListJ9 @JosePaumard
ArrayList
• Conclusion (très) partielle
• Accès rapide
• Ajout rapide sauf en cas de dépassement de capacité
• Insertion / suppression aléatoires surcoût du fait de la
« gestion des trous »
#DVXFR #ListJ9 @JosePaumard
LinkedList
• Construit sur liste doublement chaînée
• Accès au nème élément
• Ajout d’un élément en fin de liste
• Insertion
• Suppression
#DVXFR #ListJ9 @JosePaumard
LinkedList
• Structure de base
next prev
item
Node
next prev
item
Node
next prev
item
Node
#DVXFR #ListJ9 @JosePaumard
LinkedList
• Construit sur liste doublement chaînée
• Accès au nème élément : parcourt la liste en comptant
• Ajout : gratuit, jeu de pointeurs
• Insertion : gratuit, jeu de pointeurs
• Suppression : gratuit, jeu de pointeurs
#DVXFR #ListJ9 @JosePaumard
LinkedList
• Accès au nème élément
Node<E> node(int index) {
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
}
// same for last
}
#DVXFR #ListJ9 @JosePaumard
LinkedList
• Accès au nème élément : parcourt la liste en comptant
• On dit que cette opération est « en N »
• Ou en O(n)
#DVXFR #ListJ9 @JosePaumard
Notation O(N)
• Cela signifie que si l’on multiplie par 2 le nombre
d’éléments, le nombre d’opérations à effectuer sera
aussi multiplié par 2
#DVXFR #ListJ9 @JosePaumard
Notation O(N)
• On note la complexité d’un algorithme par O(f(n))
• Exemple : f(n) = n2
#DVXFR #ListJ9 @JosePaumard
Notation O(N)
• On note la complexité d’un algorithme par O(f(n))
• Exemple : f(n) = n2
• En fait, cela signifie que le nombre d’opérations vaut
g(n) = an2 + bn + g
• Et à partir d’une certaine valeur de n
g(n) ~ n2
#DVXFR #ListJ9 @JosePaumard
Notation O(N)
• Sauf que l’on ne fait pas des maths, on traite des
données
• Et pour nos applications, n a une valeur, de même que
a, b et g…
• Il se peut que cela modifie la validité de
l’approximation théorique !
#DVXFR #ListJ9 @JosePaumard
Complexités comparées
log2(n)
1 0
10 3
100 7
1 000 10
1 000 000 20
#DVXFR #ListJ9 @JosePaumard
Complexités comparées
log2(n) n
1 0 1
10 3 10
100 7 100
1 000 10 1 000
1 000 000 20 1 000 000
#DVXFR #ListJ9 @JosePaumard
Complexités comparées
log2(n) n n x log2(n)
1 0 1 0
10 3 10 30
100 7 100 700
1 000 10 1 000 10 000
1 000 000 20 1 000 000 20 000 000
#DVXFR #ListJ9 @JosePaumard
Complexités comparées
log2(n) n n x log2(n) n2
1 0 1 0 1
10 3 10 30 100
100 7 100 700 10 000
1 000 10 1 000 10 000 1 000 000
1 000 000 20 1 000 000 20 000 000 beaucoup
#DVXFR #ListJ9 @JosePaumard
Complexités comparées
« beaucoup » veut dire que sur un CPU, le traitement de
mille milliards d’éléments prend au minimum 20mn
• Besoin de distribuer le calcul sur un grand nombre de
processeurs (au minimum quelques milliers)
 On change d’algorithme
 On sort d’un traitement dans une JVM unique
#DVXFR #ListJ9 @JosePaumard
Complexité des listes
• Sur les opérations de base
ArrayList LinkedList
add(e) 1 1
add(index, e) 1 N
set(index, e) 1 N
remove(index) 1 N
iterator() 1 1
#DVXFR #ListJ9 @JosePaumard
Complexité des listes
• Quelques précautions…
• Prendre en compte les System.arrayCopy() de
ArrayList qui ne sont pas présents dans LinkedList
#DVXFR #ListJ9 @JosePaumard
Complexité des listes
• Quelques précautions…
• Exemple : sur le add(index, e), le
System.arrayCopy() est-il plus coûteux que le
parcours de la moitié de la liste ?
• Y aurait-il d’autres coûts cachés non identifiés ?
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Pour évaluer la performance d’un traitement on utilise
JMH (outil standard Java 9)
• Un bench est une classe annotée
• On génère un JAR « transformé » (Maven)
• On exécute ce JAR, et on a le résultat du bench
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Classe « bench »
@Warmup(iterations=5, time=200, timeUnit=TimeUnit.MILLISECONDS)
@Measurement(iterations=10, time=100, timeUnit=TimeUnit.MILLISECONDS)
@Fork(value=1,
jvmArgsAppend = {"-XX:+UseParallelGC", "-Xms3g", "-Xmx3g"})
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class Bench {
// bench
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Dans le POM, JMH version 1.12
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version> <!-- 1.12 -->
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Dans la classe
@Param({"10", "100", "1000"})
private int size;
@Param({LINKED_LIST, ARRAY_LIST})
private String type;
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Dans la classe
@Setup
public void setup() {
switch(type) {
case ARRAY_LIST :
list = IntStream.range(0, size)
.mapToObj(Integer::toString)
.collect(Collectors.toCollection(
() -> new ArrayList<String>(size)));
break;
// other cases
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Simple add :
 Peut déclencher un System.arrayCopy() sur ArrayList
 Rapide sur LinkedList puisque l’on a un pointeur vers la fin
de la liste
@Benchmark
public boolean simpleAdd() {
return list.add("one more");
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Simple add indexé :
 Déclenche un System.arrayCopy() sur ArrayList
 Lent sur LinkedList qui doit parcourir la liste
@Benchmark
public boolean simpleAdd() {
list.add(size / 2, "one more");
return true;
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Simple Add
LinkedList ArrayList Big ArrayList
10 8,7 ns 5,9 ns 6,2 ns
100 8,2 ns 6,0 ns 5,9 ns
1 000 8,1 ns 6,0 ns 6,0 ns
1 000 000 8,0 ns 5,9 ns 6,8 ns
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Simple Add Indexé
LinkedList ArrayList Big ArrayList
10 30 us 30 us
100 56 ns 30 us 30 us
1 000 831 ns 30 us 30 us
1 000 000 3,78 ms 92 us 92 us
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Index Read :
 Simple lecture en milieu de liste
 On s’attend à ce que LinkedList soit désavantagée
@Benchmark
public boolean indexRead() {
return list.get(size / 2);
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Index Set :
 Écriture en milieu de liste
 On s’attend encore à ce que LinkedList soit désavantagée
@Benchmark
public boolean indexSet() {
return list.set(size / 2, "one more");
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Index Read
LinkedList ArrayList
10 28 ns 16 ns
100 196 ns 16 ns
1 000 3 us 16 ns
1 000 000 9,3 ms 16 ns
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Index Set
LinkedList ArrayList
10 30 ns 20 ns
100 173 ns 19 ns
1 000 3 us 18 ns
1 000 000 8,9 ms 19 ns
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Itération :
 Itération sur la totalité de la liste
 Pattern iterator / pattern stream
@Benchmark
public long iterate() {
long sum = 0;
for (String s : list) {
sum += s.length();
}
return sum;
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Itération :
 Itération sur la totalité de la liste
 Pattern iterator / pattern stream
@Benchmark
public long streamSum() {
return list.stream()
.mapToLong(String::length)
.sum();
}
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
LinkedList ArrayList
10 84 ns 65 ns
100 647 ns 429 ns
1 000 10,4 us 4,86 us
1 000 000 18,8 ms 9,1 ms
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Stream
LinkedList ArrayList
10 56 ns 53 ns
100 228 ns 154 ns
1 000 2,87 us 1,46 us
1 000 000 6,16 ms 3,77 ms
#DVXFR #ListJ9 @JosePaumard
Le cas de removeIf() et sort()
• Direction le code
#DVXFR #ListJ9 @JosePaumard
Conclusion (partielle)
• Le surcoût de System.arrayCopy() n’est pas très
handicapant
 Et en organisant son code, on peut le maîtriser
• Cela dit, on a toujours une différence de performance
non négligeable qu’il faut expliquer
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
• Les CPU multicœurs ne fonctionnent pas n’importe
comment…
• Entre la mémoire centrale et l’unité de calcul se
trouvent 3 niveaux de cache, et des registres
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
Core 1
Temps d’accès aux
registres < 1ns
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
Core 1
L1
Temps d’accès aux
registres < 1ns
Temps d’accès ~1ns
32kO data / code
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
Core 1
L1
Temps d’accès aux
registres < 1ns
Temps d’accès ~1ns
32kO data / code
L2
Temps d’accès ~3ns
256 kO
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
Core 1
L1
L2
Core N
L1
L2
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
Core 1
L1
L2
L3 (~12ns)
Core N
L1
L2
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
C 1
L1
L2
L3
C N
L1
L2
C 1
L1
L2
L3
C N
L1
L2
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
C 1
L1
L2
L3
QPI
C N
L1
L2
C 1
L1
L2
L3
QPI
C N
L1
L2
~40 ns
#DVXFR #ListJ9 @JosePaumard
Structure des CPU
C 1
L1
L2
L3
QPI
DRAM (~65 ns)
C N
L1
L2
C 1
L1
L2
L3
QPI
C N
L1
L2
~40 ns
#DVXFR #ListJ9 @JosePaumard
Donc…
• Il ne suffit pas de programmer des algorithmes
performants…
• Encore faut-il qu’ils soient adaptés à cette structure !
#DVXFR #ListJ9 @JosePaumard
Donc…
• Il ne suffit pas de programmer des traitements
performants…
• Encore faut-il qu’ils soient adaptés à cette structure !
• Ce qui fait la rapidité d’un traitement, c’est sa capacité
à transférer ses données dans le cache L1 le plus vite
possible
#DVXFR #ListJ9 @JosePaumard
L’ennemi c’est le cache miss !
• Cache miss = le CPU a besoin d’une donnée qui ne se
trouve pas dans le cache L1, il faut donc aller la
chercher
• Un cache miss peut représenter un retard d’environ
500 instructions
#DVXFR #ListJ9 @JosePaumard
Structure du cache L1
• Le cache L1 est organisé en lignes de 8 long
• Les transferts entre caches et avec la mémoire se font
ligne par ligne
• Et c’est là que se fait la différence entre ArrayList et
LinkedList…
#DVXFR #ListJ9 @JosePaumard
Transfert d’une liste dans L1
• Le transfert d’une ArrayList dans le cache L1 peut se
faire 8 fois plus vite que pour une LinkedList
• Car les éléments d’une ArrayList sont rangés dans
une zone contiguë de la mémoire
• Alors que les nœuds de LinkedList sont distribués
aléatoirement…
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Le pointer chasing (chasse aux pointeurs) peut tuer les
performances d’un traitement
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
int[] tab = {1, 2, 3, 4, 5};
Integer[] tab = {1, 2, 3, 4, 5};
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
int[] tab = {1, 2, 3, 4, 5};
Integer[] tab = {1, 2, 3, 4, 5};
1 2 3 4 5
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
int[] tab = {1, 2, 3, 4, 5};
Integer[] tab = {1, 2, 3, 4, 5};
1 2 3 4 5
    
1
2
4
5
3
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
public class Point {
Integer x, y;
}
List<Point> points = new ArrayList<>();
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
public class Point {
Integer x, y;
}
List<Point> points = new ArrayList<>();





x
y
1
2
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
• Un traitement sur une telle structure va passer son
temps à suivre des pointeurs…
public class Point {
Integer x, y;
}
List<Point> points = new ArrayList<>();





x
1
2y
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Clairement, LinkedList n’est pas adaptée à la
structure des CPU
• Structure « cache friendly »
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Autre exemple : HashMap
 Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Autre exemple : HashMap
 Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
key
value
#DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Autre exemple : HashMap
 Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
key
value
12
« twelve »
#DVXFR #ListJ9 @JosePaumard
• Autre exemple : HashMap
 Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
Pointer chasing
key
value
12
« twelve »



#DVXFR #ListJ9 @JosePaumard
• Autre exemple : HashMap
 Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
• Idem pour HashSet…
Pointer chasing
key
value
12
« twelve »



#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
HashSet ArrayList
10 142 ns 65 ns
100 1,27 us 429 ns
1 000 19,9 us 4,86 us
1 000 000 41,0 ms 9,1 ms
#DVXFR #ListJ9 @JosePaumard
Des alternatives ?
• Dans le futur : List<int> !
 Projet Valhalla :
http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/
#DVXFR #ListJ9 @JosePaumard
Des alternatives ?
• Dans le présent :
 Eclipse Collections (prev. GS Collections)
 HPPC
 Koloboke
 Trove
http://java-performance.info/hashmap-overview-jdk-fastutil-
goldman-sachs-hppc-koloboke-trove-january-2015/
#DVXFR #ListJ9 @JosePaumard
List sans objet ?
• Construire des implémentations de Set / List / Map
sans pointer chasing ?
#DVXFR #ListJ9 @JosePaumard
List sans objet ?
• Construire des implémentations de Set / List / Map
sans pointer chasing ?
• Comme le pointer chasing vient du fait que l’on utilise
des objets, peut-on les éliminer de ces
implémentations ?
#DVXFR #ListJ9
Questions et Réponses
(peut-être…)
José Paumard
#DVXFR #ListJ9
ArrayList et LinkedList
sont dans un bateau
… et sont tombées à l’eau !
José Paumard
#DVXFR #ListJ9 @JosePaumard
Que veut-on faire ?
• Point de départ : Java 9 !
• Question : comment créer une liste préremplie en
Java ?
• Réponse : ce n’est pas si simple !
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Jusqu’en Java 8 (syntaxe à moustaches) :
• Et si l’on veut avoir une table immutable
(unmodifiable), il faut le faire en deux temps…
Map<Integer, String> map = new HashMap<Integer, String>() {{
put(1, "one") ;
put(2, "two") ;
put(3, "three") ;
}} ;
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Nouveaux patterns pour les listes et sets :
 Sont immutables
 Éléments nuls non autorisés
 Les Set jettent une IllegalArgumentException en cas de
doublon
 Serializable…
List<Integer> list = List.of(1, 2, 3) ;
Set<Integer> set = Set.of(1, 2, 3) ;
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Nouveaux patterns pour les listes et sets :
• Mais elles sont aussi…
 À itérations aléatoires
 Avec des implémentations optimisées !
List<Integer> list = List.of(1, 2, 3) ;
Set<Integer> set = Set.of(1, 2, 3) ;
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Implémentations optimisées :
public static List<E> of(E e1);
public static List<E> of(E e1, E e2);
public static List<E> of(E e1, E e2, E e3);
public static List<E> of(E e1, E e2, E e3, E e4);
...
public static List<E> of(E... e);
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Cas de Map
public static Map<K, V> of(K key1, V value1);
public static Map<K, V> of(K key1, V value1, K key2, V value2);
...
public static Map<K, V> of(K... K, V... v);
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Cas de Map
 Jette une exception en cas de clé dupliquée, pourquoi ?
public static Map<K, V> of(K key1, V value1);
public static Map<K, V> of(K key1, V value1, K key2, V value2);
...
public static Map<K, V> of(K... K, V... v);
public static Entry<K, V> of(K key, V value);
public static Map<K, V> ofEntries(Entry... e);
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
Map<String, TokenType> tokens =
Map.ofEntries(
entry("for", KEYWORD),
entry("while", KEYWORD),
entry("do", KEYWORD),
entry("break", KEYWORD),
entry(":", COLON),
entry("+", PLUS),
entry("--‐", MINUS),
entry(">", GREATER),
entry("<", LESS),
entry(":", PAAMAYIM_NEKUDOTAYIM),
entry("(", LPAREN),
entry(")", RPAREN)
); @ Stuart Mark
#DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
Map<String, TokenType> tokens =
Map.ofEntries(
entry("for", KEYWORD),
entry("while", KEYWORD),
entry("do", KEYWORD),
entry("break", KEYWORD),
entry(":", COLON),
entry("+", PLUS),
entry("--‐", MINUS),
entry(">", GREATER),
entry("<", LESS),
entry(":", PAAMAYIM_NEKUDOTAYIM),
entry("(", LPAREN),
entry(")", RPAREN)
); @ Stuart Mark
#DVXFR #ListJ9 @JosePaumard
Que veut-on faire ?
• Question : comment construire une implémentation
optimisée d’une liste à 1 ou 2 éléments ?
• Set, List et Map (et Map.Entry)
• Si possible optimale, en minimisant le pointer chasing
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Index Read
ArrayList SingletonList TwoElementList
1 3,5 ns 2,7 ns
2 2,9 ns 2,6 ns
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
ArrayList SingletonList TwoElementList
1 4,7 ns 2,3 ns
2 6,5 ns 3,4 ns
#DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
HashSet SingletonSet TwoElementSet
1 7,3 ns 2,3 ns
2 9,5 ns 3,5 ns
#DVXFR #ListJ9 @JosePaumard
Conclusion
• Les lambdas peuvent être utilisées dans des contextes
un peu inattendus…
• Repérer les classes qui dépendent d’une unique
méthode
• Idem en conception de nouvelles applications
• Cf la présentation de Rémi Forax :
Implémenter le GoF avec des lambda
#DVXFR #ListJ9 @JosePaumard
Conclusion
• On n’a pas fini de digérer les lambdas en Java !
#DVXFR #ListJ9
José Paumard
#DVXFR #ListJ9
Questions et Réponses
(si on a le temps…)
José Paumard
#DVXFR #ListJ9
ArrayList et LinkedList
sont dans un bateau
… et c’est l’heure d’aller déjeuner !
José Paumard

More Related Content

What's hot

Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soatSOAT
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RLaurent Beauguitte
 
Plutniak maisonobe r esto atelier1-introduction
Plutniak maisonobe r esto atelier1-introductionPlutniak maisonobe r esto atelier1-introduction
Plutniak maisonobe r esto atelier1-introductionMarion Maisonobe
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Yannick Chartois
 
Apprendre Solr en deux heures
Apprendre Solr en deux heuresApprendre Solr en deux heures
Apprendre Solr en deux heuresSaïd Radhouani
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDidier Plaindoux
 

What's hot (12)

Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Python
PythonPython
Python
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec R
 
Programmation Fonctionnelle
Programmation FonctionnelleProgrammation Fonctionnelle
Programmation Fonctionnelle
 
Solr formation Sparna
Solr formation SparnaSolr formation Sparna
Solr formation Sparna
 
Plutniak maisonobe r esto atelier1-introduction
Plutniak maisonobe r esto atelier1-introductionPlutniak maisonobe r esto atelier1-introduction
Plutniak maisonobe r esto atelier1-introduction
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8
 
Initiation r
Initiation rInitiation r
Initiation r
 
Apprendre Solr en deux heures
Apprendre Solr en deux heuresApprendre Solr en deux heures
Apprendre Solr en deux heures
 
RDFS : une introduction
RDFS : une introductionRDFS : une introduction
RDFS : une introduction
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvements
 

Viewers also liked

Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full storyJosé Paumard
 
50 new things we can do with Java 8
50 new things we can do with Java 850 new things we can do with Java 8
50 new things we can do with Java 8José Paumard
 
Java SE 8 for Java EE developers
Java SE 8 for Java EE developersJava SE 8 for Java EE developers
Java SE 8 for Java EE developersJosé Paumard
 
JFokus 50 new things with java 8
JFokus 50 new things with java 8JFokus 50 new things with java 8
JFokus 50 new things with java 8José Paumard
 
API Asynchrones en Java 8
API Asynchrones en Java 8API Asynchrones en Java 8
API Asynchrones en Java 8José Paumard
 
Going reactive in java
Going reactive in javaGoing reactive in java
Going reactive in javaJosé Paumard
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJosé Paumard
 
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJosé Paumard
 
OutOfMemoryError : quel est le coût des objets en java
OutOfMemoryError : quel est le coût des objets en javaOutOfMemoryError : quel est le coût des objets en java
OutOfMemoryError : quel est le coût des objets en javaJean-Philippe BEMPEL
 
Java ArrayList Video Tutorial
Java ArrayList Video TutorialJava ArrayList Video Tutorial
Java ArrayList Video TutorialMarcus Biel
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureJosé Paumard
 
Array vs array list
Array vs array listArray vs array list
Array vs array listRavi Shetye
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014José Paumard
 
HighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsHighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsAlexey Kharlamov
 
Hazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSHazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSuzquiano
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for RubyistsMike North
 
Async Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляAsync Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляVitebsk Miniq
 
Алексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsАлексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsNata_Churda
 

Viewers also liked (20)

Free your lambdas
Free your lambdasFree your lambdas
Free your lambdas
 
Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full story
 
50 new things we can do with Java 8
50 new things we can do with Java 850 new things we can do with Java 8
50 new things we can do with Java 8
 
Java SE 8 for Java EE developers
Java SE 8 for Java EE developersJava SE 8 for Java EE developers
Java SE 8 for Java EE developers
 
JFokus 50 new things with java 8
JFokus 50 new things with java 8JFokus 50 new things with java 8
JFokus 50 new things with java 8
 
API Asynchrones en Java 8
API Asynchrones en Java 8API Asynchrones en Java 8
API Asynchrones en Java 8
 
Going reactive in java
Going reactive in javaGoing reactive in java
Going reactive in java
 
Java 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava ComparisonJava 8 Stream API and RxJava Comparison
Java 8 Stream API and RxJava Comparison
 
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelization
 
OutOfMemoryError : quel est le coût des objets en java
OutOfMemoryError : quel est le coût des objets en javaOutOfMemoryError : quel est le coût des objets en java
OutOfMemoryError : quel est le coût des objets en java
 
Java ArrayList Video Tutorial
Java ArrayList Video TutorialJava ArrayList Video Tutorial
Java ArrayList Video Tutorial
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans Azure
 
Array vs array list
Array vs array listArray vs array list
Array vs array list
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014
 
Devoxx
DevoxxDevoxx
Devoxx
 
HighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data GridsHighLoad++ 2009 In-Memory Data Grids
HighLoad++ 2009 In-Memory Data Grids
 
Hazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMSHazelcast and MongoDB at Cloud CMS
Hazelcast and MongoDB at Cloud CMS
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for Rubyists
 
Async Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуляAsync Gateway или Разработка системы распределенных вычислений с нуля
Async Gateway или Разработка системы распределенных вычислений с нуля
 
Алексей Николаенков, Devexperts
Алексей Николаенков, DevexpertsАлексей Николаенков, Devexperts
Алексей Николаенков, Devexperts
 

Similar to ArrayList et LinkedList sont dans un bateau

Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdfOuailChoukhairi
 
mis
mismis
misISIG
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5halleck45
 
condition et boucle (2).pptx
condition et boucle  (2).pptxcondition et boucle  (2).pptx
condition et boucle (2).pptxMohammedErritali2
 
Introduction au langage python notion de base
Introduction au langage python notion de baseIntroduction au langage python notion de base
Introduction au langage python notion de basemohamedAitomar1
 
Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)mohamedAitomar1
 
Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018salah fenni
 
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Duyhai Doan
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelleGeeks Anonymes
 

Similar to ArrayList et LinkedList sont dans un bateau (20)

Data Mining (Partie 2).pdf
Data Mining (Partie 2).pdfData Mining (Partie 2).pdf
Data Mining (Partie 2).pdf
 
mis
mismis
mis
 
Une Introduction à R
Une Introduction à RUne Introduction à R
Une Introduction à R
 
algo-imsi-2.pdf
algo-imsi-2.pdfalgo-imsi-2.pdf
algo-imsi-2.pdf
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
Theme 7
Theme 7Theme 7
Theme 7
 
Ruby Pour RoR
Ruby Pour RoRRuby Pour RoR
Ruby Pour RoR
 
condition et boucle (2).pptx
condition et boucle  (2).pptxcondition et boucle  (2).pptx
condition et boucle (2).pptx
 
coursAlg.ppt
coursAlg.pptcoursAlg.ppt
coursAlg.ppt
 
ALF 11 - WebAssembly
ALF 11 - WebAssemblyALF 11 - WebAssembly
ALF 11 - WebAssembly
 
Introduction au langage python notion de base
Introduction au langage python notion de baseIntroduction au langage python notion de base
Introduction au langage python notion de base
 
Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)Introduction au langage python (Notion de base)
Introduction au langage python (Notion de base)
 
Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018
 
cours algorithme
cours algorithmecours algorithme
cours algorithme
 
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Programmation fonctionnelle
Programmation fonctionnelleProgrammation fonctionnelle
Programmation fonctionnelle
 
Présentation de data.table
Présentation de data.tablePrésentation de data.table
Présentation de data.table
 
Rapport Projet Module Complexité
Rapport Projet Module ComplexitéRapport Projet Module Complexité
Rapport Projet Module Complexité
 

More from José Paumard

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19José Paumard
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfJosé Paumard
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingJosé Paumard
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKJosé Paumard
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternJosé Paumard
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapesJosé Paumard
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!José Paumard
 
Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2José Paumard
 
Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1José Paumard
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowJosé Paumard
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the WildJosé Paumard
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJosé Paumard
 
Asynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureAsynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureJosé Paumard
 

More from José Paumard (20)

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdf
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern Matching
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UK
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patterns
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor Pattern
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapes
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!
 
Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2
 
Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn Flow
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the Wild
 
Streams in the wild
Streams in the wildStreams in the wild
Streams in the wild
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
 
Free your lambdas
Free your lambdasFree your lambdas
Free your lambdas
 
Asynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureAsynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFuture
 

Recently uploaded

Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .Txaruka
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsRajiAbdelghani
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Alain Marois
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETMedBechir
 
PIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfPIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfRiDaHAziz
 
PIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfPIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfRiDaHAziz
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Gilles Le Page
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSKennel
 
Cours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationCours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationpapediallo3
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSKennel
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...Faga1939
 
Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre françaisTxaruka
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 37
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSKennel
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETMedBechir
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 37
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeXL Groupe
 

Recently uploaded (20)

Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 temps
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
 
PIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfPIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdf
 
PIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfPIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdf
 
DO PALÁCIO À ASSEMBLEIA .
DO PALÁCIO À ASSEMBLEIA                 .DO PALÁCIO À ASSEMBLEIA                 .
DO PALÁCIO À ASSEMBLEIA .
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
 
Cours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationCours de Management des Systèmes d'information
Cours de Management des Systèmes d'information
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
 
Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre français
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSET
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directe
 

ArrayList et LinkedList sont dans un bateau

  • 1. #DVXFR #ListJ9 ArrayList et LinkedList sont dans un bateau Qu’est-ce qu’il reste ? José Paumard
  • 2. #DVXFR #ListJ9 @JosePaumard Tout commença… • Le 22 novembre 2015 par un tweet
  • 3. #DVXFR #ListJ9 @JosePaumard Tout commença… • Puis par une discussion
  • 4. #DVXFR #ListJ9 @JosePaumard Tout commença… • Une trentaine d’échanges plus tard :
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 12. #DVXFR #ListJ9 @JosePaumard Conclusion de cette discussion • Le débat ArrayList vs LinkedList n’est pas qu’un troll…  Même si cela ressemble à de la provoc ! • Y a-t-il une réponse à la question : une des deux implémentations est-elle meilleure que l’autre ?  Oui !
  • 13. #DVXFR #ListJ9 @JosePaumard Conclusion de cette discussion • Mais pour arriver à cette réponse, on a besoin de comprendre beaucoup de choses
  • 14. #DVXFR #ListJ9 @JosePaumard Conclusion de cette discussion • Mais pour arriver à cette réponse, on a besoin de comprendre beaucoup de choses • Et une fois que l’on y a répondu (à peu près) complètement, on a répondu à de nombreuses autres questions !
  • 15. #DVXFR #ListJ9 @JosePaumard 1ère partie • Algorithmique • Complexité • Implémentation • Structure des CPU • « cache friendly » • Des slides, des bullet points…
  • 16. #DVXFR #ListJ9 @JosePaumard 2ème partie • Implémentation efficace de List et Map (surprise inside) • Live coding ! • Quasiment pas de slides  Mais toujours des bullet points !
  • 17. #DVXFR #ListJ9 @JosePaumard Quel point de départ ? • En fait on peut en trouver plusieurs…
  • 18. #DVXFR #ListJ9 @JosePaumard Quel point de départ ? • En fait on peut en trouver plusieurs… • L’algorithmique !
  • 19. #DVXFR #ListJ9 @JosePaumard Quel point de départ ? • En fait on peut en trouver plusieurs… • L’algorithmique ! • L’implémentation sur le CPU
  • 20. #DVXFR #ListJ9 @JosePaumard Quel point de départ ? • En fait on peut en trouver plusieurs… • L’algorithmique ! • L’implémentation sur le CPU • L’utilisation…
  • 21. #DVXFR #ListJ9 @JosePaumard Que sait-on ? 1) ArrayList est construite sur un tableau 2) LinkedList est construite sur une liste chaînée On a des résultats là-dessus
  • 22. #DVXFR #ListJ9 @JosePaumard Approche • Examiner les opérations élémentaires sur les listes • Création / modification :  Ajout d’un élément à la fin / au milieu de la liste  Effacement d’un élément par son index  Effacement d’un élément  Appel à contains()  Méthode removeIf() et sort()
  • 23. #DVXFR #ListJ9 @JosePaumard Approche • Examiner les opérations élémentaires sur les listes • Création / modification : List<String> list = ... list.add("one"); // add list.add(12, "one"); // insert
  • 24. #DVXFR #ListJ9 @JosePaumard Approche • Examiner les opérations élémentaires sur les listes • Création / modification : List<String> list = ... list.remove("one"); // remove list.remove(12); // remove by index
  • 25. #DVXFR #ListJ9 @JosePaumard Approche • Examiner les opérations élémentaires sur les listes • Création / modification : List<String> list = ... list.sort(comparingBy(String::length)); // sort list.removeIf(s -> s.length() > 10); // remove if
  • 26. #DVXFR #ListJ9 @JosePaumard Approche • Examiner les opérations élémentaires sur les listes • Lecture :  Itération  Accès à un élément par son index  Construction d’un stream
  • 27. #DVXFR #ListJ9 @JosePaumard Approche • Examiner les opérations élémentaires sur les listes • Lecture : List<String> list = ... list.forEach(System.out::println); // list traversal list.get(12); // access by index list.stream(); // stream creation
  • 28. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Accès au nème élément : instantané • Ajout : à peu près gratuit sauf si… • Insertion : décalage des éléments vers la droite • Suppression : décalage des éléments vers la gauche
  • 29. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Accès au nème élément : instantané n
  • 30. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Ajout : à peu près gratuit sauf si… private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); elementData = Arrays.copyOf(elementData, newCapacity); }
  • 31. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Ajout : à peu près gratuit sauf si… • De temps en temps le tableau doit grandir • On peut fixer à l’avance la taille du tableau
  • 32. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Insertion n, one
  • 33. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Insertion public void add(int index, E element) { System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
  • 34. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Insertion one
  • 35. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Suppression n X
  • 36. #DVXFR #ListJ9 @JosePaumard ArrayList • Construit sur un tableau • Suppression public E remove(int index) { E oldValue = elementData(index); System.arraycopy(elementData, index+1, elementData, index, numMoved); return oldValue; }
  • 37. #DVXFR #ListJ9 @JosePaumard ArrayList • Conclusion (très) partielle • Accès rapide • Ajout rapide sauf en cas de dépassement de capacité • Insertion / suppression aléatoires surcoût du fait de la « gestion des trous »
  • 38. #DVXFR #ListJ9 @JosePaumard LinkedList • Construit sur liste doublement chaînée • Accès au nème élément • Ajout d’un élément en fin de liste • Insertion • Suppression
  • 39. #DVXFR #ListJ9 @JosePaumard LinkedList • Structure de base next prev item Node next prev item Node next prev item Node
  • 40. #DVXFR #ListJ9 @JosePaumard LinkedList • Construit sur liste doublement chaînée • Accès au nème élément : parcourt la liste en comptant • Ajout : gratuit, jeu de pointeurs • Insertion : gratuit, jeu de pointeurs • Suppression : gratuit, jeu de pointeurs
  • 41. #DVXFR #ListJ9 @JosePaumard LinkedList • Accès au nème élément Node<E> node(int index) { if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } // same for last }
  • 42. #DVXFR #ListJ9 @JosePaumard LinkedList • Accès au nème élément : parcourt la liste en comptant • On dit que cette opération est « en N » • Ou en O(n)
  • 43. #DVXFR #ListJ9 @JosePaumard Notation O(N) • Cela signifie que si l’on multiplie par 2 le nombre d’éléments, le nombre d’opérations à effectuer sera aussi multiplié par 2
  • 44. #DVXFR #ListJ9 @JosePaumard Notation O(N) • On note la complexité d’un algorithme par O(f(n)) • Exemple : f(n) = n2
  • 45. #DVXFR #ListJ9 @JosePaumard Notation O(N) • On note la complexité d’un algorithme par O(f(n)) • Exemple : f(n) = n2 • En fait, cela signifie que le nombre d’opérations vaut g(n) = an2 + bn + g • Et à partir d’une certaine valeur de n g(n) ~ n2
  • 46. #DVXFR #ListJ9 @JosePaumard Notation O(N) • Sauf que l’on ne fait pas des maths, on traite des données • Et pour nos applications, n a une valeur, de même que a, b et g… • Il se peut que cela modifie la validité de l’approximation théorique !
  • 47. #DVXFR #ListJ9 @JosePaumard Complexités comparées log2(n) 1 0 10 3 100 7 1 000 10 1 000 000 20
  • 48. #DVXFR #ListJ9 @JosePaumard Complexités comparées log2(n) n 1 0 1 10 3 10 100 7 100 1 000 10 1 000 1 000 000 20 1 000 000
  • 49. #DVXFR #ListJ9 @JosePaumard Complexités comparées log2(n) n n x log2(n) 1 0 1 0 10 3 10 30 100 7 100 700 1 000 10 1 000 10 000 1 000 000 20 1 000 000 20 000 000
  • 50. #DVXFR #ListJ9 @JosePaumard Complexités comparées log2(n) n n x log2(n) n2 1 0 1 0 1 10 3 10 30 100 100 7 100 700 10 000 1 000 10 1 000 10 000 1 000 000 1 000 000 20 1 000 000 20 000 000 beaucoup
  • 51. #DVXFR #ListJ9 @JosePaumard Complexités comparées « beaucoup » veut dire que sur un CPU, le traitement de mille milliards d’éléments prend au minimum 20mn • Besoin de distribuer le calcul sur un grand nombre de processeurs (au minimum quelques milliers)  On change d’algorithme  On sort d’un traitement dans une JVM unique
  • 52. #DVXFR #ListJ9 @JosePaumard Complexité des listes • Sur les opérations de base ArrayList LinkedList add(e) 1 1 add(index, e) 1 N set(index, e) 1 N remove(index) 1 N iterator() 1 1
  • 53. #DVXFR #ListJ9 @JosePaumard Complexité des listes • Quelques précautions… • Prendre en compte les System.arrayCopy() de ArrayList qui ne sont pas présents dans LinkedList
  • 54. #DVXFR #ListJ9 @JosePaumard Complexité des listes • Quelques précautions… • Exemple : sur le add(index, e), le System.arrayCopy() est-il plus coûteux que le parcours de la moitié de la liste ? • Y aurait-il d’autres coûts cachés non identifiés ?
  • 55. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Pour évaluer la performance d’un traitement on utilise JMH (outil standard Java 9) • Un bench est une classe annotée • On génère un JAR « transformé » (Maven) • On exécute ce JAR, et on a le résultat du bench
  • 56. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Classe « bench » @Warmup(iterations=5, time=200, timeUnit=TimeUnit.MILLISECONDS) @Measurement(iterations=10, time=100, timeUnit=TimeUnit.MILLISECONDS) @Fork(value=1, jvmArgsAppend = {"-XX:+UseParallelGC", "-Xms3g", "-Xmx3g"}) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @State(Scope.Benchmark) public class Bench { // bench }
  • 57. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Dans le POM, JMH version 1.12 <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>${jmh.version}</version> <!-- 1.12 --> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>${jmh.version}</version> <scope>provided</scope> </dependency>
  • 58. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Dans la classe @Param({"10", "100", "1000"}) private int size; @Param({LINKED_LIST, ARRAY_LIST}) private String type;
  • 59. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Dans la classe @Setup public void setup() { switch(type) { case ARRAY_LIST : list = IntStream.range(0, size) .mapToObj(Integer::toString) .collect(Collectors.toCollection( () -> new ArrayList<String>(size))); break; // other cases }
  • 60. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Simple add :  Peut déclencher un System.arrayCopy() sur ArrayList  Rapide sur LinkedList puisque l’on a un pointeur vers la fin de la liste @Benchmark public boolean simpleAdd() { return list.add("one more"); }
  • 61. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Simple add indexé :  Déclenche un System.arrayCopy() sur ArrayList  Lent sur LinkedList qui doit parcourir la liste @Benchmark public boolean simpleAdd() { list.add(size / 2, "one more"); return true; }
  • 62. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Simple Add LinkedList ArrayList Big ArrayList 10 8,7 ns 5,9 ns 6,2 ns 100 8,2 ns 6,0 ns 5,9 ns 1 000 8,1 ns 6,0 ns 6,0 ns 1 000 000 8,0 ns 5,9 ns 6,8 ns
  • 63. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Simple Add Indexé LinkedList ArrayList Big ArrayList 10 30 us 30 us 100 56 ns 30 us 30 us 1 000 831 ns 30 us 30 us 1 000 000 3,78 ms 92 us 92 us
  • 64. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Index Read :  Simple lecture en milieu de liste  On s’attend à ce que LinkedList soit désavantagée @Benchmark public boolean indexRead() { return list.get(size / 2); }
  • 65. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Index Set :  Écriture en milieu de liste  On s’attend encore à ce que LinkedList soit désavantagée @Benchmark public boolean indexSet() { return list.set(size / 2, "one more"); }
  • 66. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Index Read LinkedList ArrayList 10 28 ns 16 ns 100 196 ns 16 ns 1 000 3 us 16 ns 1 000 000 9,3 ms 16 ns
  • 67. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Index Set LinkedList ArrayList 10 30 ns 20 ns 100 173 ns 19 ns 1 000 3 us 18 ns 1 000 000 8,9 ms 19 ns
  • 68. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Itération :  Itération sur la totalité de la liste  Pattern iterator / pattern stream @Benchmark public long iterate() { long sum = 0; for (String s : list) { sum += s.length(); } return sum; }
  • 69. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Itération :  Itération sur la totalité de la liste  Pattern iterator / pattern stream @Benchmark public long streamSum() { return list.stream() .mapToLong(String::length) .sum(); }
  • 70. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Iterate LinkedList ArrayList 10 84 ns 65 ns 100 647 ns 429 ns 1 000 10,4 us 4,86 us 1 000 000 18,8 ms 9,1 ms
  • 71. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Stream LinkedList ArrayList 10 56 ns 53 ns 100 228 ns 154 ns 1 000 2,87 us 1,46 us 1 000 000 6,16 ms 3,77 ms
  • 72. #DVXFR #ListJ9 @JosePaumard Le cas de removeIf() et sort() • Direction le code
  • 73. #DVXFR #ListJ9 @JosePaumard Conclusion (partielle) • Le surcoût de System.arrayCopy() n’est pas très handicapant  Et en organisant son code, on peut le maîtriser • Cela dit, on a toujours une différence de performance non négligeable qu’il faut expliquer
  • 74. #DVXFR #ListJ9 @JosePaumard Structure des CPU • Les CPU multicœurs ne fonctionnent pas n’importe comment… • Entre la mémoire centrale et l’unité de calcul se trouvent 3 niveaux de cache, et des registres
  • 75. #DVXFR #ListJ9 @JosePaumard Structure des CPU Core 1 Temps d’accès aux registres < 1ns
  • 76. #DVXFR #ListJ9 @JosePaumard Structure des CPU Core 1 L1 Temps d’accès aux registres < 1ns Temps d’accès ~1ns 32kO data / code
  • 77. #DVXFR #ListJ9 @JosePaumard Structure des CPU Core 1 L1 Temps d’accès aux registres < 1ns Temps d’accès ~1ns 32kO data / code L2 Temps d’accès ~3ns 256 kO
  • 78. #DVXFR #ListJ9 @JosePaumard Structure des CPU Core 1 L1 L2 Core N L1 L2
  • 79. #DVXFR #ListJ9 @JosePaumard Structure des CPU Core 1 L1 L2 L3 (~12ns) Core N L1 L2
  • 80. #DVXFR #ListJ9 @JosePaumard Structure des CPU C 1 L1 L2 L3 C N L1 L2 C 1 L1 L2 L3 C N L1 L2
  • 81. #DVXFR #ListJ9 @JosePaumard Structure des CPU C 1 L1 L2 L3 QPI C N L1 L2 C 1 L1 L2 L3 QPI C N L1 L2 ~40 ns
  • 82. #DVXFR #ListJ9 @JosePaumard Structure des CPU C 1 L1 L2 L3 QPI DRAM (~65 ns) C N L1 L2 C 1 L1 L2 L3 QPI C N L1 L2 ~40 ns
  • 83. #DVXFR #ListJ9 @JosePaumard Donc… • Il ne suffit pas de programmer des algorithmes performants… • Encore faut-il qu’ils soient adaptés à cette structure !
  • 84. #DVXFR #ListJ9 @JosePaumard Donc… • Il ne suffit pas de programmer des traitements performants… • Encore faut-il qu’ils soient adaptés à cette structure ! • Ce qui fait la rapidité d’un traitement, c’est sa capacité à transférer ses données dans le cache L1 le plus vite possible
  • 85. #DVXFR #ListJ9 @JosePaumard L’ennemi c’est le cache miss ! • Cache miss = le CPU a besoin d’une donnée qui ne se trouve pas dans le cache L1, il faut donc aller la chercher • Un cache miss peut représenter un retard d’environ 500 instructions
  • 86. #DVXFR #ListJ9 @JosePaumard Structure du cache L1 • Le cache L1 est organisé en lignes de 8 long • Les transferts entre caches et avec la mémoire se font ligne par ligne • Et c’est là que se fait la différence entre ArrayList et LinkedList…
  • 87. #DVXFR #ListJ9 @JosePaumard Transfert d’une liste dans L1 • Le transfert d’une ArrayList dans le cache L1 peut se faire 8 fois plus vite que pour une LinkedList • Car les éléments d’une ArrayList sont rangés dans une zone contiguë de la mémoire • Alors que les nœuds de LinkedList sont distribués aléatoirement…
  • 88. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Le pointer chasing (chasse aux pointeurs) peut tuer les performances d’un traitement
  • 89. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Exemple int[] tab = {1, 2, 3, 4, 5}; Integer[] tab = {1, 2, 3, 4, 5};
  • 90. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Exemple int[] tab = {1, 2, 3, 4, 5}; Integer[] tab = {1, 2, 3, 4, 5}; 1 2 3 4 5
  • 91. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Exemple int[] tab = {1, 2, 3, 4, 5}; Integer[] tab = {1, 2, 3, 4, 5}; 1 2 3 4 5      1 2 4 5 3
  • 92. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Exemple public class Point { Integer x, y; } List<Point> points = new ArrayList<>();
  • 93. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Exemple public class Point { Integer x, y; } List<Point> points = new ArrayList<>();      x y 1 2
  • 94. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Exemple • Un traitement sur une telle structure va passer son temps à suivre des pointeurs… public class Point { Integer x, y; } List<Point> points = new ArrayList<>();      x 1 2y
  • 95. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Clairement, LinkedList n’est pas adaptée à la structure des CPU • Structure « cache friendly »
  • 96. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Autre exemple : HashMap  Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
  • 97. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Autre exemple : HashMap  Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry key value
  • 98. #DVXFR #ListJ9 @JosePaumard Pointer chasing • Autre exemple : HashMap  Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry key value 12 « twelve »
  • 99. #DVXFR #ListJ9 @JosePaumard • Autre exemple : HashMap  Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry Pointer chasing key value 12 « twelve »   
  • 100. #DVXFR #ListJ9 @JosePaumard • Autre exemple : HashMap  Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry • Idem pour HashSet… Pointer chasing key value 12 « twelve »   
  • 101. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Iterate HashSet ArrayList 10 142 ns 65 ns 100 1,27 us 429 ns 1 000 19,9 us 4,86 us 1 000 000 41,0 ms 9,1 ms
  • 102. #DVXFR #ListJ9 @JosePaumard Des alternatives ? • Dans le futur : List<int> !  Projet Valhalla : http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/
  • 103. #DVXFR #ListJ9 @JosePaumard Des alternatives ? • Dans le présent :  Eclipse Collections (prev. GS Collections)  HPPC  Koloboke  Trove http://java-performance.info/hashmap-overview-jdk-fastutil- goldman-sachs-hppc-koloboke-trove-january-2015/
  • 104. #DVXFR #ListJ9 @JosePaumard List sans objet ? • Construire des implémentations de Set / List / Map sans pointer chasing ?
  • 105. #DVXFR #ListJ9 @JosePaumard List sans objet ? • Construire des implémentations de Set / List / Map sans pointer chasing ? • Comme le pointer chasing vient du fait que l’on utilise des objets, peut-on les éliminer de ces implémentations ?
  • 106. #DVXFR #ListJ9 Questions et Réponses (peut-être…) José Paumard
  • 107. #DVXFR #ListJ9 ArrayList et LinkedList sont dans un bateau … et sont tombées à l’eau ! José Paumard
  • 108. #DVXFR #ListJ9 @JosePaumard Que veut-on faire ? • Point de départ : Java 9 ! • Question : comment créer une liste préremplie en Java ? • Réponse : ce n’est pas si simple !
  • 109. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 • Jusqu’en Java 8 (syntaxe à moustaches) : • Et si l’on veut avoir une table immutable (unmodifiable), il faut le faire en deux temps… Map<Integer, String> map = new HashMap<Integer, String>() {{ put(1, "one") ; put(2, "two") ; put(3, "three") ; }} ;
  • 110. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 • Nouveaux patterns pour les listes et sets :  Sont immutables  Éléments nuls non autorisés  Les Set jettent une IllegalArgumentException en cas de doublon  Serializable… List<Integer> list = List.of(1, 2, 3) ; Set<Integer> set = Set.of(1, 2, 3) ;
  • 111. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 • Nouveaux patterns pour les listes et sets : • Mais elles sont aussi…  À itérations aléatoires  Avec des implémentations optimisées ! List<Integer> list = List.of(1, 2, 3) ; Set<Integer> set = Set.of(1, 2, 3) ;
  • 112. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 • Implémentations optimisées : public static List<E> of(E e1); public static List<E> of(E e1, E e2); public static List<E> of(E e1, E e2, E e3); public static List<E> of(E e1, E e2, E e3, E e4); ... public static List<E> of(E... e);
  • 113. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 • Cas de Map public static Map<K, V> of(K key1, V value1); public static Map<K, V> of(K key1, V value1, K key2, V value2); ... public static Map<K, V> of(K... K, V... v);
  • 114. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 • Cas de Map  Jette une exception en cas de clé dupliquée, pourquoi ? public static Map<K, V> of(K key1, V value1); public static Map<K, V> of(K key1, V value1, K key2, V value2); ... public static Map<K, V> of(K... K, V... v); public static Entry<K, V> of(K key, V value); public static Map<K, V> ofEntries(Entry... e);
  • 115. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 Map<String, TokenType> tokens = Map.ofEntries( entry("for", KEYWORD), entry("while", KEYWORD), entry("do", KEYWORD), entry("break", KEYWORD), entry(":", COLON), entry("+", PLUS), entry("--‐", MINUS), entry(">", GREATER), entry("<", LESS), entry(":", PAAMAYIM_NEKUDOTAYIM), entry("(", LPAREN), entry(")", RPAREN) ); @ Stuart Mark
  • 116. #DVXFR #ListJ9 @JosePaumard Un petit coup d’œil à Java 9 Map<String, TokenType> tokens = Map.ofEntries( entry("for", KEYWORD), entry("while", KEYWORD), entry("do", KEYWORD), entry("break", KEYWORD), entry(":", COLON), entry("+", PLUS), entry("--‐", MINUS), entry(">", GREATER), entry("<", LESS), entry(":", PAAMAYIM_NEKUDOTAYIM), entry("(", LPAREN), entry(")", RPAREN) ); @ Stuart Mark
  • 117. #DVXFR #ListJ9 @JosePaumard Que veut-on faire ? • Question : comment construire une implémentation optimisée d’une liste à 1 ou 2 éléments ? • Set, List et Map (et Map.Entry) • Si possible optimale, en minimisant le pointer chasing
  • 118. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Index Read ArrayList SingletonList TwoElementList 1 3,5 ns 2,7 ns 2 2,9 ns 2,6 ns
  • 119. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Iterate ArrayList SingletonList TwoElementList 1 4,7 ns 2,3 ns 2 6,5 ns 3,4 ns
  • 120. #DVXFR #ListJ9 @JosePaumard Un peu de bench • Résultats Iterate HashSet SingletonSet TwoElementSet 1 7,3 ns 2,3 ns 2 9,5 ns 3,5 ns
  • 121. #DVXFR #ListJ9 @JosePaumard Conclusion • Les lambdas peuvent être utilisées dans des contextes un peu inattendus… • Repérer les classes qui dépendent d’une unique méthode • Idem en conception de nouvelles applications • Cf la présentation de Rémi Forax : Implémenter le GoF avec des lambda
  • 122. #DVXFR #ListJ9 @JosePaumard Conclusion • On n’a pas fini de digérer les lambdas en Java !
  • 124. #DVXFR #ListJ9 Questions et Réponses (si on a le temps…) José Paumard
  • 125. #DVXFR #ListJ9 ArrayList et LinkedList sont dans un bateau … et c’est l’heure d’aller déjeuner ! José Paumard