Как я печатаю два раза t1 и t2 и получаю разницу в миллисекундах в C?
Временная метка на языке программирования 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(<ime);
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(), как упоминалось здесь
Ответ 9
Используйте gettimeofday() или лучше clock_gettime()
Ответ 10
U может выполнять процедуры в c-библиотеке времени (time.h). Плюс посмотрите на clock() в той же самой библиотеке. Он дает часовые метки с момента запуска прога. Но вы можете сохранить его значение до операции, на которой хотите сосредоточиться, а затем после этой операции захватите клики снова и найдите разницу между ними, чтобы получить разницу во времени.