Cours JavaScript et TypeScript · Module 5: JavaScript avancé
Profileurs et outils de performance
Dans cette leçon7
À Jurassic Park, les performances des systèmes informatiques sont essentielles pour la sécurité. Imagine que le système de surveillance des dinosaures prédateurs commence à ralentir - un retard de quelques secondes seulement pourrait faire la différence entre une observation sûre et un incident dangereux ! Tout comme les scientifiques du parc utilisent des outils avancés pour surveiller la santé des dinosaures, les développeurs disposent de profileurs et d'outils de performance pour repérer les « goulots d'étranglement » dans les applications.
Que sont les profileurs ?
Les profileurs sont des outils qui collectent des données sur le comportement d'une application en temps réel, en analysant l'utilisation de la mémoire, le temps d'exécution des fonctions et d'autres métriques de performance. C'est comme les caméras thermiques utilisées par le personnel du parc pour surveiller l'activité des dinosaures - elles permettent de voir ce qui reste normalement invisible.
L'API Performance
JavaScript propose une API Performance intégrée qui permet de mesurer le temps d'exécution du code :
1// Surveillance du temps de chargement des données des dinosaures
2console.time('fetchDinosaurData');
3
4fetchDinosaurDataFromAPI()
5 .then(data => {
6 console.timeEnd('fetchDinosaurData'); // Affiche : fetchDinosaurData: 1250.33ms
7 updateDinosaurMonitoringSystem(data);
8 });Les méthodes console.time() et console.timeEnd() sont une façon simple de mesurer le temps d'exécution d'une opération. On peut aussi utiliser une API plus précise :
1// Chronométrage plus avancé
2const startTime = performance.now();
3
4processDinosaurMovementData(velociraptorSensorData);
5
6const endTime = performance.now();
7console.log(`Le traitement des données de mouvement a pris ${endTime - startTime} millisecondes`);Les outils de performance dans les navigateurs
Tous les navigateurs modernes offrent des outils avancés d'analyse de performance :
1. Le panneau Performance des Chrome DevTools
L'onglet Performance des Chrome DevTools permet d'enregistrer et d'analyser le comportement de l'application, en identifiant :
- Les opérations longues qui bloquent le thread principal
- Le rendu excessif
- L'utilisation de la mémoire
- Les événements provoquant un défilement ou des animations qui n'atteignent pas le FPS cible
Exemple d'utilisation :
- Ouvre les outils de développement (<kbd>F12</kbd> ou <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd>)
- Va dans l'onglet « Performance »
- Clique sur le bouton d'enregistrement
- Effectue dans l'app les opérations que tu veux analyser
- Arrête l'enregistrement
- Analyse le graphique obtenu montrant l'activité JavaScript, le rendu, la mémoire, etc.
2. Le profileur JavaScript
Les Chrome DevTools offrent aussi un profileur JavaScript qui permet de suivre précisément les temps d'exécution des fonctions :
- Va dans l'onglet « Performance » ou « Profiler »
- Sélectionne « JavaScript Profiler » ou « JS Profiler »
- Appuie sur « Start »
- Effectue les opérations à profiler
- Appuie sur « Stop »
Les résultats afficheront un « flamegraph » représentant la hiérarchie des appels de fonctions et le temps passé dans chacune.
Le profilage de la mémoire
L'un des problèmes de performance les plus courants est la fuite de mémoire (memory leak). À Jurassic Park, une fuite de mémoire dans le système de surveillance pourrait le ralentir, voire le faire planter à un moment critique !
Les Chrome DevTools offrent des outils d'analyse de l'utilisation de la mémoire :
- Va dans l'onglet « Memory »
- Sélectionne le type d'instantané mémoire (Heap snapshot, Allocation instrumentation, etc.)
- Prends un instantané de la mémoire
- Analyse les résultats, en cherchant les objets qui consomment beaucoup de mémoire ou dont le nombre augmente de façon excessive
1// Exemple de fuite de mémoire potentielle dans le système Jurassic Park
2const dinoMonitoringSystem = {
3 sensorReadings: [],
4 startMonitoring() {
5 // Ce setInterval n'est jamais nettoyé, ce qui peut provoquer une fuite de mémoire
6 setInterval(() => {
7 this.sensorReadings.push({
8 timestamp: Date.now(),
9 readings: generateRandomSensorData()
10 });
11 // Le tableau sensorReadings grandira indéfiniment !
12 }, 1000);
13 }
14};
15
16// Meilleure approche : garder la référence de l'intervalle et le nettoyer quand on n'en a plus besoin
17const betterDinoMonitoringSystem = {
18 sensorReadings: [],
19 intervalId: null,
20 startMonitoring() {
21 this.intervalId = setInterval(() => {
22 // Garde uniquement les 100 dernières lectures
23 if (this.sensorReadings.length >= 100) {
24 this.sensorReadings.shift(); // Retire la plus ancienne lecture
25 }
26 this.sensorReadings.push({
27 timestamp: Date.now(),
28 readings: generateRandomSensorData()
29 });
30 }, 1000);
31 },
32 stopMonitoring() {
33 clearInterval(this.intervalId);
34 this.intervalId = null;
35 }
36};Lighthouse - analyse de performance complète
Lighthouse est un outil intégré aux Chrome DevTools qui analyse une page web sous l'angle des performances, de l'accessibilité, du SEO et d'autres aspects. Il est particulièrement utile pour optimiser les applications web.
Imagine que tu construis un site web pour Jurassic Park qui doit se charger rapidement pour les visiteurs potentiels. Lighthouse t'aidera à identifier les problèmes qui ralentissent la page.
Conseils pratiques d'optimisation des performances
D'après l'expérience de la gestion des systèmes de Jurassic Park, voici quelques conseils pratiques :
Évite les calculs lourds sur le thread principal
1// Au lieu de : 2function analyzeDinosaurBehavior(dinoData) { 3 // Calculs intensifs qui bloquent l'UI 4} 5 6// Mieux : 7function analyzeDinosaurBehavior(dinoData) { 8 // Prépare d'abord les données 9 requestAnimationFrame(() => { 10 // Exécute les calculs entre les frames d'animation 11 // ou utilise un Web Worker pour des calculs vraiment intensifs 12 }); 13}Utilise des techniques de mémoïsation / mise en cache
1// Mise en cache des résultats de calculs coûteux 2const memoizedCalculations = new Map(); 3 4function calculateDinosaurGrowthProjection(species, age, diet) { 5 const key = `${species}-${age}-${diet}`; 6 7 if (memoizedCalculations.has(key)) { 8 return memoizedCalculations.get(key); // Renvoie le résultat en cache 9 } 10 11 // N'effectue les calculs coûteux que s'ils ne sont pas en cache 12 const result = performExpensiveCalculation(species, age, diet); 13 memoizedCalculations.set(key, result); 14 15 return result; 16}Optimise les opérations DOM
1// Au lieu de : 2function updateDinosaurStatuses(dinosaurs) { 3 dinosaurs.forEach(dino => { 4 const element = document.getElementById(`dino-${dino.id}`); 5 element.className = dino.status; // Chaque changement provoque un reflow 6 element.textContent = dino.name; 7 element.style.backgroundColor = getStatusColor(dino.status); 8 }); 9} 10 11// Mieux : 12function updateDinosaurStatuses(dinosaurs) { 13 // Minimise les opérations DOM en les regroupant 14 const fragment = document.createDocumentFragment(); 15 16 dinosaurs.forEach(dino => { 17 const element = document.createElement('div'); 18 element.id = `dino-${dino.id}`; 19 element.className = dino.status; 20 element.textContent = dino.name; 21 element.style.backgroundColor = getStatusColor(dino.status); 22 fragment.appendChild(element); 23 }); 24 25 // Une seule opération DOM au lieu de plusieurs 26 const container = document.getElementById('dinosaur-status-container'); 27 container.innerHTML = ''; 28 container.appendChild(fragment); 29}
Conclusions
Le profilage et l'analyse de performance réguliers sont aussi importants en programmation que les contrôles de sécurité réguliers à Jurassic Park. Avec ces outils, on peut détecter et éliminer les problèmes de performance avant qu'ils ne mènent à des « incidents » dans notre application.
Dans l'exercice suivant, nous examinerons les types d'erreurs qui surviennent en JavaScript et les stratégies pour les gérer - même dans les situations les plus imprévisibles, comme une évasion inattendue de velociraptor de son enclos !
Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. À quoi sert l'onglet Performance des DevTools du navigateur ?
2. Qu'est-ce qui peut provoquer une fuite de mémoire en JavaScript ?
Tâches pratiques dans le jeu
- Éditeur de code
Mesure le temps d'une opération de filtrage et crée une fonction memoize() qui met en cache les résultats.
- Tri vertical
Ordonne les étapes du profilage des performances d'une application :