1

.cpp同様のデータファイルを一緒に処理するが、さまざまなサイズのファイルがたくさんあります。より大きなデータ ファイルについては、.cpp ファイル内の関数のタイミング調査を行いたいと考えています。

これらの大きなデータ セットの結果の出力を抑制し、タイミングの結果のみを出力したいと思います。小さいデータ セットの場合は、画面に出力してアルゴリズム/コードの正確性を確認したいと考えています。

適切なステートメントを繰り返しコメント/コメント解除してcout再コンパイルするのではなく、コマンドライン引数 (またはその他の手法) を使用して出力を選択的に抑制したいと考えています。

助言がありますか?私が考えることができる単純なものは use argcandargvですが、それらが異なるファイル間で関数によって使用できるグローバル変数であるかどうかはわかりません。

4

4 に答える 4

4

もちろんargv、 とargcはグローバル変数ではありませんmain()。これは、明らかに の関数スコープのローカル変数であるためです。

int main(int argc, char * argv[]) { /* ... */ }

便利なオプション処理については、 を参照してくださいgetopt.h


出力を抑制する 1 つの方法はgrep、シェルでファイル リダイレクトを使用することです ( time ./prog > /dev/null) が、それでも実際の出力関数のコストが発生します。

2 つの考えられるアイデアを提案します。

  1. 重要な機能を呼び出しで囲みclock()、測定と報告を自分で行います。

  2. ユーザーが詳細パラメーターを渡して (実行時にコマンドライン オプションを使用するか、コンパイル時に を使用して#define)、詳細レベルに応じてのみ出力できるようにします。

アイデア (1) では、次のマクロを使用します。

#define CLOCK_TICK(acc, ctr)  ctr = std::clock()
#define CLOCK_TOCK(acc, ctr)  acc += (std::clock() - ctr)
#define CLOCK_RESET(acc) acc = 0
#define CLOCK_REPORT(acc) 1000. * double(acc) / double(CLOCKS_PER_SEC)

アイデア (2) については、次のようにします。

#ifndef VERBOSE
#  define VERBOSE 0
#endif

#if VERBOSE > 0
// print level 1
#if VERBOSE > 1
// print level 2
#endif
#endif

次に、etc. でコンパイルし-DVERBOSE=3て、特定のレベルでロギングを有効にすることができます。

これが手動すぎる場合は、アプリケーションの適切なロギング フレームワークを調べる必要があります。

于 2011-09-20T22:20:51.197 に答える
2

デフォルトでは、出力のために使用する必要があるのは stdout (as cout) と stderr (as cerr) だけです。

したがって、いくつかのオプションは次のとおりです。

  • タイミングを stdout ではなく stderr に書き込み、それらをコマンド ラインの別の場所にパイプします。
  • タイミングデータのログファイルを開き、それに書き込みます
  • 出力の各行に「[timing]」などのタグを付けてgrepから、コマンドラインで使用して、見たい出力行のみを表示します。
于 2011-09-20T22:21:32.063 に答える
0

通常、プリプロセッサ ディレクティブを使用してそれを行います。

/*inside file_name.cpp*/

//uncomment next line to activate debug print on this file
//#define FILE_NAME_DEBUG  
#ifdef FILE_NAME_DEBUG
cout << "activate debug print\n";
#endif

このアプローチでは、print ステートメントを選択的に抑制することができますが、毎回モジュールを再コンパイルする必要があります。

于 2011-09-20T22:21:28.117 に答える