我只是编写一个ac程序来练习每秒钟打印一次整数值,该程序等待一秒钟后再打印整数,然后再打印下一个整数,所以程序需要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("%d\n",i);
  }
  end=time(NULL);
  printf("program take %d second\n",(unsigned int)difftime(end,start));
  return 0;
}


这是程序运行时的结果:

1
2
3
4
5
program take 5 second


程序的执行准确地每1秒打印一次整数或等待1秒
在打印下一个整数之前

这是使用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("%d\n",i);
   }

  end=clock();
  printf("the program take %lf second\n",(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;


那么您可能会更接近您的期望。

关于c - clock_t和time_t或time(NULL)和clock()之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26434179/

10-13 06:59