私はかなり大きなテンプレートヘッダーのみのC++ライブラリを作成する傾向があり、ユーザーは一般的にコンパイル時間について不平を言います。そのことを考えてみたら、どこに行くのかわからないことに気づきました。g ++、icc、xlCなどの一般的なコンパイラを使用してC ++コンパイルプロセスをプロファイリングする簡単な方法はありますか?たとえば、C ++コンパイルの各フェーズでどのくらいの時間が費やされているかを知ることは可能ですか?
8 に答える
GCCの場合、見つけるためのデバッグオプションがありますhow much time is spent within each of the phases of C++ compilation?
-Q コンパイラーに、コンパイル時に各関数名を出力させ、終了時に各パスに関する統計を出力させます。
-ftime-report コンパイラーに、パスが終了したときに各パスで消費された時間に関する統計を出力させます。
パスについては、GCCINT 9:コンパイラのパスとファイルで説明されています。
単一のソースファイルのg++コンパイルの出力を-v -ftime-report
ここに投稿して、それについて議論することができます。GCCメーリングリストに役立つ可能性があります。
GCC (または3.3.6より古いGCC)以外のコンパイラについては、このスレッドの他のオプションを参照してください。
Boostプロジェクトのツールがあります。これは、ほとんどすべてのコンパイラーとビルドシステムに役立つ可能性があります。
このツールには、マクロ呼び出しを使用したソースコードインストルメンテーションが必要です。次に、これらのマクロは、コンパイル時に特定の診断(警告)を生成します。これらの診断は、スクリプトによるインスタンス化コールスタック(結果として、コールグラフの作成と視覚化を可能にします)とともにタイミングと収集が行われます。悪くない、IMO。TEMPLATE_PROFILE_ENTER()
TEMPLATE_PROFILE_EXIT()
まだ使っていません。
私はまだ試していませんが、templightは非常に有望に見えます:https ://github.com/mikael-s-persson/templight
あなたはそれらをある程度分離することができます(私は仮定していますmake
)
-E
(スイッチを使用して)ファイルのみを前処理するビルドルールを追加し.PHONY
、通常のバイナリターゲットがファイルに依存するのと同じように、プリプロセッサ出力ファイルに依存するターゲットを追加し.o
ます。このターゲットを構築するのにかかる時間を測定します'PHONY
すべてのファイルに依存しているが、.o
それらをリンクしていないターゲットを追加します。このターゲットを構築するのにかかる時間を測定します(クリーンから)- 通常のバイナリのクリーンビルドを実行するのにかかる時間を測定します
これで、前処理、コンパイル、およびリンクにかかる時間がわかりました。-O0
2番目と3番目のターゲットの最適化バージョンと非最適化()バージョンを比較して、オプティマイザーで費やされている時間を確認することもできます。
strace -e trace=process -f -r -ttt -T
少なくとも、多くのプロセスに分割されているg ++のようなコンパイラーでは、いくつかのバリアントをオンにすると、ある程度の牽引力を得ることができるかもしれません。
他の人はすでに-ftime-report
GCCのコマンドラインフラグを提案しています。これにより、コンパイラは各コンパイルフェーズで消費された時間に関する統計を出力します。欠点は、1つのユニットの要約しか表示されないことです。
私はPythonスクリプトを作成しました。このスクリプトを使用すると、プロジェクトのビルドログファイルを指定して、コンパイルフェーズごとにすべてのユニットの概要を印刷できます。また、さまざまなフェーズで並べ替えることもできます。また、2つのログファイルを比較することもできます(たとえば、変更の影響を理解しようとしている場合)。