2
bool kDebuggingEnabled = NO;
...
for(i=0; i<length; i++){
 ...
 if (kDebuggingEnabled) {
  NSLog (@"Value of variable # %i",$resultingOptions);
 }
}

私のアプリがライブになるたびに、私のコードは NSLog に関して毎回条件をチェックします。コードのパフォーマンスを向上させるより良い方法はありますか?

4

3 に答える 3

5

プリプロセッサ マクロを使用して、ログのオンとオフを切り替えることができます。良い例は、 Cocoa is My GirlfriendブログDLogの Marcus Zarra のマクロです。

#ifdef DEBUG
    #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
#else
    #define DLog(...) do { } while (0)
#endif

上記を prefix.pch ファイルに配置し、NSLogステートメントをDLogステートメントに置き換えるだけです。DEBUGまた、デバッグ ビルド構成で が設定されて いることを確認する必要があります。

このようなプリプロセッサ マクロを使用すると、ロギング コードがリリース ビルドにコンパイルされないため、ログ ステートメントのパフォーマンス ヒットが発生しません。

ブログ投稿には、アサーションを処理するためのその他の便利なマクロも含まれています。

于 2012-08-24T04:37:15.453 に答える
2

次の 3 つの選択肢があります。

1) ビルド時にログを有効/無効にする場合。プリプロセッサ ソリューションが最適です。

// define MY_ENABLE_LOGS in your build settings for the debug configuration only, for example
#ifdef MY_ENABLE_LOGS
#define MYLog(...) NSLog(__VA_ARGS__)
#else
#define MyLog(...) do { } while(0)
#endif

2)実行時にログを有効/無効にしたい場合(たとえば、いくつかの非表示の設定に基づいて)、あなたのソリューションがおそらく最適です。ただし、少し最適化するようにコンパイラーにヒントを与えることができます。

// tell the compiler it's unlikely that kDebuggingEnabled will be true
#define MYLog(...) do { if (__builtin_expect(kDebuggingEnabled, 0)) { NSLog(__VA_ARGS__); } } while(0)

3) 最後のオプションはもう少し複雑ですが、単なるログよりも豊富な情報を提供でき、提供する予定のログの種類にのみ依存します。アイデアは、dtrace でカスタム プローブを使用することです (Instruments 内でも使用できます)。これは OS X でのみ機能します (iOS では機能しません)。たとえば、http://www.macresearch.org/tuning-cocoa-applications-using-dtrace-custom-static-probes-and-instrumentsを参照してください。

必要に応じて、1) と 2) を混在させることができます。3) は、プローブがトレースされていない場合はほとんどコストがかからず、単純なログ文字列よりもはるかに豊富な情報を提供できます。

これらのソリューションに関する 1 つの注意点: MY_ENABLE_LOGS が定義されていない場合、ログの引数は評価されず、アプリケーションの動作が変わる可能性があります。

于 2012-08-24T05:25:31.707 に答える
1

プリプロセッサ マクロを使用して、デバッグ用にビルドしているかどうかを確認します。

#if DEBUG
// do stuff
#end

プリプロセッサ (コンパイラの前に実行されるもの) が DEBUG を true と評価すると、コンパイラがコンパイルできるようにコードが保持されますが、DEBUG が存在しないか false の場合、そのコードは消去されます。

于 2012-08-24T04:31:18.140 に答える