самый эффективный способ получить текущее время / дату / день в C - PullRequest
4 голосов
/ 04 августа 2010

Какой самый эффективный способ узнать текущее время / дату / день / год на языке Си?Поскольку я должен выполнить это много раз, мне нужен действительно эффективный способ.Я нахожусь на freeBSD.

заранее спасибо.

Ответы [ 8 ]

6 голосов
/ 04 августа 2010
/* ctime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t rawtime;

  time ( &rawtime );
  printf ( "The current local time is: %s", ctime (&rawtime) );

  return 0;
}

Вы можете использовать ctime , если вам это нужно в виде строки.

5 голосов
/ 04 августа 2010

Стандарт C предоставляет только один способ получить время - time() - которое можно преобразовать во время / дату / год с помощью localtime() или gmtime(). Так тривиально, это должен быть самый эффективный способ.

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

3 голосов
/ 04 августа 2010

Это действительно зависит от того, что вы подразумеваете под "многими": -)

Я думаю, вы, вероятно, обнаружите, что использование стандартных функций ISO time() и localtime() будет более чем достаточно быстрым.Например, на моем "Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz" с использованием неоптимизированного кода я могу вызвать time() десять миллионов раз за 1,045 секунды, а комбинацию time()/localtime() - полмиллиона раз за 0,98 секунды.Является ли это достаточно быстрым для ваших нужд, решать вам можете только вы, но я с трудом придумываю пример использования, который нуждается в большем хрюкании, чем этот.

Функция time() дает вам числосекунд с начала эпохи, тогда как localtime() преобразует его в местное время (из UTC) и разбивает его на более удобную форму, структуру struct tm.

#include <time.h>
time_t t = time (NULL);
struct tm* lt = localtime (&t);
// Use lt->tm_year, lt->tm_mday, and so forth.

Любая попытка кэшировать дату/ время и использовать другие способы обнаружения дельты, чтобы применить к ней, например, с clock(), почти всегда:

  • будет медленнее;и
  • страдают от того, что вы не будете воспринимать внешние изменения времени.
1 голос
/ 04 августа 2010

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

Надеюсь, это поможет.

1 голос
/ 04 августа 2010

Самый простой

#include <time.h>
//...
time_t current_time = time (NULL);
struct tm* local_time = localtime (&current_time); 
printf ("the time is %s\n", asctime (local_time));
0 голосов
/ 01 июля 2012

При условии, что достаточно разрешения в одну секунду, наиболее эффективный способ на FreeBSD (или любой системе POSIX), вероятно,

  • Установите интервал таймера в одну секунду с setitimer (ITIMER_REAL, ...)
  • Когда он вызывает SIGALRM, обновите статическую переменную, содержащую текущее время
  • . Используйте значение в статической переменной всякий раз, когда вам нужно время

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

0 голосов
/ 04 августа 2010

ну, в общем, прямой доступ к API операционной системы, чтобы получить время, вероятно, самый эффективный, но не настолько переносимый .....

функции времени C в порядке.

Но на самом деле зависит от вашей платформы

0 голосов
/ 04 августа 2010

Просто способ only (это стандарт, во всяком случае) заключается в вызове time с последующим localtime или gmtime.

...