gprofとcallgrindを何度も使用してきましたが、大規模な(車全体をロードするCADプログラムのように)プログラムを処理する場合、これらを効率的に使用できないという(明らかな)結論に達しました。たぶん、C / C ++ MACROの魔法を使って、どういうわけか単純な(しかし素晴らしい)ロギングメカニズムを構築できるのではないかと思っていました。たとえば、次のマクロを使用して関数を呼び出すことができます。
#define CALL_FUN(fun_name, ...) \
fun_name (__VA_ARGS__);
関数呼び出しの前後にクロッキング/タイミングを追加して、CALL_FUNで呼び出されるすべての関数のタイミングを調整することができます。
#define CALL_FUN(fun_name, ...) \
time_t(&t0); \
fun_name (__VA_ARGS__); \
time_t(&t1);
変数t0、t1は、グローバルロギングオブジェクトで見つけることができます。そのロギングオブジェクトは、 CALL_FUNを介して呼び出された各関数の呼び出しグラフを保持することもできます。その後、そのオブジェクトを(特別にフォーマットされた)ファイルに書き込んで、他のプログラムから解析することができます。
それで、ここに私の(最初の)質問があります:このアプローチは扱いやすいと思いますか?はいの場合、それをどのように強化できますか?そうでない場合は、時間を測定してコールグラフを記録するためのより良い方法を提案できますか?
同僚は、この問題に対処するための別のアプローチを提案しました。これは、各関数(ログに記録する必要がある)に特定のコメントを付けることです。次に、makeプロセス中に、特別なプリプロセッサを実行し、各ソースファイルを解析し、ログに記録する関数ごとにログロジックを追加し、新しく追加された(解析)コードを使用して新しいソースファイルを作成し、代わりにそのコードをビルドする必要があります。CALL_FUN ...マクロ(私の提案)をあちこちで読むのは最善のアプローチではないと思います。彼のアプローチはこの問題を解決するでしょう。では、このアプローチについてどう思いますか?
PS:私はC / C ++マクロの落とし穴に精通していないので、これが別のアプローチを使用して開発できる場合は、そう言ってください。
ありがとうございました。