Comprendre les goulots d'étranglement de performance

Optimiser son code en Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Qu'est-ce qu'un goulot d'étranglement de performance ?

Ce sont des contraintes qui limitent la vitesse et l'efficacité de notre application.

Imaginez verser de l'eau dans un entonnoir : la partie la plus étroite fixe le débit !

De l'eau s'écoulant dans un entonnoir

Optimiser son code en Java

Types de goulots d'étranglement

Goulots liés au CPU

  • Calculs complexes
  • Algorithmes inefficaces

Goulots liés aux E/S

  • Opérations base de données
  • Appels réseau
  • Opérations sur fichiers

Goulots liés à la mémoire (vus plus loin)

Optimiser son code en Java

Mesurer les performances avec System.nanoTime()

  • System.nanoTime() : mesure temporelle haute précision
    • Mesure le temps écoulé
    • Retourne des nanosecondes (1 milliard = 1 seconde) sous forme de long
  • Contrairement à System.currentTimeMillis(), mesure le temps « mur »

$$

long startTime = System.nanoTime();
// Code à mesurer
long endTime = System.nanoTime();
long duration = endTime - startTime;
Optimiser son code en Java

Utiliser System.nanoTime()

// Mesurer les performances de ArrayList.contains()
import java.util.ArrayList;
import java.util.List;

List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
    numbers.add(i);
}

long startTime = System.nanoTime(); boolean found = numbers.contains(99999); // opération O(n) long endTime = System.nanoTime();
Optimiser son code en Java

Utiliser System.nanoTime()

long duration = endTime - startTime;
System.out.println("Time taken: " + duration + " ns");
// Convertir en millisecondes
System.out.println("Time taken: " + duration / 1_000_000.0 + " ms");
Time taken: 1239000000 ns
Time taken: 1239ms
  • ArrayList.contains() est une opération O(n)
Optimiser son code en Java

Bonnes pratiques de mesure des performances

  • Exécuter plusieurs mesures
Optimiser son code en Java

Exécuter plusieurs mesures

long totalTime = 0;
for (int i = 0; i < 3; i++) {
    long start = System.nanoTime();
    findElementLinear(data, target);
    long iterationTime = System.nanoTime() - start;
    totalTime += iterationTime;
    System.out.println("Run " + (i+1) + ": " + iterationTime + " ns");
}
double averageTime = totalTime / 3.0;
System.out.println("Average: " + (long)averageTime + " ns");
Run 1: 3245678 ns
Run 2: 3198432 ns
Run 3: 3301234 ns
Average: 3248448 ns
Optimiser son code en Java

Bonnes pratiques de mesure des performances

  • Exécuter plusieurs mesures
  • Comparer les performances relatives
// Supposons que avgTimeA et avgTimeB soient déjà calculés
System.out.println("Operation A is" + (avgTimeA / avgTimeB) + "x slower");
Operation A is 4x slower
Optimiser son code en Java

Passons à la pratique !

Optimiser son code en Java

Preparing Video For Download...