💻 Développement

dev-performance-profiler

Diagnostic et optimisation des performances d'applications.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-performance-profiler --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-performance-profiler -Launch"

🚀 Déjà installé ?

claude "/dev-performance-profiler"

Ou tapez /dev-performance-profiler dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

performancelentoptimiserprofilingmemory leakCPUlatencebottleneckmon app est lentetemps de réponse

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-performance-profiler ~/.claude/skills/

Payload du plugin : skills/dev-performance-profiler · source éditable : dev-skills/performance-profiler

đź“– Manuel

Performance Profiler

Workflow

1. Triage du symptĂ´me

Recueillir avant de profiler :

SymptômeMétrique clé à mesurerOutil de première ligne
Lenteur progressiveMémoire RSS + GC pauseheap dump, dotMemory
Haute CPU constanteFlame graph CPUperf, async-profiler
Timeouts / p99 élevéLatence par percentileAPM (Datadog, Jaeger)
Throughput dégradéRPS + error ratewrk2, k6
Memory leakHeap usage over timeheapdump, PerfView

Reproduire en local ou staging d'abord ; profiler prod seulement si le bug est non-reproductible.


2. Choisir l'outil adapté à la stack

.NET      → dotTrace (sampling/tracing), PerfView (ETW), BenchmarkDotNet, dotMemory
Node.js   → clinic.js (doctor/flame/bubbleprof), --inspect + Chrome DevTools, 0x
Python    → py-spy (sampling, zero overhead), cProfile + snakeviz, memray
Java/JVM  → async-profiler, JFR + JMC, VisualVM
Go        → pprof (net/http/pprof), trace, benchstat
Rust      → cargo flamegraph, criterion
HTTP/API  → wrk2, k6, hey, autocannon
DB (SQL)  → EXPLAIN ANALYZE, sys.dm_exec_query_stats, slow query log

Critère de choix : préférer le sampling (< 1 % overhead) en prod ; réserver tracing (instrumentation complète) à staging pour les bottlenecks fins.


3. Profiling CPU

# py-spy — snapshot sans redémarrer le process
py-spy record -o profile.svg --pid <PID> --duration 30

# async-profiler (JVM)
./profiler.sh -d 30 -f flamegraph.html <PID>

# Go — endpoint HTTP exposé
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=30

# .NET — CLI
dotnet-trace collect --process-id <PID> --duration 00:00:30
dotnet-trace convert trace.nettrace --format Speedscope

Lire un flame graph : la largeur d'un bloc = % CPU total ; chercher les plateaux larges inattendus. Ignorer les frames system en bas, se concentrer sur le code applicatif.

Signaux d'alerte CPU :


4. Profiling mémoire

# Python — memray
memray run --output out.bin mon_script.py
memray flamegraph out.bin

# Node.js — heap snapshot
node --inspect app.js
# puis Chrome DevTools > Memory > Take snapshot

# .NET — dotMemory CLI
dotmemory attach <PID> --save-to-dir snapshots/ --trigger-timer:interval=60s

# Go
curl http://localhost:6060/debug/pprof/heap > heap.prof
go tool pprof -http=:8080 heap.prof

Checklist memory leak :

GC pressure : si GC pause > 50 ms ou fréquence > 1 collection/s en Gen2 (.NET) → réduire les allocations dans les hot paths (pooling, stackalloc, Span<T>).


5. Profiling I/O / Base de données

Détection N+1 queries (ORM) :

// EF Core — activer logging des requêtes
options.LogTo(Console.WriteLine, LogLevel.Information)
       .EnableSensitiveDataLogging();
// Chercher des SELECT répétés dans une boucle
// Fix : .Include() ou projection explicite
# Django — django-debug-toolbar ou:
from django.db import connection
print(len(connection.queries))  # doit ĂŞtre constant

Commandes SQL diagnostics :

-- SQL Server : top queries par CPU
SELECT TOP 10 total_worker_time/execution_count AS avg_cpu,
       total_logical_reads/execution_count AS avg_reads,
       execution_count, text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY avg_cpu DESC;

-- PostgreSQL : slow queries (pg_stat_statements)
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC LIMIT 10;

Index manquant : vérifier EXPLAIN (ANALYZE, BUFFERS) — un Seq Scan sur une grande table = candidat index.


6. Benchmarking avant/après

# HTTP — k6
k6 run --vus 50 --duration 30s script.js

# CLI binaries — hyperfine
hyperfine --warmup 5 'avant' 'apres'

# Python — pytest-benchmark
pytest tests/bench_*.py --benchmark-compare

# .NET — BenchmarkDotNet (dans un projet dédié)
# [Benchmark] sur la méthode, dotnet run -c Release

Règle : minimum 3 runs, écarter les outliers, reporter p50 / p95 / p99, pas seulement la moyenne.


7. Optimisations classiques par catégorie

CPU

Mémoire

I/O

Base de données


Garde-fous & anti-patterns

Anti-patternRisqueFix
Optimiser sans mesurerPerdre du temps sur un non-bottleneckToujours profiler d'abord
Micro-benchmark isolé ≠ prodRésultats trompeurs (JIT warmup, data size)Benchmark sur données réalistes
Caching partout d'embléeStaleness, invalidation complexe, mémoireCacher seulement ce qui est mesuré comme lent
Parallélisme naïfRace conditions, contention, overhead > gainMesurer le speedup réel, Amdahl's Law
Ignorer le GC / allocationsPauses imprévisibles en prodProfiler les allocations, pas que le CPU
Index sur toutes les colonnesWrites dégradés, taille disqueIndexer seulement les requêtes fréquentes et lentes
sync-over-async (.NET)Deadlocks en prodAsync all the way, jamais .Result / .Wait()

Bonnes pratiques 2026