4

clock_gettime非推奨を参照として使用して、の信頼性を確認したかったのgettimeofdayですが、時々奇妙な結果が得られます。

#include <stdio.h>
#include <sys/time.h>
#include <iostream>

void clock_gettime_test()
{
    struct timespec tp;
    clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
    long a = tp.tv_nsec;
    usleep(250000);
    clock_gettime(CLOCK_MONOTONIC_RAW, &tp);
    long b = tp.tv_nsec;
    printf("clock_gettime (%ld - %ld): %lf msec\n", b, a, (b - a)/1000000.0);
}

void gettimeofday_test()
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    long a = tv.tv_usec;
    usleep(250000);
    gettimeofday(&tv, NULL);
    long b = tv.tv_usec;
    printf("gettimeofday (%ld - %ld): %lf msec\n", b, a, (b - a)/1000.0);
}

int main()
{
    clock_gettime_test();
    gettimeofday_test();
    return 0;
}

構築して実行すると、正しい結果が得られることがあります。

$ g++ -Wall play.cpp -lrt && ./a.out
clock_gettime (392441961 - 142299879): 250.142082 msec
gettimeofday (592906 - 342644): 250.262000 msec

しかし、時々、私はそれほど幸運ではありません:

clock_gettime (155321165 - 905000848): -749.679683 msec
gettimeofday (352232 - 101938): 250.294000 msec

あるいは:

clock_gettime (947857371 - 697373625): 250.483746 msec
gettimeofday (225208 - 974908): -749.700000 msec

これをi686とamd64の両方で試しましたが、同様の結果が得られました。私も試しnanosleepましたが、同じ悲しい結果になりました。

4

2 に答える 2

6

tv_nsecのメンバーのみを比較していますが、メンバーstruct timespecも比較する必要があります。tv_sec

double msec = ((tpb.tv_sec - tpa.tv_sec) * 1000.0)
            + ((tpb.tv_nsec - tpa.tv_nsec) / 1000000.0);

同様に、tv_sectv_usecのメンバーの両方を比較struct timevalして、経過時間を取得する必要があります。

double msec = ((tvb.tv_sec - tva.tv_sec) * 1000.0)
            + ((tvb.tv_usec - tva.tv_usec) / 1000.0);
于 2012-07-31T09:46:44.710 に答える
0

Unix、C、および C++ 関数リファレンスから:

timeval には 2 つのコンポーネントがあり、どちらも int です。1 つ (tv_sec と呼ばれる) は、1970 年 1 月 1 日からの秒数である time によって返される正確な値です。もう 1 つの (tv_usec と呼ばれる) は、その秒のマイクロ秒数です。

したがって、tv_usec は 1 秒ごとにリセットされます。だからこそ、この結果が得られます。秒を考慮に入れると、おそらく 1000 ミリ秒 - 749.679683 ミリ秒 ~ 250 ミリ秒のようなものになるでしょう。

于 2012-07-31T09:56:06.113 に答える