J'essaie de calculer le nombre de ticks une fonction utilise pour exécuter et de le faire à l'aide de la fonction mais Le problème est que la valeur qu'il renvoie est un multiple de 10000, que je pense est le J'utilise Ubuntu 64 bits, mais préféreriez si la solution peut fonctionner sur d'autres systèmes tels que Windows & Mac OS. P> p> horloge () code> comme:
clock_per_second code>. Existe-t-il un moyen ou une valeur de fonction équivalente plus précise? P>
4 Réponses :
Il existe un certain nombre de minuteries plus précises dans POSIX. P>
GetTimeOdday () Code>
- Officiellement obsolescent, mais très largement disponible; Résolution microseconde. LI>
clock_gettime () code>
- Le remplacement de GetTimeOdday () code> (mais pas nécessairement si largement disponible; sur une ancienne version de Solaris, nécessite -Lposix4 code> sur le lien), avec une résolution nanoseconde. LI>
ul>
Il existe d'autres minuteries sous-secondes de plus ou moins d'antiquité, de portabilité et de résolution, notamment: P>
-
FTEME () CODE>
- Résolution milliseconde (marquée «héritage» dans POSIX 2004; pas à POSIX 2008). LI>
-
horloge () code>
- que vous savez déjà. Notez qu'il mesure le temps de processeur, non écoulé (horloge murale). Li>
-
fois () code>
- clk_tck code> ou Hz code>. Notez que cela mesure les processus de la CPU pour les processus parents et enfants. LI>
ul>
N'utilisez pas FTEME () code> ou fois () code> sauf s'il n'y ait rien de mieux. La relèvement ultime, mais ne répondant pas à vos exigences immédiates, est p>
-
TIME () CODE>
- une seconde résolution. LI>
ul>
the horloge () code> Rapports de fonction dans les unités de Clocks_per_sec code>, qui est nécessaire pour être 1 000 000 par POSIX, mais l'incrément peut arriver moins fréquemment (100 fois par seconde était une fréquence commune). La valeur de retour doit être définie par clocks_per_sec code> pour obtenir le temps en secondes. P>
Le fait qu'il soit disponible sur Solaris est une bonne chose. Un système d'exploitation supplémentaire pour la conformité POSIX. Cela dit cependant, ne POSIX ne manda pas que le symbole soit disponible avec au moins -LRT code>?
J'ai écrit ces notes il y a quelque temps - peut-être que Solaris 2.6 ère (Hmmm ... 1998 ... Oui, il y a longtemps!). Donc, la bibliothèque requise peut avoir changé.
@ Jørgensen: Le lien est à POSIX 2008 et il est toujours répertorié dans le cadre de POSIX, bien que des obsolescentes marquées depuis le numéro 7 (qui est le POSIX 2008 standard; voir l'en-tête des pages liées à). Donc, je crois que vous êtes prématuré en déclarant GetTimeOdday () code> obsolète; C'est juste obsolescent encore.
@Jonathanleffler horloge () sur Linux en cours d'exécution sur la plate-forme X86 a également une deuxième résolution. Il est incrémenté de 10 000 une fois par seconde.
@Jenniferanderson: Je pense que horloge () code> sur Linux a probablement probablement 1/100 résolution. Clocks_per_sec doit être de 1 000 000 (et est tellement défini sur RedHat 5.3 dans
/usr/include/time.h code>). Vous avez mentionné incrémenté de 10 000; Cela devrait être fait 100 fois une seconde pour atteindre le taux de croissance requis de 1 000 000 par seconde. Remarque, aussi, que
horloge () code> mesure le temps de la CPU, non écoulé. (Voir trier 2 tableaux Utilisation de 2 threads prend plus de temps que de trier les 2 matrices une à la fois pour plus d'informations supplémentaires.)
par horloge () Manpage, sur la plate-forme POSIX La valeur de l'horlogerie_per_sec macro doit être 1000000. Comme vous le dites que la valeur de retour que vous obtenez de l'horloge () est un multiple de 10000, ce qui impliquerait que la résolution est de 10 ms. p>
Notez également que l'horloge () sur Linux renvoie une approximation du temps de processeur utilisé par le programme. Sous Linux, encore une fois, les statistiques de planificateur sont mises à jour lorsque le planificateur est exécuté, à la fréquence Config_Hz. Donc, si la ticket de la minuterie périodique est de 100 Hz, vous obtenez des statistiques de consommation temporelle de processeur de processeur avec 10 ms résolution. P>
Les mesures de Wintime ne sont pas liées par cela et peuvent être beaucoup plus précises. clock_gettime (clock_montonique, ...) sur un système Linux moderne fournit une résolution nanoseconde. P>
Merci tout le corps pour vos réponses, j'ai pu faire avec horloge_GetTime.
Le moyen le plus précis (mais hautement non fort> portable) pour mesurer le temps consiste à compter les tiques CPU. Par exemple sur x86 p> Si vous n'avez pas de x86, vous devrez ré-écrire le code de l'assembleur en conséquence de votre CPU. Si vous
Je suis d'accord avec la solution de Jonathan. Voici la mise en œuvre de Horlock_GetTime () avec des nanosecondes de précision.
//Import #define _XOPEN_SOURCE 500 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <sys/time.h> int main(int argc, char *argv[]) { struct timespec ts; int ret; while(1) { ret = clock_gettime (CLOCK_MONOTONIC, &ts); if (ret) { perror ("clock_gettime"); return; } ts.tv_nsec += 20000; //goto sleep for 20000 n printf("Print before sleep tid%ld %ld\n",ts.tv_sec,ts.tv_nsec ); // printf("going to sleep tid%d\n",turn ); ret = clock_nanosleep (CLOCK_MONOTONIC, TIMER_ABSTIME,&ts, NULL); } }
Voir Stackoverflow.com/questions/ 538609 / ...
Ce n'est pas une bonne idée de nommer une variable
temps code>, surtout si vous utilisez code>, car il y a une fonction standard de ce nom.
J'ai utilisé le temps comme nom de variable uniquement aux fins de la question.