Aller au contenu

Commandes speedscope

speedscope est un visualiseur rapide, interactif et basé sur le web pour les profils de performance. Il supporte l’importation de données depuis de nombreux profileurs et offre trois modes de visualisation : ordre temporel, poids gauche (flame graph traditionnel) et vue sandwich pour analyser les fonctions individuelles.

Installation

Linux/Ubuntu

# Install via npm (globally)
npm install -g speedscope

# Or use npx without installing
npx speedscope profile.json

# Verify installation
speedscope --version

# speedscope runs locally in your browser — no data is sent to any server

Basé sur le web (sans installation)

# Ouvrir https://speedscope.app dans votre navigateur
# Glisser-déposer un fichier de profil sur la page
# Ou utiliser le sélecteur de fichiers pour choisir un profil

# Tout le traitement se fait côté client dans le navigateur

Utilisation CLI

# Ouvrir un profil dans le navigateur par défaut
speedscope profile.json

# Ouvrir un format de fichier spécifique
speedscope perf.data.json
speedscope profile.pb.gz
speedscope chrome_trace.json

# Envoyer des données directement depuis un profileur
py-spy record --format speedscope -o - -- python app.py | speedscope -

# Ouvrir plusieurs profils pour comparaison
speedscope before.json after.json

Formats supportés

FormatOutil sourceExtension de fichier
speedscope JSONFormat natif.speedscope.json
pprofGo pprof, py-spy.pb.gz, .pb
Chrome TraceChrome DevTools, Node.js.json
Firefox ProfileFirefox Profiler.json
Brendan Gregg foldedFlameGraph stackcollapse.folded, .txt
callgrindValgrind, cachegrindcallgrind.out.*
InstrumentsXcode Instruments.trace
Linux perfperf script.perf, .txt
DTracePiles repliées DTrace.txt
Haskell profProfileur GHC.prof
Safari TimelineSafari Web Inspector.json

Générer des profils pour speedscope

Depuis py-spy (Python)

# Générer une sortie compatible speedscope
py-spy record --format speedscope -o profile.speedscope.json -- python my_script.py

# Depuis un processus en cours
sudo py-spy record --format speedscope -o profile.speedscope.json --pid 1234

Depuis perf (Linux)

# Enregistrer avec perf
perf record -F 99 -g -- ./my_program
perf script > out.perf

# Convertir en piles pliées (speedscope les lit)
stackcollapse-perf.pl out.perf > out.folded

# Ouvrir dans speedscope
speedscope out.folded

Depuis Go pprof

# Générer un profil CPU
go tool pprof -proto http://localhost:6060/debug/pprof/profile?seconds=30 > cpu.pb.gz

# Ouvrir dans speedscope
speedscope cpu.pb.gz

# Ou générer depuis un test Go
go test -cpuprofile cpu.pb.gz -bench .
speedscope cpu.pb.gz

Depuis Chrome DevTools

# 1. Ouvrir Chrome DevTools > onglet Performance
# 2. Cliquer sur Record, reproduire le problème, cliquer sur Stop
# 3. Cliquer sur la flèche vers le bas (Exporter) pour sauvegarder en JSON
# 4. Ouvrir le fichier JSON dans speedscope
speedscope chrome_profile.json

Depuis Node.js

# Générer un profil CPU V8
node --cpu-prof --cpu-prof-dir=./profiles my_app.js

# Ouvrir le fichier .cpuprofile généré
speedscope profiles/*.cpuprofile

# Avec clinic.js flame
npx clinic flame -- node my_app.js
# La sortie HTML contient des données exportables

Depuis Ruby (stackprof)

# Générer un profil stackprof
# Dans le code Ruby :
# StackProf.run(mode: :cpu, out: 'stackprof.dump') { do_work }

# Convertir au format speedscope
stackprof --flamegraph stackprof.dump > flamegraph.json
speedscope flamegraph.json

Modes de vue

Vue ordre temporel

# Affiche les événements en ordre chronologique (gauche à droite = temps)
# - L'axe X représente le temps horloge
# - L'axe Y représente la profondeur de la pile d'appels
# - Utile pour comprendre le flux d'exécution et la temporisation
# - Montre quand des fonctions spécifiques ont été appelées
# - Aide à identifier les phases et patterns d'exécution
# - Naviguer : défiler horizontalement pour se déplacer dans le temps

Vue poids gauche

# Flame graph traditionnel (agrégé par chemin d'appels)
# - Les cadres de pile identiques sont fusionnés et triés par poids
# - L'axe X représente le temps total (plus large = plus de temps)
# - L'axe Y représente la profondeur de la pile d'appels
# - Idéal pour trouver les points chauds et cibles d'optimisation
# - Similaire aux flame graphs de Brendan Gregg
# - Naviguer : cliquer pour zoomer dans un sous-arbre

Vue sandwich

# Se concentrer sur une seule fonction montrant appelants et appelés
# - Sélectionner n'importe quelle fonction pour voir son contexte complet
# - Section supérieure : qui a appelé cette fonction (appelants)
# - Section inférieure : ce que cette fonction appelle (appelés)
# - Centre : la fonction sélectionnée
# - Excellent pour comprendre le rôle d'une fonction spécifique
# - Naviguer : cliquer sur les noms de fonctions pour recentrer

Raccourcis clavier

RaccourciAction
1Basculer vers la vue ordre temporel
2Basculer vers la vue poids gauche
3Basculer vers la vue sandwich
f ou /Ouvrir la recherche
EnterConfirmer la recherche
EscapeFermer la recherche ou réinitialiser le zoom
rRéinitialiser la vue / zoom
nCorrespondance de recherche suivante
Shift+nCorrespondance de recherche précédente
+ / =Zoomer
-Dézoomer
0Ajuster à la fenêtre
h / Flèche gaucheDéfiler à gauche
l / Flèche droiteDéfiler à droite
Molette sourisZoomer/dézoomer au curseur

Format JSON speedscope

{
  "$schema": "https://www.speedscope.app/file-format-schema.json",
  "shared": {
    "frames": [
      {"name": "main", "file": "app.py", "line": 10},
      {"name": "process_data", "file": "app.py", "line": 25},
      {"name": "transform", "file": "utils.py", "line": 42}
    ]
  },
  "profiles": [
    {
      "type": "sampled",
      "name": "CPU Profile",
      "unit": "milliseconds",
      "startValue": 0,
      "endValue": 5000,
      "samples": [[0, 1, 2], [0, 1], [0, 1, 2]],
      "weights": [10, 10, 10]
    }
  ]
}

Conseils et flux de travail

# Flux de travail de comparaison A/B rapide
# 1. Profiler avant l'optimisation
py-spy record --format speedscope -o before.json -- python my_script.py

# 2. Modifier le code, puis profiler à nouveau
py-spy record --format speedscope -o after.json -- python my_script.py

# 3. Ouvrir les deux dans des onglets speedscope pour comparaison
speedscope before.json &
speedscope after.json &

# Conversion entre formats
# Piles pliées vers speedscope : ouvrir directement
speedscope my_folded_stacks.txt

# Plusieurs profils dans un fichier
# Le JSON speedscope supporte plusieurs profils dans le tableau "profiles"
# Chacun apparaît comme un onglet séparé dans le visualiseur

# Auto-hébergement de speedscope
# Cloner et servir les fichiers statiques
git clone https://github.com/jlfwong/speedscope.git
cd speedscope && python3 -m http.server 8080
# Ouvrir http://localhost:8080

Référence rapide

FonctionnalitéDescription
Ordre temporelVue d’exécution chronologique
Poids gaucheVue flame graph agrégé
SandwichVue centrée appelant/appelé
RechercheMettre en surbrillance les cadres correspondants
ZoomCliquer sur les cadres ou utiliser la molette
ExporterSauvegarder la vue actuelle en PNG
Glisser-déposerCharger des fichiers en les déposant sur la page
ConfidentialitéTout le traitement est côté client