2017-02-27 7 views
-1

特定の機能の合計時間を測定したいとします。この関数は他の関数(f1とf2)を呼び出します。だから私はf1とf2の合計時間を計算したいと思います。私は期待していた何clock_getime内のclock_gettimeの方法は?

f total time = f1 total time + f2 total time

void f(){ 
    struct timespec total_start, total_end; 
    struct timespec f1_start, f1_end; 
    struct timespec f2_start, f2_end; 

    clock_gettime(CLOCK_MONOTONIC, &total_start); 

     clock_gettime(CLOCK_MONOTONIC, &f1_start); 
     f1(); 
     clock_gettime(CLOCK_MONOTONIC, &f1_end); 

     clock_gettime(CLOCK_MONOTONIC, &f2_start); 
     f2(); 
     clock_gettime(CLOCK_MONOTONIC, &f2_end); 

    clock_gettime(CLOCK_MONOTONIC, &total_end); 

    f_total_time = (total_end.tv_sec - total_start.tv_sec) + (total_end.tv_nsec - total_start.tv_nsec)/1e9 ; 

    f1_total_time = (f1_end.tv_sec - f1_start.tv_sec) + (f1_end.tv_nsec - f1_start.tv_nsec)/1e9 ; 

    f2_total_time = (f2_end.tv_sec - f2_start.tv_sec) + (f2_end.tv_nsec - f2_start.tv_nsec)/1e9 ; 
} 

私の質問がありました、これは関数内の関数の時間を測定するための正しい方法です。

問題:私が直面している問題は、f1とf2の合計時間がfの合計時間に足りないことです。すなわちf total time != f1 total time + f2 total time実際に何が起こるのですかf total time > f1 total time + f2 total time

私は何か間違っていますか?

+1

'clock_gettime'を呼び出すのに少し時間がかかるので、合計時間が個々の関数呼び出しの時間を超えるのは当然です。何も間違っていません。あなたがそれを避けたいのであれば、関数時間をあなた自身で追加してください:*関数時間を計算した後、 'f_total_time = f1_total_time + f2_total_time;'。 –

+0

C++を使用していますか? –

+0

これは間違っていますが、 'clock_gettime'の呼び出しには時間がかかります! –

答えて

0

C++アプリケーション、変数の最初の時間に注意し、そして宣​​言時間(秒)クロノするには:

duration = (clock() - t)/CLOCKS_PER_SEC; 
0

回答:実行中

#include "time.h" 
clock_t t (clock()); 
size_t duration (0); 

を、継続時間がこのように更新されます -

はい。 IMHO関数内の関数の有効期間測定技術 のようです。

Posixのclock_gettime()は固定の 時間からsec/nanosecondsを報告します。したがって、各アクセスは他と独立しています。

「男にclock_gettimeの」From:

すべての実装は、CLOCK_REALTIMEで識別されるシステム全体のリアルタイムクロック、 をサポートしています。その時間は、エポックから 秒とナノ秒を表します。時間が に変更された場合、相対間隔のタイマーは影響を受けませんが、絶対時点のタイマーは タイマーに影響します。

あなたのアプローチに間違いはありません。

コードの相対的な持続時間と、使用しているクロック読み取り機構の持続時間についてもっと知る必要があるかもしれません。古いDellの上で私のUbuntu 15.10、オン


、G ++ 5.2.1を使用して、Posixの コール

clock_gettime(CLOCK_REALTIME, ...) 

は> 1500のNS(3秒以上の平均)を使用しています(すなわち〜1.5 US)いくつかの再現性の尺度、あなたが 測定しようとしている期間((F1)とf2()とF1()+ F2())を達成するために

はおそらく10倍以上 これでなければなりません。

あなたのシステムは(私のものとは)異なりますので、これらのクロックの読み込み時間を把握するには、 にテストする必要があります。

CLOCK_REALTIMEがどれくらい速いかを知るという興味深い考えもあります。 APIが ナノ秒を示しても、それほど速くない可能性があります。


私が使用する代替は〜(私のシステム上の)5ナノ秒、以下3桁のコストでのstd ::時間(nullptr)です。 FYI :: :: time(0)は同じものを測定します。

戻り値が以前の の値から変更されたときに、このAPIリターンで制御されるループは、最後に 秒でキックアウトされます。私は通常、3秒間のループを蓄積し(すなわち、固定時間 試験時間)、平均イベント期間を計算する。

例の測定出力:

751.1412070 M 'std::time(nullptr) duration' invocations in 3.999,788 sec (3999788 us) 
187.7952549 M 'std::time(nullptr) duration' events per second 
5.324948176 n seconds per 'std::time(nullptr) duration' event 

あなたの機能のためのイベントごとの秒を計算する際に、このクロック・アクセスを使用して、あなたは、単に各呼び出しから(私の システム上の)5.3ナノ秒を引くことができます。


注:任意のPosix API 機能を提供するシステムへのインタフェースではなく、関数自体です。

APIの一部であることは、 関数の実装についての決定的な証拠ではありません。どの言語でも使用できますが、ピークパフォーマンスでは ですらあります。

+0

"CLOCK_MONOTONIC"を使用していることに気づきました。私はCLOCK_REALTIMEしか使用していません。私が指摘した問題と10倍のアイデアは依然として有効だと思います。 –

関連する問題