Временная метка на языке программирования C

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

Ответ 1

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

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
tv.tv_sec // seconds
tv.tv_usec // microseconds

Ответ 2

Стандарт 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;

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

Ответ 3

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

В 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);

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

timeEndPeriod(1);

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

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

Ответ 4

/*
 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

Ответ 5

Используйте код @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;
 }

Ответ 6

Здесь - хорошая ссылка на timestamps в C. Надеюсь, это поможет.

Ответ 7

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

   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);

Ответ 8

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

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

Ответ 10

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