パフォーマンスプロファイリング ぱふぉーまんすぷろふぁいりんぐ
プロファイリングボトルネックパフォーマンスチューニングフレームグラフCPUプロファイルメモリプロファイル
プロファイリングって何のためにやるの?
簡単に言うとこんな感じ!
プロファイリングは「アプリのどこで時間がかかってるか・どこでメモリを食ってるか」を計測することだよ!「なんか遅いな」という勘で最適化するんじゃなく、「このDB呼び出しに90%の時間がかかってる」という事実に基づいて改善できるんだ。
パフォーマンスプロファイリングとは
パフォーマンスプロファイリング(Performance Profiling) とは、アプリケーションの実行中にどの関数・処理でどれだけのCPU時間・メモリを消費しているかを計測・分析する手法です。
「90/10の法則」(パフォーマンスの問題の90%は、コードの10%に起因する)に基づき、ボトルネックを特定してから最適化することが重要です。感覚的な最適化は無駄になることが多く、プロファイリングによる事実ベースのアプローチが効果的です。
プロファイリングの種類
| 種類 | 内容 |
|---|---|
| CPUプロファイリング | 関数ごとのCPU使用時間・呼び出し回数を計測 |
| メモリプロファイリング | ヒープ使用量・オブジェクト生成数・メモリリーク検出 |
| I/Oプロファイリング | ディスク・ネットワークI/Oのボトルネック特定 |
| DBクエリプロファイリング | スロークエリの特定(EXPLAIN ANALYZE等) |
フレームグラフ(Flame Graph)
CPU時間の使用状況を視覚化したグラフ。幅が広い=時間を多く使っているを意味し、どの関数スタックがボトルネックかを一目で把握できます。
主なプロファイリングツール
| ツール | 対象 |
|---|---|
| Chrome DevTools(Performance) | フロントエンドJS・レンダリング |
| py-spy / cProfile | Python |
| JProfiler / async-profiler | Java/JVM |
| pprof | Go |
| Datadog APM | 本番環境の分散トレーシング |
歴史と背景
- 1970年代:gprof(GNUプロファイラ)がUnix環境で開発
- 2000年代:JVMプロファイラが成熟しJavaパフォーマンスチューニングが体系化
- 現在:APM(Application Performance Monitoring)ツールで本番環境の継続的プロファイリングが可能に