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

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

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

DomainID int identity
Domain   varchar(255)

и ключ/таблица значений

DomainID int
ID       int identity
Value    varchar(255)

Следовательно, строка добавляется к таблице Domain, соответствующей каждой справочной таблице, которую Вы иначе использовали бы, и весь (ключевой домен) / пары значения, добавленные к таблице значений. Кроме упрощения структуры базы данных этот подход также имеет преимущество, что 'справочные таблицы' могут быть созданы в коде приложения динамично, который в некоторых приложениях может быть чрезвычайно полезным.

23
задан S.L. Barth - Reinstate Monica 21 July 2012 в 21:00
поделиться

6 ответов

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

#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
tv.tv_sec // seconds
tv.tv_usec // microseconds
30
ответ дан 29 November 2019 в 01:18
поделиться

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

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

9
ответ дан 29 November 2019 в 01:18
поделиться

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

В 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.

6
ответ дан 29 November 2019 в 01:18
поделиться

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

0
ответ дан 29 November 2019 в 01:18
поделиться

Используйте код @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;
 }
3
ответ дан 29 November 2019 в 01:18
поделиться

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

0
ответ дан 29 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: