Отметка времени на языке программирования C - PullRequest
23 голосов
/ 18 сентября 2009

Как мне штамповать два раза t1 и t2 и получить разницу в миллисекундах в C?

Ответы [ 9 ]

29 голосов
/ 18 сентября 2009

Это даст вам время в секундах + микросекунды

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
tv.tv_sec // seconds
tv.tv_usec // microseconds
9 голосов
/ 18 сентября 2009

Стандарт C99:

#include <time.h>

time_t t0 = time(0);
// ...
time_t t1 = time(0);
double datetime_diff_ms = difftime(t1, t0) * 1000.;

clock_t c0 = clock();
// ...
clock_t c1 = clock();
double runtime_diff_ms = (c1 - c0) * 1000. / CLOCKS_PER_SEC;

Точность типов определяется реализацией, т. Е. Разница между датой и временем может возвращать только полные секунды.

6 голосов
/ 12 октября 2011
/*
 Returns the current time.
*/

char *time_stamp(){

char *timestamp = (char *)malloc(sizeof(char) * 16);
time_t ltime;
ltime=time(NULL);
struct tm *tm;
tm=localtime(&ltime);

sprintf(timestamp,"%04d%02d%02d%02d%02d%02d", tm->tm_year+1900, tm->tm_mon, 
    tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
return timestamp;
}


int main(){

printf(" Timestamp: %s\n",time_stamp());
return 0;

}

Вывод: метка времени: 20110912130940 // 2011 12 сентября 13: 09: 40

6 голосов
/ 18 сентября 2009

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

В Windows используйте GetTickCount (). Вот как:

DWORD dwStart = GetTickCount();
...
... process you want to measure elapsed time for
...
DWORD dwElapsed = GetTickCount() - dwStart;

dwElapsed теперь число прошедших миллисекунд.

В Linux используйте clock () и CLOCKS_PER_SEC , чтобы сделать то же самое.

Если вам нужны временные метки, которые длятся через перезагрузки или на разных компьютерах (что действительно потребовало бы довольно хорошей синхронизации), используйте другие методы (gettimeofday ()).

Кроме того, по крайней мере в Windows вы можете получить намного лучшее, чем стандартное разрешение по времени. Обычно, если вы вызываете GetTickCount () в узком цикле, вы увидите, что он скачет на 10-50 при каждом изменении. Это из-за кванта времени, используемого планировщиком потоков Windows. Это примерно столько времени, сколько каждый поток запускает перед переключением на что-то другое. Если вы делаете:

timeBeginPeriod(1);

в начале вашей программы или процесса и:

timeEndPeriod(1);

в конце, тогда квант изменится на 1 мс, и вы получите намного лучшее временное разрешение при вызове GetTickCount (). Тем не менее, это вносит небольшие изменения в то, как весь ваш компьютер выполняет процессы, так что имейте это в виду. Тем не менее, в любом случае Windows Media Player и многие другие делают это регулярно, поэтому я не слишком беспокоюсь об этом.

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

3 голосов
/ 18 сентября 2009

Используйте код @Arkaitz Jimenez для получения двух временных интервалов:

#include <sys/time.h>
//...
struct timeval tv1, tv2, diff;

// get the first time:
gettimeofday(&tv1, NULL);

// do whatever it is you want to time
// ...

// get the second time:
gettimeofday(&tv2, NULL);

// get the difference:

int result = timeval_subtract(&diff, &tv1, &tv2);

// the difference is storid in diff now.

Пример кода для timeval_subtract можно найти на этом веб-сайте :

 /* Subtract the `struct timeval' values X and Y,
    storing the result in RESULT.
    Return 1 if the difference is negative, otherwise 0.  */

 int
 timeval_subtract (result, x, y)
      struct timeval *result, *x, *y;
 {
   /* Perform the carry for the later subtraction by updating y. */
   if (x->tv_usec < y->tv_usec) {
     int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
     y->tv_usec -= 1000000 * nsec;
     y->tv_sec += nsec;
   }
   if (x->tv_usec - y->tv_usec > 1000000) {
     int nsec = (x->tv_usec - y->tv_usec) / 1000000;
     y->tv_usec += 1000000 * nsec;
     y->tv_sec -= nsec;
   }

   /* Compute the time remaining to wait.
      tv_usec is certainly positive. */
   result->tv_sec = x->tv_sec - y->tv_sec;
   result->tv_usec = x->tv_usec - y->tv_usec;

   /* Return 1 if result is negative. */
   return x->tv_sec < y->tv_sec;
 }
2 голосов
/ 07 мая 2012

как насчет этого решения? Я не видел ничего подобного в своих поисках. Я пытаюсь избежать разделения и сделать решение проще.

   struct timeval cur_time1, cur_time2, tdiff;

   gettimeofday(&cur_time1,NULL);
   sleep(1);
   gettimeofday(&cur_time2,NULL);

   tdiff.tv_sec = cur_time2.tv_sec - cur_time1.tv_sec;
   tdiff.tv_usec = cur_time2.tv_usec + (1000000 - cur_time1.tv_usec);

   while(tdiff.tv_usec > 1000000)
   {
      tdiff.tv_sec++;
      tdiff.tv_usec -= 1000000;
      printf("updated tdiff tv_sec:%ld tv_usec:%ld\n",tdiff.tv_sec, tdiff.tv_usec);
   }

   printf("end tdiff tv_sec:%ld tv_usec:%ld\n",tdiff.tv_sec, tdiff.tv_usec);
1 голос
/ 26 октября 2010

Также информирует о взаимодействиях между clock () и usleep (). usleep () приостанавливает программу, а clock () измеряет только время выполнения программы.

Если может быть лучше использовать gettimeofday (), как упомянуто здесь

0 голосов
/ 18 сентября 2009

U может попробовать подпрограммы в библиотеке времени c ( time.h ). Плюс взгляните на clock () в той же библиотеке. Это дает такты с момента запуска проги. Но вы можете сохранить его значение до операции, на которой вы хотите сконцентрироваться, а затем после этой операции снова захватить отметки времени и найти разницу между ними, чтобы получить разницу во времени.

0 голосов
/ 18 сентября 2009

Использовать gettimeofday () или лучше clock_gettime ()

...