0

次の状況でのメンバー関数の呼び出しにおけるパフォーマンスの低下について質問があります。

私は物理計算のコードに取り組んでおり、巨大な行列や線形代数などを操作するなど、多くの時間のかかるタスクがあります。ログ ファイルを処理するクラスを設計しました。と呼ばれるブール型debug_mode_ontrue. 関数のシグネチャは

void write_debug_msg(const data_type1 &text1, const data_type2 &text2, etc)

インライン化され、テンプレート化され、オーバーロードされたもの。入力として、任意の型の最大 15 個の引数を受け取ることができます。

debug_mode_onわかりました...問題は、いつfalse関数が呼び出され、何も行われないかです。それ以外の場合は、明らかに、引数がログ ファイルに書き込まれます。それでは、かなりのペナルティパフォーマンスはありますか?私のポイントは、それがvoid関数型であるという事実であり、戻り値はありません。すべての引数は参照として与えられます。また、インライン化されています。私の見解では、真のペナルティは bool 型 (aifではなくswitchステートメント) の評価だけです。そうですか?

switchまたは、参照によって与えられた引数を使用したインライン化された void 関数の呼び出しは、何らかの形で高価になる可能性があり、ステートメントよりも評価について話しているのでしょうか?

もちろん、この問題を攻撃するために使用されたのと同じ戦略に従っているわけではありません。つまり、デバッグ モードに関するすべてのものを、 や などのマクロで囲み#ifdef DEBUG_MODEます#endif。ランタイムでデバッグモードを制御できるようにするためだけに、このようにしています。

4

4 に答える 4

3

パフォーマンスの低下を確認する唯一の方法は、コードをプロファイラーで実行し、パフォーマンスを最適化する価値があるかどうかを確認することです。そうしないと、存在するかどうかわからない問題について心配することに時間を費やしていることになります。

于 2013-11-15T01:14:56.783 に答える
2

おそらくパフォーマンスへの影響はありません。ただし、本当に心配な場合は、プロファイルを作成する必要があります。アプリケーション全体をプロファイリングするか、関連する呼び出しセマンティクスを小さなスタンドアロン アプリケーションに複製して gprof などを使用することができます。

于 2013-11-15T01:19:34.227 に答える
0

問題は、この debuggin メッセージ関数が記述されている場所が完全に恣意的であることです。つまり、このコードの各開発者 (im woking with humberto) までです。これらの関数がこの変数 debug_mode_on が true かどうかを常にチェックしている場合、頻繁に呼び出されるとパフォーマンスが低下するのではないかと心配しました。コードのテスト バージョンでは問題ありませんが、最終バージョン (ユーザーが処理するバージョン) は、デバッグ メッセージをどこに置いたかに依存する必要があるのはなぜですか? そのため、コード内のステートメントの #ifdef DEBUG を使用して、コンパイル中に両方のバージョンを分離することを提案しました。私はこれらのことの専門家ではないので、些細なことについて心配しているかもしれません。すべての提案は歓迎されます。私は自分の見解を述べたかっただけです。ありがとう。

于 2013-11-15T16:52:07.000 に答える