bool kDebuggingEnabled = NO;
...
for(i=0; i<length; i++){
...
if (kDebuggingEnabled) {
NSLog (@"Value of variable # %i",$resultingOptions);
}
}
私のアプリがライブになるたびに、私のコードは NSLog に関して毎回条件をチェックします。コードのパフォーマンスを向上させるより良い方法はありますか?
bool kDebuggingEnabled = NO;
...
for(i=0; i<length; i++){
...
if (kDebuggingEnabled) {
NSLog (@"Value of variable # %i",$resultingOptions);
}
}
私のアプリがライブになるたびに、私のコードは NSLog に関して毎回条件をチェックします。コードのパフォーマンスを向上させるより良い方法はありますか?
プリプロセッサ マクロを使用して、ログのオンとオフを切り替えることができます。良い例は、 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
また、デバッグ ビルド構成で が設定されて いることを確認する必要があります。
このようなプリプロセッサ マクロを使用すると、ロギング コードがリリース ビルドにコンパイルされないため、ログ ステートメントのパフォーマンス ヒットが発生しません。
ブログ投稿には、アサーションを処理するためのその他の便利なマクロも含まれています。
次の 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 が定義されていない場合、ログの引数は評価されず、アプリケーションの動作が変わる可能性があります。
プリプロセッサ マクロを使用して、デバッグ用にビルドしているかどうかを確認します。
#if DEBUG
// do stuff
#end
プリプロセッサ (コンパイラの前に実行されるもの) が DEBUG を true と評価すると、コンパイラがコンパイルできるようにコードが保持されますが、DEBUG が存在しないか false の場合、そのコードは消去されます。