Domanda

Qual è il modo più efficiente di ottenere corrente ora / data / giorno / anno in linguaggio C? Come devo eseguire questo molte volte, ho bisogno di un vero e proprio modo efficiente. Io sono su FreeBSD.

grazie in anticipo.

È stato utile?

Soluzione

standard C fornisce solo un modo per ottenere il tempo - time() - che può essere convertito in un ora / data / anno con localtime() o gmtime(). Così banalmente, che deve essere il modo più efficace.

Tutti gli altri metodi sono specifico del sistema operativo, e non hai ci ha detto che il sistema operativo che si sta utilizzando.

Altri suggerimenti

/* 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;
}

È possibile utilizzare ctime , se ne avete bisogno come una stringa.

Dipende da cosa si intende per "molti": -)

Penso che probabilmente scoprirete che utilizzando le funzioni time() e localtime() ISO standard sarà più che abbastanza veloce. Ad esempio, sul mio "Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz", utilizzando il codice unoptimised, posso chiamare time() dieci milioni di volte in 1.045 secondi, e una combinazione time()/localtime() mezzo milione di volte in 0,98 secondi. Sia che è abbastanza veloce per le vostre esigenze, solo tu puoi decidere, ma sono in difficoltà cercando di venire con un caso d'uso che ha bisogno di più di quello grugnito.

La funzione time() ti dà il numero di secondi dal dell'epoca, mentre localtime() entrambe le converte in ora locale (da UTC) e si divide in una forma più utilizzabile, la struttura 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.

Qualsiasi tentativo di memorizzare nella cache la data / ora e usare altri modi di trovare un delta da applicare ad esso, come ad esempio con clock(), sarà quasi invariabilmente:

  • essere più lento; e
  • soffre il fatto non sarà prendere tempo cambia esterni.

Il più semplice è

#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));

È possibile utilizzare gettimeofday () per ottenere il tempo in secondi e microsecondi che è (credo) molto veloce (in quanto v'è una funzione simile in Linux kernel do_gettimeofday ()) e quindi si può convertirlo nel formato richiesto ( potrebbe possibile utilizzare le funzioni di cui sopra per la conversione.

Spero che questo aiuta.

Quasi il solo strada (che è di serie, comunque) è quello di chiamare time seguita da localtime o gmtime.

bene, in generale, accedendo direttamente API del sistema operativo per ottenere il tempo è probabilmente il più efficiente, ma non così portatile .....

le funzioni C di tempo sono ok.

Ma in realtà dipende dalla vostra piattaforma

Supponendo una seconda risoluzione uno è sufficiente, il modo più efficiente su FreeBSD (o qualsiasi altro sistema POSIX) è probabile

  • Installa un intervallo di un secondo timer con setitimer (ITIMER_REAL, ...)
  • Quando si attiva l'SIGALRM, aggiornare una variabile statica che tiene il tempo currrent
  • Usa il valore della variabile statica ogni volta che è necessario il tempo

Anche se i segnali si perdono a causa di sovraccarico del sistema questo si correggerà da solo la prossima volta che il processo è in programma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top