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.

Foi útil?

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 (&current_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 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top