1

次のコード スニペットがあり、CPU の所要時間を評価しようとしています。

しかし、私はいくつかの奇妙な結果を得ています

struct timeval begin, end;
double cpu_time=0.0;
gettimeofday(&begin, NULL);
long cpu_sum = 0;


for (i = 0; i < size; i++) {
 cpu_sum += array[i] * array[i];
}    
 gettimeofday(&end, NULL);
 cpu_time = end.tv_sec - begin.tv_sec * 1000;
 cpu_time += (end.tv_usec - begin.tv_usec) / 1000;

 printf("calculated sum: %d using CPU in %lf ms \n", cpu_sum, cpu_time);

サンプル結果 = 1296217442.000000 ミリ秒

これはミリ秒単位の正しい時間値だとは思いません。ここで何が問題なのか誰でも助けることができますか?

どんな助けでも大歓迎です。

ありがとう

4

4 に答える 4

13

演算子の優先順位を修正する必要があります。

cpu_time = (end.tv_sec - begin.tv_sec) * 1000;
cpu_time += (end.tv_usec - begin.tv_usec) / 1000;

オリジナルではbegin.tv_sec、1000 を掛けてから、それを から引いていend.tv_secます。

また、gettimeofday()厳密にはCPU時間ではなく、「ウォールクロック時間」を測定するものではありません。後者は、プロセスにかかった「CPU労力」のより良い測定値です。別のプロセスが同時に CPU を使用している場合、結果は正確ではありません。

「適切な」CPU 時間については、(POSIX 標準)getrusage()システム コールを使用する必要があります。

于 2012-04-30T08:32:59.967 に答える
1

CPU時間を必要とする場合は、代わりにパラメーターを使用することをお勧めしclock_gettimeますCLOCK_PROCESS_CPUTIME_ID

これは、1つのパラメーターを変更するだけで、同じ関数を使用してリアルタイムとCPU時間の両方を取得するためのおそらく最も便利な(そして正確な)方法です。

于 2012-04-30T08:50:06.730 に答える
1

Pentium クラスの cpu には、64 ビット変数である現在のタイムスタンプ カウンター変数をレジスタ (edx:eax) に読み込む命令があります。実際の CPU 時間を取得したい場合は、この命令を使用できます。CPU を取得できます。ダニ。詳細... このリンクをお願いします。 rdtsc

于 2012-05-07T16:54:21.520 に答える
0

Alnitakの答えへの小さな追加:

cpu_timeとして定義しますdouble。オーバーフローの可能性を処理するためだと思います (実行時間は ~2M 秒を超えます)。しかし、行で:

cpu_time = (end.tv_sec - begin.tv_sec) * 1000;

右辺は , として評価され、unsigned integer約 4M 秒後にオーバーフローします。それをdouble後で割り当てても役に立ちません。
したがって、長い実行時間を本当に気にする場合は、次のようにします。

cpu_time = (double)(end.tv_sec - begin.tv_sec) * 1000;
于 2012-04-30T10:25:38.737 に答える