Разница между clock_t и time_t или time(NULL) и clock()

Я просто пишу программу переменного тока для печати целочисленного значения каждую секунду в качестве упражнения, эта программа печатает целое число после ожидания в течение одной секунды, прежде чем печатать следующее целое число, поэтому программе требуется 5 секунд для завершения выполнения. Я использую clock_t и time() как таймер, и он работает, но когда я использую clock_t и clock в качестве таймера, он не работает.

Насколько я знаю, time_t и time() - это абсолютное время и использование секунд, прошедших с 1970 года. В то время как clock_t и clock() используют время с момента запуска программы.

Это первый код, использующий time_t и time(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

выполнение программы точно печатает целые числа каждую секунду или ждет одну секунду, прежде чем печатать следующее целое число

это вторая программа, использующая clock_t и clock()

#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_t и clock()

1
2 
3
4
5
the program take 0.998901 second

и после выполнения он не печатает ровно каждую секунду, а сначала ждет одну секунду, а затем печатает все целые числа вместо того, чтобы ждать одну секунду, прежде чем печатать следующее целое число.

Пожалуйста, объясните, что происходит со второй программой и в чем разница между функциями time() и clock()?


person harianja    schedule 17.10.2014    source источник
comment
time() сообщает в режиме реального времени (обычно в секундах с 1970 года). clock() сообщает о процессорном времени.   -  person Keith Thompson    schedule 18.10.2014


Ответы (1)


В вашей первой программе это:

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;

to:

clock_t wait = i * CLOCKS_PER_SEC;

тогда вы можете получить что-то ближе к тому, что вы ожидаете.

person Crowman    schedule 17.10.2014
comment
Я хочу спросить еще раз. Я присваиваю значение часов новой переменной clock_t now=clock, а затем я изменил цикл while на - person harianja; 18.10.2014
comment
Я хочу спросить еще раз. Я присваиваю значение clock() новой переменной с именем now следующим образом: clock_t now=clock(), а затем я изменил цикл while while(now < wait). После этого программа может работать, но не может отображать значение целого числа на каждой итерации. значение clock()' is the same as new variable now`? - person harianja; 18.10.2014
comment
Вам действительно нужно задать новый вопрос, я не могу понять, что вы спрашиваете. Если вы делаете clock_t now = clock(), то очевидно, что значение now равно возвращаемому значению из clock() в то время. Но через наносекунду — или какое бы разрешение clock() ни было в вашей системе — этого не будет, потому что clock() будет двигаться дальше, а now — нет. - person Crowman; 18.10.2014