88

私はかなり大きなテンプレートヘッダーのみのC++ライブラリを作成する傾向があり、ユーザーは一般的にコンパイル時間について不平を言います。そのことを考えてみたら、どこに行くのかわからないことに気づきました。g ++、icc、xlCなどの一般的なコンパイラを使用してC ++コンパイルプロセスをプロファイリングする簡単な方法はありますか?たとえば、C ++コンパイルの各フェーズでどのくらいの時間が費やされているかを知ることは可能ですか?

4

8 に答える 8

71

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)以外のコンパイラについては、このスレッドの他のオプションを参照してください。

于 2014-02-18T17:36:03.210 に答える
17

Clang 9(およびそれ以降)には-ftime-traceフラグがあり、プロファイリングレポートを(オブジェクトファイルに加えて)JSONとして出力します。

このファイルをChrome(chrome://tracing)に付属のプロファイラーにインポートして、見栄えを良くすることができます。

写真

バーは、解析する必要のあるヘッダーに対応し、ヘッダーごとに、解析する必要のある特定のクラス(およびおそらく他の構成)に対応します。また、特定のテンプレートのインスタンス化に費やされた時間を報告します。

于 2020-05-16T15:46:56.877 に答える
15

Boostプロジェクトのツールがあります。これは、ほとんどすべてのコンパイラーとビルドシステムに役立つ可能性があります。

このツールには、マクロ呼び出しを使用したソースコードインストルメンテーションが必要です。次に、これらのマクロは、コンパイル時に特定の診断(警告)を生成します。これらの診断は、スクリプトによるインスタンス化コールスタック(結果として、コールグラフの作成と視覚化を可能にします)とともにタイミングと収集が行われます。悪くない、IMO。TEMPLATE_PROFILE_ENTER()TEMPLATE_PROFILE_EXIT()

まだ使っていません。

于 2014-02-17T18:01:27.933 に答える
7

私はまだ試していませんが、templightは非常に有望に見えます:https ://github.com/mikael-s-persson/templight

于 2015-10-21T17:03:35.283 に答える
5

あなたはそれらをある程度分離することができます(私は仮定していますmake

  • -E(スイッチを使用して)ファイルのみを前処理するビルドルールを追加し.PHONY、通常のバイナリターゲットがファイルに依存するのと同じように、プリプロセッサ出力ファイルに依存するターゲットを追加し.oます。このターゲットを構築するのにかかる時間を測定します
  • 'PHONYすべてのファイルに依存しているが、.oそれらをリンクしていないターゲットを追加します。このターゲットを構築するのにかかる時間を測定します(クリーンから)
  • 通常のバイナリのクリーンビルドを実行するのにかかる時間を測定します

これで、前処理、コンパイル、およびリンクにかかる時間がわかりました。-O02番目と3番目のターゲットの最適化バージョンと非最適化()バージョンを比較して、オプティマイザーで費やされている時間を確認することもできます。

于 2012-11-26T10:28:13.427 に答える
2

strace -e trace=process -f -r -ttt -T少なくとも、多くのプロセスに分割されているg ++のようなコンパイラーでは、いくつかのバリアントをオンにすると、ある程度の牽引力を得ることができるかもしれません。

于 2012-12-01T19:26:47.347 に答える
1

他の人はすでに-ftime-reportGCCのコマンドラインフラグを提案しています。これにより、コンパイラは各コンパイルフェーズで消費された時間に関する統計を出力します。欠点は、1つのユニットの要約しか表示されないことです。

私はPythonスクリプトを作成しました。このスクリプトを使用すると、プロジェクトのビルドログファイルを指定して、コンパイルフェーズごとにすべてのユニットの概要を印刷できます。また、さまざまなフェーズで並べ替えることもできます。また、2つのログファイルを比較することもできます(たとえば、変更の影響を理解しようとしている場合)。

于 2020-05-16T15:28:15.093 に答える
1

Externisは、clangと非常によく似たトレースファイルを生成するGCCプラグインです-ftime-trace

ここに画像の説明を入力してください

免責事項:私はこのプラグインの作者です。

于 2022-02-08T22:26:42.590 に答える