2017-08-15 8 views
-2

function1()function3()の合計経過時間を測定するには?C++繰り返し呼び出される関数の時間を測定する

実際の状況では、function1()function3()が複雑なプログラムに散在しています。私はtimerを開始して停止する関数の名前を使用できる何かが必要なので、最終的に各関数の合計時間を表示することができます。

function1()の時間が必要な値ではありませんのでご注意ください。 何度も何度も呼ばれているfunction1()の時間が必要です。さん)(

1)一時的に名前変更はfunction1:プロファイラを実行

int function1() 
{ 
    int i = 1; 
    i++; 
    return i; 
} 
int function2() 
{ 
    int i = 1; 
    i++; 
    return i; 
} 
int function3() 
{ 
    int i = 1; 
    i++; 
    return i; 
} 
int main(int argc, char *argv[]) 
{ 
    size_t t = 0; 

    while (t < 1000000) 
    { 
     // I want something like startTimer(function1) 
     function1(); 
     // I want something like pauseTimer(function1) 
     function2(); 
     // I want something like startTimer(function3) 
     function3(); 
     // I want something like pauseTimer(function3) 
    } 
    // printTimer() here will print the total elapsed time of function 1 and 
    //function 3 
    getchar(); 
    return 0; 
} 
+2

あなたの例がコンパイルされていないことに加えて、すでに何か試しましたか?私は実際に何が問題なのか分かりません。これを達成するために 'std :: chrono'の関数を使うことができます。 – user0042

+0

すみません。コードは私が書いているものではなく、現実の状況を反映しています。私はそれをコンパイルするために編集しました。私は、タイマー管理のためにstd :: mapを使用しましたが、オーバーヘッドが大きすぎます。私はstd :: chronoをコア部分で使っていました。一度起こったときに、単一の機能が痛む時間を測定することは容易である。関数がどこにでも散在し、合計時間を測定する必要があるのは難しい –

+4

おそらくプロファイリングツールが必要です。 – user0042

答えて

1

はおそらくそれを行うための最善の方法ですが、あなたには、いくつかの理由のためにそれを行うことができない場合は、次の操作を行うことができ実施例function1_implementation()(または類似)

2)は、このようなはfunction1の新しい一時的な実装()書く:

static unsigned long long totalMicrosInFunction1 = 0; 

// Returns current system-clock-time, in microseconds 
static unsigned long long get_current_time_in_microseconds() 
{ 
    // This may not be the best way to implement this function; see below 
    struct timeval tv; 
    gettimeofday(&tv, NULL); 
    return ((unsigned long long)tv.tv_sec)*1000000 + tv.tv_usec; 
} 

int function1() 
{ 
    unsigned long long startTime = get_current_time_in_microseconds(); 
    int ret = function1_implementation(); // call the real code! 
    unsigned long long endTime = get_current_time_in_microseconds(); 

    totalMicrosInFunction1 += (endTime-startTime); 
    return ret; 
} 

3)時間にしたい任意の他の機能のためのトリックの同じ種類を行います。

...プログラムを再コンパイルし、main()の最後にtotalMicrosInFunction1の現在の値を出力します。

上記のget_current_system_time_in_microseconds()の実装は、ご使用のケースでは最適ではない可能性があります。 C++ 11を使用している場合は、代わりにstd::chrono::high_resolution_clockを使用できます。それ以外の場合は、Windowsの下でQueryPerformanceCounter()のようなOS固有のAPIを使用できます。

+0

時間プロファイリングツールを使用している場合、プログラムに1000を超える機能があり、そこに私が興味を持っているのは10個の機能だけです。その10個の機能だけを表示するオプションがありますか?おそらく; –

+0

;もちろん、使用しているツールに依存します。 –

1

CPUモジュールが1つのPCで実行していると仮定すると、rdtscp命令を使用してティック数を取得できます。ダニを蓄積する。完了したら、ティックを時間に変換すると、完了です。

Windowsでrdtscpを実行する方法については、https://msdn.microsoft.com/en-us/library/bb385235.aspxをご覧ください。

これは、スレッドが1つしかないと仮定して書かれています。

ここで、変数「unsigned __int64 totalTicks = 0;」を作成します。ファイルスコープで

次のように機能1が書き込まれることになる。

int function1() 
{ 
    unsigned int arg; 
    unsigned __int64 startTicks = __rdtscp(&arg); // arg is not used 
    int ret = function1_implementation(); // call the real code! 
    unsigned __int64 endTicks = __rdtscp(&arg); 
    totalTicks += (endTicks - startTicks); 

    return ret; 
} 

ティックは、CPUクロックレートの逆数であるため、2.5GHzのCPUは第二に25億ティックを有するであろう。

また、私が記述するコア機能を実行するTimerクラスを作成することもできます.2つの値を返すstart()メソッドとstop()メソッドを作成し、deltaを返すelapsed()メソッドを作成できます。関数の先頭でstart()を呼び出し、最後にelapsed()を呼び出します。独自のタイマーを必要とする関数であれば、Timerの別のインスタンスを使用できます。

これにより、最新のCPUでサブナノ秒の解像度が得られます。単調な時間を使用すると、関数が小さく高速であれば、十分な解を得られない可能性があります。これは、通常は統計的にサンプリングするので、10ミリ秒のクロックレート(Linuxの場合はgprof)でプロファイラーを使用する場合の問題であるため、正確なカウントが得られますが、時間の見積もりの​​みです。

関連する問題