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.000 毫秒的时间。知道这里出了什么问题。

任何帮助,将不胜感激。

谢谢

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

以上内容不会按原样编译,但有一个明显的问题:您只查看tv_sec字段而不是tv_nsec字段。这两个tv_sec测量整秒的值很可能是相同的,因为经过的 CPU 时间不到整整一秒。

减去两个 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 回答
0

gnu libc 手册有一些很好的信息,甚至包括一个示例减法函数

http://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.html

于 2013-10-10T10:31:44.407 回答