Back

Comment Mesurer les Performances JavaScript

Comment Mesurer les Performances JavaScript

Les problèmes de performances JavaScript sont faciles à ressentir mais difficiles à identifier précisément. Votre application semble lente, les interactions accusent du retard et les utilisateurs le remarquent — mais sans les bons outils de mesure, vous naviguez à l’aveugle. Cet article couvre les techniques pratiques de mesure des performances JavaScript en utilisant les API modernes des navigateurs et les DevTools, afin que vous puissiez identifier les véritables goulots d’étranglement et corriger ce qui compte vraiment.

Points Clés

  • Distinguez les tests synthétiques (en laboratoire) de la surveillance des utilisateurs réels (RUM) — utilisez les outils de laboratoire pour diagnostiquer, les données terrain pour valider.
  • Le panneau Performance de Chrome DevTools révèle les tâches longues, les graphiques en flamme et les arbres d’appels pour un profilage pratique.
  • L’API Performance (performance.now(), performance.mark(), performance.measure()) fournit un chronométrage précis et programmatique qui s’intègre aux DevTools.
  • PerformanceObserver automatise la collecte d’entrées pour la surveillance en production, y compris la détection des tâches longues.
  • Interaction to Next Paint (INP) est le Core Web Vital le plus étroitement lié à la réactivité. L’exécution JavaScript en est un contributeur majeur, avec le style, la mise en page et le rendu.

Tests en Laboratoire vs. Données Utilisateurs Réels

Avant de choisir un outil, comprenez les deux types de mesure des performances JavaScript :

  • Les tests synthétiques (en laboratoire) exécutent votre code dans un environnement contrôlé. Des outils comme Lighthouse et Chrome DevTools vous donnent des résultats reproductibles et débogables. Idéal pour le développement et les pipelines CI.
  • Les données terrain (RUM) capturent ce que les utilisateurs réels expérimentent. Des outils comme Chrome User Experience Report (CrUX) ou les plateformes RUM vous montrent les performances réelles sur différents appareils et réseaux.

Utilisez les outils de laboratoire pour diagnostiquer les problèmes. Utilisez les données terrain pour confirmer qu’ils sont importants.

Profilage JavaScript dans Chrome DevTools

Chrome DevTools est le point de départ le plus pratique pour les métriques de performances JavaScript. Ouvrez le panneau Performance, cliquez sur enregistrer, interagissez avec votre page, puis arrêtez.

Ce qu’il faut rechercher :

  • Long Tasks — toute tâche bloquant le thread principal pendant plus de 50ms apparaît en rouge. Celles-ci retardent souvent les interactions utilisateur. Les outils modernes peuvent également révéler les Long Animation Frames, qui fournissent des informations plus détaillées sur les images lentes affectant la réactivité.
  • Vues Call Tree / Bottom-Up — identifiez quelles fonctions consomment le plus de temps d’exécution.
  • Graphique en flamme — visualisez la pile d’appels dans le temps pour repérer les travaux synchrones coûteux.

Firefox DevTools offre un profileur similaire. Les deux outils sont gratuits, ne nécessitent aucune configuration et fonctionnent sur n’importe quel site.

Mesurer le Temps d’Exécution JavaScript avec l’API Performance

Pour une mesure précise et programmatique des performances JavaScript, utilisez l’API Performance intégrée au navigateur.

Utilisation de performance.now()

performance.now() retourne un horodatage haute résolution en millisecondes, relatif à l’origine temporelle de la page — ce qui le rend plus fiable que Date.now() pour chronométrer du code.

const start = performance.now()
runExpensiveOperation()
const duration = performance.now() - start
console.log(`Took ${duration}ms`)

Utilisation de performance.mark() et performance.measure()

Pour un chronométrage structuré sur plusieurs points, utilisez les marks et measures. Cela s’intègre directement avec DevTools et PerformanceObserver.

performance.mark('fetch-start')
const data = await fetchData()
performance.mark('fetch-end')

const measure = performance.measure('fetch-duration', 'fetch-start', 'fetch-end')
console.log(measure.duration) // millisecondes

Les measures apparaissent dans le panneau Performance de Chrome DevTools sous la piste Timings, ce qui facilite leur corrélation avec d’autres activités sur le thread principal.

Automatiser la Mesure avec PerformanceObserver

PerformanceObserver vous permet de réagir aux entrées de performance au fur et à mesure qu’elles se produisent — utile pour la surveillance en production.

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(entry.name, entry.duration)
  }
})

observer.observe({ type: 'measure', buffered: true })

Vous pouvez également observer les entrées longtask pour détecter le blocage du thread principal dans les sessions utilisateurs réelles.

Core Web Vitals et INP : Les Métriques qui Comptent

Les Core Web Vitals de Google sont les métriques de performances JavaScript standard pour l’expérience utilisateur. La plus pertinente pour JavaScript est Interaction to Next Paint (INP) — elle mesure la latence de toutes les interactions (clics, tapotements, saisie clavier) tout au long de la durée de vie d’une page.

Un INP supérieur à 200ms est un signal d’alerte. Au-delà de 500ms, c’est médiocre. L’exécution JavaScript intensive pendant les gestionnaires d’événements est la cause la plus courante.

Utilisez la bibliothèque web-vitals pour mesurer l’INP sur le terrain :

import { onINP } from 'web-vitals'
onINP(({ value }) => console.log('INP:', value))

Pour les SPA, notez que les navigations douces (changements de route sans rechargement complet de la page) ne sont que partiellement capturées par les métriques de navigation standard. Le support navigateur pour la mesure des navigations douces est encore en évolution, donc instrumenter manuellement les transitions de route avec performance.mark() peut aider à combler les lacunes.

Choisir le Bon Outil

ObjectifOutil
Débogage rapideconsole.time() / console.timeEnd()
Chronométrage précisperformance.now()
Chronométrage structuré et visuelperformance.mark() + performance.measure()
Surveillance automatiséePerformanceObserver
Profilage complet de pagePanneau Performance de Chrome DevTools
Scores d’audit + données terrainLighthouse + CrUX

Conclusion

Une mesure efficace des performances JavaScript commence par le bon outil pour la bonne question. Utilisez les DevTools pour profiler et explorer, l’API Performance pour instrumenter des chemins de code spécifiques, et les Core Web Vitals — en particulier l’INP — pour comprendre ce que les utilisateurs expérimentent réellement. Mesurez d’abord, optimisez ensuite.

FAQ

performance.now() retourne un horodatage haute résolution relatif à l'origine temporelle de la page, offrant une précision inférieure à la milliseconde. Date.now() s'appuie sur l'horloge système, qui peut être affectée par des ajustements d'horloge et n'offre qu'une résolution à la milliseconde. Pour le benchmarking de l'exécution du code, performance.now() est le choix le plus précis et fiable.

Utilisez un PerformanceObserver configuré pour observer les entrées de type longtask. Toute tâche dépassant 50ms sur le thread principal est signalée comme tâche longue. En collectant ces entrées en production, vous pouvez identifier quelles interactions utilisateur déclenchent un travail bloquant et prioriser l'optimisation là où cela compte le plus.

Interaction to Next Paint mesure la latence de toutes les interactions pendant une visite de page et rapporte la pire d'entre elles. First Input Delay ne capturait que le délai de la toute première interaction. L'INP donne une image plus complète de la réactivité à l'exécution, c'est pourquoi Google a remplacé FID par INP comme Core Web Vital en mars 2024.

Oui. Placez des appels performance.mark() avant et après votre expression await, puis appelez performance.measure() avec les deux noms de marks pour calculer le temps écoulé. L'entrée measure résultante inclut la durée totale de l'opération asynchrone et apparaît dans la piste Timings de DevTools pour une corrélation visuelle.

Complete picture for complete understanding

Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.

Check our GitHub repo and join the thousands of developers in our community.

OpenReplay