6

次のプログラムでは、ジョブ (for ループ) の実行時間を測定しようとしました。ほとんどの場合は問題なく動作しますが、時には負の値が返されることもあります!! 私の最初の推測は、変数がオーバーフローする可能性があるということです。私が正しいかどうかに関係なく、誰か教えてください。どうすれば問題を解決できますか?

ありがとう

int main(int argc, char **argv) 
{
long int ST;
long int ET;
struct timespec gettime_now;
clock_gettime(CLOCK_REALTIME, &gettime_now);
ST= gettime_now.tv_nsec;
for (i=0; i < 1000; i++)
  a[i]=b[i];
clock_gettime(CLOCK_REALTIME, &gettime_now);
ET= gettime_now.tv_nsec;
printf("Time diff: %ld\n", ET-ST);
}
4

1 に答える 1

12

どちらの場合も無視しtv_secており、との tv_nsec が異なる秒である可能性があるstruct timespecため、正しくないナノ秒を使用しているだけです。STEV

から、

tv_sec- エポックからの秒数を表す

tv_nsec-ナノ秒精度の現在の秒 (1/1000000000 秒)

違いを見つけるには、独自の関数を作成することをお勧めします。サンプルコード (未テスト)、

timespec diff(timespec start, timespec end)
{
    timespec temp;

    if ((end.tv_nsec-start.tv_nsec)<0
    {
            temp.tv_sec = end.tv_sec-start.tv_sec-1;
            temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    }
    else 
    {
            temp.tv_sec = end.tv_sec-start.tv_sec;
            temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}

実際の機能と例については、こちらを参照してください。diff

于 2013-07-17T17:01:24.927 に答える