C++ コードのプロファイリング (Linux) - 代替手法
C++ コードのプロファイリング (Linux)
C++ コードを実行している Linux 上でどのようにプロファイルするのかについて、日本語で説明します。プロファイリングは、コードの性能を分析し、ボトルネックを特定する手法です。
プロファイリングツール
Linux 上では、さまざまなプロファイリングツールが利用できます。以下は、一般的なツールです。
- perf: Linux カーネルに組み込まれたプロファイリングツール。イベントベースのプロファイリングが可能で、CPUサイクル、キャッシュミス、ページフォルトなどを測定できます。
- gprof: GCC コンパイラに付属するプロファイリングツール。関数レベルでのプロファイルが可能で、実行時間、呼び出し回数などを測定できます。
- Valgrind: メモリリークや未定義動作を検出するためのツールですが、プロファイリング機能も備えています。
- Callgrind: Valgrind のプロファイリングツール。関数レベルでのプロファイルが可能で、実行時間、呼び出し回数、キャッシュミスなどを測定できます。
- コンパイル: プロファイリング情報を収集するために、コンパイラオプションを使用します。
- perf:
-g
オプションを使用します。
- perf:
- 実行: プロファイリング情報を収集するために、プログラムを実行します。
- プロファイルデータの生成: プロファイリングツールを使用して、プロファイルデータを生成します。
- perf:
perf record
コマンドを使用します。 - gprof:
gprof
コマンドを使用します。 - Valgrind:
valgrind --tool=callgrind
コマンドを使用します。
- perf:
- プロファイルデータの解析: プロファイルデータを解析して、ボトルネックを特定します。
- Valgrind:
kgrind
ツールを使用します。
- Valgrind:
例 (perf)
# コンパイル
g++ -g main.cpp -o main
# プロファイルデータの収集
perf record ./main
# プロファイルデータの解析
perf report
perf を使用したプロファイリング
// main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers(1000000);
std::generate(numbers.begin(), numbers.end(), []() { return rand(); });
std::sort(numbers.begin(), numbers.end());
return 0;
}
# コンパイル
g++ -g main.cpp -o main
# プロファイルデータの収集
perf record ./main
# プロファイルデータの解析
perf report
この例では、perf
を使用して、std::sort
関数の性能を分析しています。
// main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
// ... (同じコード)
}
# コンパイル
g++ -pg main.cpp -o main
# プロファイルデータの収集
./main
# プロファイルデータの解析
gprof main
この例では、gprof
を使用して、関数の呼び出し回数や実行時間を分析しています。
Valgrind の Callgrind を使用したプロファイリング
// main.cpp
// ... (同じコード)
# コンパイル
g++ -g main.cpp -o main
# プロファイルデータの収集
valgrind --tool=callgrind ./main
# プロファイルデータの解析
kgrind callgrind.out.XX
この例では、Valgrind の Callgrind を使用して、関数の呼び出し回数や実行時間、キャッシュミスなどを分析しています。
組み込みプロファイリング機能
- GCC の組み込みプロファイリング:
-pg
オプションを使用することで、関数レベルでのプロファイリングが可能です。 - LLVM の組み込みプロファイリング:
-fprofile-generate
オプションを使用することで、プロファイル情報を収集し、-fprofile-use
オプションを使用することで、最適化に利用できます。
外部ツール
- FlameGraph:
perf
のデータを可視化するためのツールで、関数呼び出しのスタックトレースを視覚的に表示します。 - Google Performance Tools:
pprof
やgperftools
を含むツールセットで、プロファイリングやメモリリーク検出などが可能です。 - Intel VTune Amplifier: Intel のプロファイリングツールで、CPU、メモリ、GPUの性能を分析できます。
カスタムプロファイリング
- 独自の計測コード: コード内に計測用のコードを挿入することで、特定の関数の実行時間やメモリ使用量を測定できます。
- トレースツール:
strace
やltrace
を使用して、システムコールやライブラリ関数の呼び出しをトレースし、性能ボトルネックを特定できます。
考慮事項
- プロファイリングオーバーヘッド: プロファイリングツールを使用すると、コードの実行時間が遅くなることがあります。
- プロファイルデータの解釈: プロファイルデータを適切に解釈し、最適化を行うことが重要です。
- 特定のユースケース: プロファイリングの目的やコードの特性に合わせて、最適な手法を選択してください。
c++ linux profiling