web-dev-qa-db-ja.com

関数の所要時間の測定:clock_gettime

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

私は少し問題があります:正確にしようとしていますが、浮動小数点を使用していますが、%lfを使用してコードを印刷するたびに、2つの答えの1つが得られます: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の使用を示すコードがありました。 http://www.users.pjwstk.edu.pl/~jms/qnx/help/watcom/clibref/qnx/clock_gettime.html

誰が間違っているのか、なぜ整数値しか取得できないのかを教えてもらえますか?

どうもありがとうございました、

ヤリー

26
Jary

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

#define BILLION 1E9

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

26
Marcelo Cantos

( requestEnd.tv_nsec - requestStart.tv_nsec )は整数型であり、常にBILLIONよりも小さいため、整数演算で互いに除算した結果は常に0。減算の結果をキャストする必要がありますdoubleは除算を行う前に。

9

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

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

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

このようにして、一部のプラットフォームでは重いかもしれない浮動小数点演算を避けることができます...

1
AntonK

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

0
Wayfarer