1

私はcpp(Javaから来ました)に不慣れです。私はcppアプリケーションを書いています。アプリケーションはパフォーマンスが重要です。ロギングフレームワークを探しましたが、上記のリンクの最後にlog4cxx があり、次のことを説明するパフォーマンスセクションがあります。

ロギングが完全にオフになっている場合、または一連のレベルに対してのみオフになっている場合、ログ要求のコストは、メソッドの呼び出しと整数の比較で構成されます。

大学時代から、#ifndfログをラップするために使っていたのを覚えています。

質問:

  1. ロギングをラップすること#ifndfは今でも標準的な方法ですか?

  2. 次の擬似コードに似たものはありますか?

logger.Log_Debug(() => { "My complicated log message " + thisFunctionTakesALongTime() + " will take no time" });
4

4 に答える 4

4

リリースモードでは何もしない独自のマクロを作成できます。

#ifdef _DEBUG
#define LOG_DEBUG(x) logger.Log_Debug(x)
#else
#define LOG_DEBUG(x)
#endif
于 2012-07-26T19:09:34.123 に答える
3

条件付きでログアウトをコンパイルするマクロを作成することは、実行時にマクロをオフにしてからオンにすることと同じではありません。もちろん、条件付きコンパイルでロギングをオフにすると、メソッド呼び出しを節約できますが、ロギングを自由にオンに戻すことはできません。

メソッド呼び出しを節約できる1つの解決策はif、ロギングが有効になっているかどうかを確認し、有効になっていない場合は呼び出しをスキップするステートメントを使用して、マクロでロギングをラップすることです。これにより、呼び出しのコストを節約できます。ほとんどの場合、単純な状態チェックよりもコストがかかります。

#define LOG(X) if(logger.is_enabled) do {logger.log(X);}while(0)

複数のオーバーロードがある場合logger.logは、パラメーターのセットごとに個別のマクロを定義する必要がある場合があります。

于 2012-07-26T19:18:02.807 に答える
1

私はあなたを提案することができますboost::logginghttp://boost-log.sourceforge.net/libs/log/doc/html/index.htmlですが、現在はブーストの一部ではありません。
また#ifdef、リリースバージョンにログインする必要がない場合は、一般的な方法です。

于 2012-07-26T19:14:58.990 に答える