Je cherche un moyen rapide d'obtenir le temps écoulé entre deux appels d'une fonction en c. p>
J'ai envisagé d'utiliser des jiffes, mais ils ne sont pas disponibles dans Userland. Donc, devrais-je utiliser getimeofday () ou y a-t-il un moyen le plus rapide de le faire? P>
Je ne suis intéressé que par le temps élaspété entre deux appels, pour utiliser dans un outil de référence. P>
7 Réponses :
Si vous êtes sur une architecture X86 / X64 et que vous utilisez un seul processeur, vous pourriez envisager de lire le compteur de time-timbre sur la CPU pour obtenir un décompte de cycle. Wikipedia a Plus d'informations . Notez que cette approche est moins utile si votre application est en cours d'exécution sur plusieurs processeurs, car chaque CPU aura son propre TSC. Également méfiez-vous de la mise à l'échelle de la fréquence si vous décidez que vous souhaitez convertir des cycles -> unités de temps. P>
Oui, GettimeOfday () suffirait si vous souhaitez trouver la réalité écoulée. Si vous avez besoin de trouver le temps de la CPU, vous pouvez utiliser l'horloge (). Dans de nombreux cas, les deux approches donneraient des résultats similaires (sauf s'il y a un sommeil ou une sorte d'attente en code). Un exemple d'horloge () peut être trouvé ici:
http: //www.cs.utah. EDU / DEPT / OUVANT / TEXINFO / GLIBC-Manual-0.02 / Bibliothèque_19.html P>
Jetez un coup d'œil à clock_gettime code> a>, qui donne accès aux minuteries haute résolution. P>
Horlock_GetTime () avec la source clock_montonique est préférable de faire du synchronisation relative. GetTimeOdday () est sujette à une erreur si un utilisateur ou un processus peut modifier l'heure actuelle.
J'aurais le temps de processeur via horloge () code> de time.h code>. Pour obtenir des valeurs utiles, convertir en millisecondes via clocks_per_sec code>:
Horloge () Le temps ne semble pas égal à l'heure réelle. Stackoverflow.com/questions/556405/...
Après avoir testé le temps d'horloge () renvoie le système de l'utilisateur + mais pas le temps réel. utiliser gettimeofday à la place
@xhan: dépend de votre cas d'utilisation - pour un outil d'analyse comparative, le temps du processeur est probablement une meilleure métrique que le temps de Wallclock
Si votre noyau prend en charge GetTimeOdday () code> en tant que VSYSCALL (appel du système virtuel), il sera plus rapide que d'appeler un appel système régulier tel que horloge () code> . Voir Présentation de Andrea Arcangeli pour des informations sur la façon dont VSYSCALLS travail. p>
Bit d'ajout tardif, cependant, le temps utilitaire disponible sur n'importe quel Linux / Unix peut être un moyen de poids plus léger d'atteindre ce que vous voulez. Voici 2 exemples
Les œuvres suivantes pour moi sur Centos 6:
$ make dur
cc dur.c -o dur
/tmp/cc1yF58x.o: In function `main':
dur.c:(.text+0x1c): undefined reference to `clock_gettime'
dur.c:(.text+0x4e): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [dur] Error 1
$ LDFLAGS="-lrt" make dur
cc -lrt dur.c -o dur
$ ./dur
start == {tv_sec: 206247, tv_nsec: 411717209}
stop == {tv_sec: 206247, tv_nsec: 411759791}
stop.tv_nsec - start.tv_nsec == 42582