Question

Quelle est la façon la plus efficace d'obtenir l'heure / date / jour / année en langage C? Comme je dois exécuter cela plusieurs fois, je besoin d'une vraie façon efficace. Je suis sur freeBSD.

Merci d'avance.

Était-ce utile?

La solution

Standard C ne fournit qu'une seule façon d'obtenir le temps - time() - qui peut être converti en une date / heure / an avec localtime() ou gmtime(). Donc, trivialement, qui doit être le moyen le plus efficace.

Les autres méthodes fonctionnent-système spécifique, et vous ne nous ont pas dit ce que le système d'exploitation que vous utilisez.

Autres conseils

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

Vous pouvez utiliser ctime , si vous avez besoin comme une chaîne.

Cela dépend vraiment de ce que vous entendez par "beaucoup": -)

Je pense que vous constaterez probablement que l'utilisation des fonctions standard de time() et localtime() ISO sera plus assez vite. Par exemple, sur mon "Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz", en utilisant le code non optimisé, je peux appeler time() dix millions de fois en 1,045 secondes, et une combinaison de time()/localtime() un demi-million de fois en 0,98 secondes. Que ce soit assez rapide pour vos besoins, vous seul pouvez décider, mais je suis du mal à essayer de trouver un cas d'utilisation qui a besoin de plus grognement que cela.

La fonction time() vous donne le nombre de secondes écoulées depuis l'époque, alors que les deux localtime() le convertit en heure locale (UTC) et il se divise en une forme plus utilisable, la structure 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.

Toute tentative de mettre en cache la date / heure et utiliser d'autres moyens de trouver un delta d'appliquer à elle, comme avec clock(), sera presque invariablement:

  • plus lent; et
  • souffrir du fait que vous ne détectera pas les changements de temps externes.

Le plus simple est

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

Vous pouvez utiliser la fonction gettimeofday () pour obtenir le temps en secondes et microsecondes qui est (je pense) très rapide (car il y a une fonction similaire dans do_gettimeofday du noyau Linux ()) et vous pouvez le convertir à votre format requis ( pourrait possible d'utiliser les fonctions mentionnées ci-dessus pour la conversion.

J'espère que cette aide.

Juste au sujet de la que façon (c'est standard, de toute façon) est d'appeler time suivie localtime ou gmtime.

bien, en général, accédant directement à l'API du système d'exploitation pour obtenir le temps est probablement le plus efficace, mais pas portable .....

les fonctions de temps C sont ok.

Mais vraiment dépend de votre plate-forme

Si l'on suppose une seconde résolution est suffisante, la façon la plus efficace sur FreeBSD (ou tout autre système POSIX) est probablement

  • Installer une seconde minuterie d'intervalle avec setitimer (ITIMER_REAL, ...)
  • Quand il déclenche la SIGALRM, mettre à jour une variable statique tenant le temps currrent
  • Utilisez la valeur de la variable statique chaque fois que vous avez besoin du temps

Même si les signaux sont perdus en raison du système de surcharge cela se corrigera la prochaine fois que le processus est prévu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top