編集:細部をすべて説明するこの長い投稿を書いた後、問題を見つけました...誰かが私が間違っていることと、実行時間を秒単位で取得する方法について良い答えを得ることができれば(5のフロートを使用して)小数点以下の桁数程度)、承認済みとしてマークします。ヒント: 問題は、clock_getttime() の man ページをどのように解釈したかにありました。
やあ、
myOperation
実行時間を測定する必要があるという名前の関数があるとします。それを測定するために、コメントの1つでここclock_gettime()
で推奨されていたものを使用しています。
私の先生N
は、最終レポートの平均、標準偏差、および中央値を取得できるように、何度も測定することをお勧めします。myOperation
M
彼はまた、1 回だけではなく、回数を実行することを推奨しています。myOperation
が非常に高速な操作である場合、M
時間を測定することで、かかる「リアルタイム」の感覚をつかむことができます。使用されているクロックが、そのような操作を測定するために必要な精度を持っていない可能性があります。したがって、実行myOperation
が 1 回のみか、それとも 1M
回かは、使用しているクロック精度に対して操作自体に十分な時間がかかるかどうかによって異なります。
M
その時の実行に対処するのに問題があります。増加M
すると、最終的な平均値が (大幅に) 減少します。これは私には意味がありません。平均すると、A 地点から B 地点に移動するのに 3 ~ 5 秒かかります。しかし、A 地点から B 地点に移動し、A 地点に戻るのは 5 回です (10 回になります。なぜなら、A 地点から B 地点までは B 地点と同じだからです)。 A) に、あなたはそれを測定します。10 で割るよりも、得られる平均は、ポイント A から B への移動にかかる平均と同じであるはずです。つまり、3 ~ 5 秒です。
これは私のコードでやりたいことですが、うまくいきません。A から B に移動し、A に戻る回数を増やし続けると、そのたびに平均がどんどん低くなっていくので、意味がありません。
十分な理論、これが私のコードです:
#include <stdio.h>
#include <time.h>
#define MEASUREMENTS 1
#define OPERATIONS 1
typedef struct timespec TimeClock;
TimeClock diffTimeClock(TimeClock start, TimeClock end) {
TimeClock aux;
if((end.tv_nsec - start.tv_nsec) < 0) {
aux.tv_sec = end.tv_sec - start.tv_sec - 1;
aux.tv_nsec = 1E9 + end.tv_nsec - start.tv_nsec;
} else {
aux.tv_sec = end.tv_sec - start.tv_sec;
aux.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return aux;
}
int main(void) {
TimeClock sTime, eTime, dTime;
int i, j;
for(i = 0; i < MEASUREMENTS; i++) {
printf(" » MEASURE %02d\n", i+1);
clock_gettime(CLOCK_REALTIME, &sTime);
for(j = 0; j < OPERATIONS; j++) {
myOperation();
}
clock_gettime(CLOCK_REALTIME, &eTime);
dTime = diffTimeClock(sTime, eTime);
printf(" - NSEC (TOTAL): %ld\n", dTime.tv_nsec);
printf(" - NSEC (OP): %ld\n\n", dTime.tv_nsec / OPERATIONS);
}
return 0;
}
注:上記のdiffTimeClock
関数は、このブログ投稿からのものです。myOperation()
長いコードブロックを投稿する必要があるため、実際の関数を投稿しても意味がないため、実際の操作を に置き換えましたmyOperation()
。必要に応じて、コードをコンパイルするために好きなものを簡単にコーディングできます。
ご覧のとおりOPERATIONS = 1
、結果は次のとおりです。
» MEASURE 01
- NSEC (TOTAL): 27456580
- NSEC (OP): 27456580
OPERATIONS = 100
結果は次のとおりです。
» MEASURE 01
- NSEC (TOTAL): 218929736
- NSEC (OP): 2189297
OPERATIONS = 1000
結果は次のとおりです。
» MEASURE 01
- NSEC (TOTAL): 862834890
- NSEC (OP): 862834
OPERATIONS = 10000
結果は次のとおりです。
» MEASURE 01
- NSEC (TOTAL): 574133641
- NSEC (OP): 57413
さて、私は数学の達人ではありませんが、実際にはそうではありませんが、これは私にはまったく意味がありません. 私はすでにこのプロジェクトに参加している友人とこのことについて話しましたが、彼も違いを理解できません。を増やすと値がどんどん下がっていく理由がわかりませんOPERATIONS
。操作自体は、何回実行しても同じ時間かかるはずです (もちろん、平均して、まったく同じ時間ではありません)。
それは実際には操作自体、読み取られるデータ、および一部のデータが既にキャッシュとブラブラにある可能性に依存していると言うことができますが、それは問題ではないと思います。私の場合、myOperation
CSV ファイルから 5000 行のテキストを読み取り、値を分離;
してデータ構造に挿入しています。反復ごとに、データ構造を破棄して、再度初期化しています。
そういえば、私も での時間の計測に問題があり、clock_gettime()
使い方が間違っているのではないかと思います。つまり、最後の例を見てくださいOPERATIONS = 10000
。かかった合計時間は 574133641ns で、およそ 0.5 秒です。それはありえない、待っている画面を見て我慢できずに何か食べに行ったので、数分かかりました。