関数にかかる時間を測定しようとしています。
私は少し問題があります:正確にしようとしていますが、浮動小数点を使用していますが、%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
誰が間違っているのか、なぜ整数値しか取得できないのかを教えてもらえますか?
どうもありがとうございました、
ヤリー
整数を整数で割ると整数になります。これを試して:
#define BILLION 1E9
また、行末にセミコロンを使用しないでください。 #define
は文ではなくプリプロセッサディレクティブであり、セミコロンを含めると、BILLIONが1000000000L;
。ほとんどのコンテキストで使用しようとすると壊れます。式の最後と括弧の外でそれを使用したので、あなたは幸運になりました。
( requestEnd.tv_nsec - requestStart.tv_nsec )
は整数型であり、常にBILLION
よりも小さいため、整数演算で互いに除算した結果は常に0
。減算の結果をキャストする必要がありますdouble
は除算を行う前に。
質問がずっと前に投稿されたことは知っていますが、コードサンプルのように、経過時間を秒ではなくナノ秒(またはミリ秒)に「変換」することを示唆する答えはまだありません。
アイデアを説明するためのサンプルコードフラグメント:
long accum = ( requestEnd.tv_nsec - requestStart.tv_nsec )
+ ( requestEnd.tv_sec - requestStart.tv_sec ) * BILLION;
このようにして、一部のプラットフォームでは重いかもしれない浮動小数点演算を避けることができます...
(requestEnd.tv_nsec-requestStart.tv_nsec)が負になる可能性があることに注意してください。この場合、tv_secの差から1秒を減算し、tv_nsecの差に1億を追加する必要があります。