これは、関数の呼び出し方法を変更しません。ただし、すべての関数をプロファイリングできるようにしたい場合は、おそらくあまり役に立ちません。
static inline int real_function() {
// previous contents of function(), with no tic or toc
}
int function() {
tic();
int r = real_function();
toc();
return r;
}
誰もが言うように、プロファイラーを使用すると、長期的には多くの労力を節約できます。彼らが言っていないように:あなたのプラットフォームにそれがある場合。
そうでない場合、最も簡単な方法は、(コーディング ルールとして) 関数には 1 つの終了ポイントのみが必要であり、その終了ポイントはマクロ経由でなければならないということです。その後、入口と出口でコードを使用してすべての関数を手動で計測できます。複数の戻り値を持つレガシー関数は、上記のようにまとめることができます。
また、このようなことをしているときは、コンパイラが混乱する可能性があることに注意してください。あなたはこれを書くかもしれません:
tic();
do_something();
int i = something_else();
toc();
return i;
コンパイラは、something_else に副作用がないと判断した場合、something_else にかなりの時間がかかりますが、コードを次のように変更する可能性があります。
tic();
do_something();
toc();
return something_else();
また、プロファイル データは、関数に費やされた時間を過小評価します。もう 1 つの理由は、実際のプロファイラーが非常に優れていることです。それは、コンパイラーと連携できます。