31

関数にかかる時間を測定しようとしています。

少し問題があります。正確にフローティングポイントを使用しようとしていますが、を使用してコードを印刷するたびに、%lf次の2つの答えのいずれかが得られます1.000。...または0.000...これにより、コードが正しいかどうか疑問に思います。 :

#define BILLION  1000000000L;

// Calculate time taken by a request
struct timespec requestStart, requestEnd;
clock_gettime(CLOCK_REALTIME, &requestStart);
function_call();
clock_gettime(CLOCK_REALTIME, &requestEnd);

// Calculate time it took
double accum = ( requestEnd.tv_sec - requestStart.tv_sec )
  + ( requestEnd.tv_nsec - requestStart.tv_nsec )
  / BILLION;
printf( "%lf\n", accum );

このコードのほとんどは私が作成したものではありません。このサンプルページには、次の使用法を示すコードが含まれていますclock_gettime

誰かが私に何が間違っているのか、またはなぜ私がint値だけを取得しているのか教えてもらえますか?

4

4 に答える 4

27

整数を整数で割ると整数になります。これを試して:

#define BILLION 1E9

また、行末にセミコロンを使用しないでください。#defineはプリプロセッサディレクティブであり、ステートメントではありません。セミコロンを含めると、BILLIONとして定義され1000000000L;ます。これは、ほとんどのコンテキストで使用しようとすると壊れます。式の最後と括弧の外で使用したので、ラッキーになりました。

于 2010-10-15T23:28:05.250 に答える
9

( requestEnd.tv_nsec - requestStart.tv_nsec )は整数型であり、常に。未満でBILLIONあるため、整数演算で一方を他方で除算した結果は常に。になります0。除算を行う前に、減算の結果をたとえばにキャストする必要がありますdouble

于 2010-10-15T23:29:00.053 に答える
1

(requestEnd.tv_nsec --requestStart.tv_nsec)は負の値になる可能性があることに注意してください。この場合、tv_secの差から1秒を減算し、tv_nsecの差に10億を加算する必要があります。

于 2016-12-02T14:11:44.283 に答える
1

質問がずっと前に投稿されたことは知っていますが、コードサンプルのように経過時間を秒ではなくナノ秒(またはミリ秒)に「変換」することを提案する答えはまだ見つかりません。

アイデアを説明するためのサンプルコードフラグメント:

long long accum = ( requestEnd.tv_nsec - requestStart.tv_nsec )
 + ( requestEnd.tv_sec - requestStart.tv_sec ) * BILLION;

このようにして、一部のプラットフォームでは重い可能性がある浮動小数点演算を回避できます...

于 2017-08-05T14:12:33.403 に答える