1

次のコードを使用して CPU 時間を測定しようとしています。

timespec time1, time2, temp_time;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
 int i;
 int cpu_sum = 0;


 for (i = 0; i < nelements; i++) {

  cpu_sum += array[i];

 }    
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
temp_time.tv_sec = time2.tv_sec - time1.tv_sec;
printf( sum: %d using CPU in %lf ms \n",cpu_sum, temp_time.tv_sec);

しかし、私は常に 0.000ms の時間を取得します。ここで何が問題なのか分かりません。

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

ありがとう

4

4 に答える 4

4
  1. printf間違った引数の型を( time_t、おそらくlongではなく)に渡すことで、未定義の動作を呼び出していますdouble

  2. tv_sec時間の秒部分全体が含まれているだけです。tv_nsecナノ秒の部分を取得するためにも使用する必要があります。

次のようなものを試してください:

temp_time.tv_sec = time2.tv_sec - time1.tv_sec;
temp_time.tv_nsec = time2.tv_nsec - time2.tv_nsec;
if (temp_time.tv_nsec < 0) {
    temp_time.tv_nsec += 1000000000;
    temp_time.tv_sec--;
}
printf("%lld.%.9ld\n", (long long)temp_time.tv_sec, (long)temp_time.tv_nsec);
于 2012-05-01T03:24:08.743 に答える
1

上記はそのままではコンパイルされませんが、明らかな問題が 1 つありtv_secますtv_nsectv_sec経過する CPU 時間は 1 秒未満であるため、1 秒を測定する2 つの値は同じになる可能性があります。

2 つの timespec 構造体の値を減算するには (未テスト):

void ts_delta(struct timespec *result, struct timespec *a, struct timespec *b) {
    int borrow = 0;
    long n = a->tv_nsec - b->tv_nsec;

    if (n < 0) { /* nsec underflow; borrow 1 from seconds */
        n += 1000000000L;
        borrow = 1;
    }
    result->tv_nsec = n;
    result->tv_sec = a->tv_sec - b->tv_sec - borrow;
}
于 2012-05-01T03:24:23.737 に答える
0

Linuxで試していると思います。

私のシステムでは、次のように出力されます。機能するかどうかを確認して通知できます。

ayub@gentux ~ $ cat cputime.c
#include <stdio.h>
#include <time.h>

int main(void)
{
  struct timespec time1, time2, temp_time;

  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
  int i;
  int cpu_sum = 0;
  static int array[1000]; /* 'static' to make the array initialized to zero by default (for demo) */
  int nelements = 1000;
  long diff = 0;

  array[0] = 10;
  for (i = 0; i < nelements; i++) {
    cpu_sum += array[i];
  }    
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
  temp_time.tv_sec = time2.tv_sec - time1.tv_sec;
  temp_time.tv_nsec = time2.tv_nsec - time1.tv_nsec;
  diff = temp_time.tv_sec * 1000000000 + temp_time.tv_nsec; /* total ns */
  printf("Sum: %d using CPU in %lf ms \n", cpu_sum, (double) diff/1000000); /* now we print as milisecond */

  return 0;
}

ayub@gentux ~ $ gcc -o cputime cputime.c -lrt
ayub@gentux ~ $ time ./cputime
Sum: 10 using CPU in 0.003197 ms 

real    0m0.001s
user    0m0.000s
sys     0m0.000s
ayub@gentux ~ $ ./cputime 
Sum: 10 using CPU in 0.002599 ms
于 2012-05-01T09:23:22.830 に答える