maneira mais eficiente de obter hora/data/dia atual em c
-
25-09-2019 - |
Pergunta
Qual é a maneira mais eficiente de obter hora/data/dia/ano atual no idioma C? Como tenho que executar isso muitas vezes, preciso de uma maneira muito eficiente. Estou no FreeBSD.
desde já, obrigado.
Solução
O padrão C fornece apenas uma maneira de obter tempo - time()
- que pode ser convertido em uma hora/data/ano com localtime()
ou gmtime()
. Tão trivialmente, essa deve ser a maneira mais eficiente.
Quaisquer outros métodos são específicos do sistema operacional e você não nos disse qual sistema operacional está usando.
Outras dicas
/* 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;
}
Você pode usar ctime, se você precisar como uma string.
Realmente depende do que você quer dizer com "muitos" :-)
Eu acho que você provavelmente descobrirá que o uso do padrão ISO time()
e localtime()
As funções serão mais do que rápidas o suficiente. Por exemplo, no meu "Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz"
, usando código não otimizado, posso ligar time()
dez milhões de vezes em 1,045 segundos e um time()/localtime()
Combinação meio milhão de vezes em 0,98 segundos. Seja rápido o suficiente para suas necessidades, só você pode decidir, mas estou com dificuldade em tentar criar um caso de uso que precise de mais grunhido do que isso.
o time()
a função fornece o número de segundos desde a época, enquanto localtime()
ambos o convertem para a hora local (da UTC) e o divide em uma forma mais utilizável, o struct tm
estrutura.
#include <time.h>
time_t t = time (NULL);
struct tm* lt = localtime (&t);
// Use lt->tm_year, lt->tm_mday, and so forth.
Qualquer tentativa de cache a data/hora e usar outras maneiras de descobrir um delta para se aplicar a ele, como com clock()
, quase invariavelmente:
- ser mais lento; e
- Sofra pelo fato de você não receber mudanças de tempo externo.
O mais simples é
#include <time.h>
//...
time_t current_time = time (NULL);
struct tm* local_time = localtime (¤t_time);
printf ("the time is %s\n", asctime (local_time));
Você pode usar a função gettimeofday () para obter tempo em segundos e microssegundos, o que é (eu acho) muito rápido (pois existe uma função semelhante no kernel do linux do_gettimeofday ()) e, em seguida, pode convertê -lo em formato necessário (pode ser possível (pode ser possível Use funções mencionadas acima para conversão.
Eu espero que isso ajude.
Quase o só maneira (isso é padrão, de qualquer maneira) é ligar time
Seguido por localtime
ou gmtime
.
Bem, em geral, acessando diretamente a API do sistema operacional para obter tempo é provavelmente a mais eficiente, mas não tão portátil .....
As funções do tempo C estão ok.
Mas realmente depende da sua plataforma
Supondo
- Instale um cronômetro de um segundo intervalo com
setitimer (ITIMER_REAL, ...)
- Quando desencadeia o
SIGALRM
, atualize uma variável estática com o tempo currrent - Use o valor na variável estática sempre que precisar do tempo
Mesmo que os sinais sejam perdidos devido à sobrecarga do sistema, isso se corrigirá na próxima vez que o processo for agendado.