perf について
ベンチマーク、Node.js のプロファイリング、Lighthouse 監査を扱う開発者向けのパフォーマンス分析スキルです。AI によるコードやプロファイルの分析に加え、ホットスポットの特定や変更前後の比較例も含みます。
主な機能
- 01コードの計測とベンチマーク
- 02Node.js の CPU とメモリのプロファイリング
- 03Lighthouse の性能監査レポート作成
- 04AI によるコードとプロファイル出力の分析
- 05ホットスポットの特定と最適化結果の比較
活用シーン
- 01Node.js スクリプトの実行時間とメモリ使用量を測定
- 02CPU またはメモリのホットスポットを特定
- 03Web サイトを監査してレポートを出力
- 04コードの性能を確認し最適化結果を比較
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ johnlindquist/ claude --skill perfインストール後、Claude Code で/perfを入力して読み込まれたか確認します。
詳細
パフォーマンスプロファイラー
コードのパフォーマンスをプロファイリング、ベンチマーク、最適化します。
前提条件
# Node.js for profiling
node --version
# Lighthouse for web perf
npm install -g lighthouse
# Gemini for analysis
pip install google-generativeai
export GEMINI_API_KEY=your_api_key
ベンチマーク
クイックベンチマーク
# Time a Node.js script
time node script.js
# With memory
/usr/bin/time -l node script.js # macOS
/usr/bin/time -v node script.js # Linux
Node.js パフォーマンスフック
// benchmark.js
const { performance, PerformanceObserver } = require('perf_hooks');
const obs = new PerformanceObserver((list) => {
console.log(list.getEntries()[0].duration);
});
obs.observe({ entryTypes: ['measure'] });
performance.mark('start');
// Code to benchmark
yourFunction();
performance.mark('end');
performance.measure('duration', 'start', 'end');
コンソールのタイミング計測
console.time('operation');
// Code to time
console.timeEnd('operation'); // Prints: operation: 123.456ms
Node.js のプロファイリング
V8 プロファイラー
# Generate profile
node --prof script.js
# Process the log
node --prof-process isolate-*.log > profile.txt
インスペクトモード
# Start with inspector
node --inspect script.js
# Break on start
node --inspect-brk script.js
# Open Chrome DevTools
open chrome://inspect
メモリプロファイリング
# Heap snapshot
node --heapsnapshot-signal=SIGUSR2 script.js
# Then: kill -USR2 <pid>
# Expose GC for testing
node --expose-gc script.js
Lighthouse 監査
基本監査
# Full audit
lighthouse https://example.com
# Output to JSON
lighthouse https://example.com --output=json --output-path=report.json
# Output to HTML
lighthouse https://example.com --output=html --output-path=report.html
# Specific categories
lighthouse https://example.com --only-categories=performance
# Mobile vs Desktop
lighthouse https://example.com --preset=desktop
lighthouse https://example.com --preset=mobile # default
パフォーマンスのみ
lighthouse https://example.com \
--only-categories=performance \
--output=json \
--output-path=perf-report.json
Chrome フラグ
# Headless
lighthouse https://example.com --chrome-flags="--headless"
# Custom viewport
lighthouse https://example.com --chrome-flags="--window-size=1920,1080"
AI によるパフォーマンス分析
コードのパフォーマンスを分析する
CODE=$(cat slow-function.ts)
gemini -m pro -o text -e "" "Analyze this code for performance issues:
$CODE
Identify:
1. Time complexity issues
2. Memory leaks or bloat
3. Unnecessary operations
4. Opportunities for optimization
5. Caching opportunities
Provide specific recommendations with code examples."
プロファイル出力を分析する
PROFILE=$(cat profile.txt)
gemini -m pro -o text -e "" "Analyze this Node.js profile:
$PROFILE
Identify:
1. Hot functions (most time spent)
2. Potential bottlenecks
3. Optimization opportunities
4. Priority of fixes"
ホットスポットの特定
CPU のホットスポット
# Record CPU profile
node --cpu-prof script.js
# Analyze generated .cpuprofile
# Open in Chrome DevTools or use:
npx speedscope *.cpuprofile
メモリのホットスポット
# Find large objects
node --heapsnapshot-signal=SIGUSR2 app.js
# Use clinic.js
npx clinic doctor -- node script.js
npx clinic flame -- node script.js
npx clinic bubbleprof -- node script.js
バンドル分析
# Webpack
npx webpack-bundle-analyzer stats.json
# Vite
npx vite build --report
# Generic
du -sh dist/*
ls -lhS dist/*.js
よくあるパターン
確認すべきアンチパターン
gemini -m pro -o text -e "" "Check this code for common performance anti-patterns:
$(cat src/*.ts)
Look for:
- Synchronous I/O in hot paths
- Repeated DOM queries
- Unnecessary re-renders
- N+1 query patterns
- Memory leaks in closures
- Blocking the event loop"
最適化チェックリスト
gemini -m pro -o text -e "" "Create a performance optimization checklist for:
Application type: [web app / API / CLI]
Stack: [your stack]
Current issues: [symptoms]
Include priority order and estimated impact."
比較ベンチマーク
変更前と変更後
#!/bin/bash
# benchmark-compare.sh
echo "=== Before optimization ==="
git checkout main
npm install
time npm run benchmark
echo "=== After optimization ==="
git checkout optimization-branch
npm install
time npm run benchmark
A/B スクリプト
#!/bin/bash
# Run same benchmark multiple times
for i in {1..10}; do
echo "Run $i:"
node benchmark.js
done | tee results.txt
# Calculate average
grep "time:" results.txt | awk '{sum+=$2; n++} END {print "Average:", sum/n}'
ベストプラクティス
- まず計測する - データなしに最適化しないでください
- 本番環境でプロファイリングする - 開発環境とはパフォーマンスが異なります
- ベンチマークを自動化する - 時系列で追跡します
- ホットパスに集中する - 80/20 の法則
- 対象デバイスでテストする - 特にモバイル
- デプロイ後に監視する - 改善を確認します
- ベースラインを記録する - 「良好」の基準を把握します
コメント
Markdown 対応