c-clock_t和time_t或time(NULL)和clock()之间的差异



我只是写了一个c程序,每隔一秒钟打印一次整数值作为练习,这个程序在等待一秒钟后打印整数,然后再打印下一个整数,所以程序需要5秒钟才能完成执行。我使用clock_ttime()作为计时器,它可以工作,但当我使用clock_tclock作为计时器时,它不工作。

如我所知,time_ttime()是绝对时间,使用自1970年以来的秒数。而clock_tclock()使用自程序运行以来的时间。

这是第一个使用time_ttime(NULL) 的代码

#include <stdio.h>
#include <time.h>
int main (void) {
  int i;
  int sec=1;
  time_t start,end;
  start=time(NULL);
  for(i=1;i<=5;i++){
     time_t wait=sec+time(NULL);
     while(time(NULL) < wait) {}
     printf("%dn",i);
  }
  end=time(NULL);
  printf("program take %d secondn",(unsigned int)difftime(end,start));
  return 0;
}

这是程序运行时的结果:

1
2
3
4
5
program take 5 second

程序的执行每隔一秒钟精确地打印整数,或者等待一秒钟在打印下一个整数之前

这是第二个使用clock_tclock() 的程序

#include <stdio.h>
#include <time.h>
int main (void) {
   int sec=1;
   int i;
   clock_t start,end;
   start=clock();
   for(i=1;i<=5;i++){
       clock_t wait=sec*CLOCKS_PER_SEC;
       while(clock ()<wait){}
       printf("%dn",i);
   }
  end=clock();
  printf("the program take %lf secondn",(double)(end-start)/CLOCKS_PER_SEC);
  return 0;
}

这是使用clock_tclock() 的第二个程序的结果

1
2 
3
4
5
the program take 0.998901 second

执行后,它并不是每一秒打印一次,而是先等待一秒钟,然后打印所有整数,而不是等待一秒钟再打印下一个整数。

请解释第二个程序发生了什么,以及两者之间的区别time()和clock()函数?

在您的第一个程序中,这是:

time_t wait=sec+time(NULL);

导致wait在循环中每次都发生变化,比当前时间晚一秒(在time_t至少以秒为单位测量的系统上,这是常见的,但不是必需的)。

在你的第二个程序中,这个:

clock_t wait=sec*CLOCKS_PER_SEC;

每次执行时都具有相同的值,因为sec的值从未更改。因此,在您的第二个程序中,循环将在第一次迭代中等待,直到程序开始后一秒,而在随后的迭代中再也不会等待,因为程序开始后将超过一秒,clock() < wait将永远不会为真。

简言之,你的两个循环实际上甚至不接近做同一件事,所以你没有理由期望它们以相似的方式表现。如果您更改:

clock_t wait=sec*CLOCKS_PER_SEC;

至:

clock_t wait = i * CLOCKS_PER_SEC;

那么你可能会得到更接近你期望的东西。

最新更新