6

パフォーマンスを測定しようとしている実験ライブラリがあります。これを行うために、私は次のように書きました:

struct timeval begin;
gettimeofday(&begin, NULL);
{
    // Experiment!
}
struct timeval end;
gettimeofday(&end, NULL);

// Print the time it took!
std::cout << "Time: " << 100000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;

時折、私の結果には負のタイミングが含まれ、そのいくつかは無意味です。例えば:

Time: 226762
Time: 220222
Time: 210883
Time: -688976

どうしたの?

4

5 に答える 5

6

タイプミスがあります。最後の行を修正しました(0の数に注意してください):

std::cout << "Time: " << 1000000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;

ところで、timersub2つの時間値の差を取得するための組み込みメソッドです。

于 2010-05-06T10:35:55.307 に答える
4

posixリアルタイムライブラリは、高精度の間隔の測定に適しています。あなたは本当に現在の時刻を知りたくありません。2つのポイントの間にどれくらいの時間が経過したかを知りたいだけです。それが単調時計の目的です。

struct timespec begin;
clock_gettime( CLOCK_MONOTONIC, &begin );
{
    // Experiment!
}
struct timespec end;
clock_gettime(CLOCK_MONOTONIC, &end );

// Print the time it took!
std::cout << "Time: " << double(end.tv_sec - begin.tv_sec) + (end.tv_nsec - begin.tv_nsec)/1000000000.0 << std::endl;

リンクするときは、を追加する必要があります-lrt

単調時計を使用することにはいくつかの利点があります。多くの場合、ハードウェアタイマー(Hzクリスタルなど)を使用するため、。よりも高速な呼び出しであることがよくありますgettimeofday()。また、単調なタイマーは、ntpdまたはユーザーがシステム時刻を間違えている場合でも、決して逆行しないことが保証されています。

于 2010-05-06T15:03:24.670 に答える
3

std :: cout << "Time:" << 100000 *(end.tv_sec --begin.tv_sec)+(end.tv_usec --begin.tv_usec)<< std :: endl;

前述のように、1秒間に1000000のusecがあり、100000ではありません。

より一般的には、コンピューターのタイミングが不安定であることに注意する必要があります。などのプロセスはntpd、クロック時間を変更し、誤ったデルタ時間をもたらす可能性があります。などのPOSIX機能に興味があるかもしれませんtimer_create

于 2010-05-06T10:38:59.683 に答える
3

あなたは負の値を処理しましたが、それでも正しくありません。ミリ秒変数の違いは誤りです。たとえば、開始時刻と終了時刻が1.100秒と2.051秒であるとします。受け入れられた答えによると、これは1.049秒の経過時間になりますが、これは正しくありません。

次のコードは、ミリ秒の差だけがあり、秒の差がない場合と、ミリ秒の値がオーバーフローする場合を処理します。

if(end.tv_sec==begin.tv_sec)
printf("Total Time =%ldus\n",(end.tv_usec-begin.tv_usec));
else
printf("Total Time =%ldus\n",(end.tv_sec-begin.tv_sec-1)*1000000+(1000000-begin.tv_usec)+end.tv_usec);
于 2014-07-18T19:51:07.917 に答える
-1

行う

$ time ./proxy-application

次の時間

于 2010-05-06T12:04:02.663 に答える