Obtenir un timestamp en C en microsecondes?
Comment puis-je obtenir un microsecondes horodatage dans le C?
Je suis en train de faire:
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_usec;
Mais ceci renvoie à des bêtises de valeur que si je reçois deux horodateurs, la deuxième peut être plus grande ou plus petite que la première (seconde toujours plus grand). Serait-il possible de convertir la magie entier retourné par gettimeofday à un nombre normal, ce qui peut réellement être travaillé?
tv_usec
n'est pas "au courant de temps en microsecondes" mais le "courant de temps en microsecondes modulo 10^6".- Essayez de POSIX
clock_gettime()
. - Comment puis-je convertir en "normal" nombre?
- Brooks: eh bien.. "normal", les nombres ont une mauvaise habbit d'avoir de gamme, donc il y aura toujours être une valeur pour laquelle il n'y a pas de plus grande valeur. Je pense que vous devriez revoir votre alrogithm. Essayez
(sec2 - sec1)*1000000 + (usec2 - usec1)
. Ou, mieux, pour éviter les débordement possible pour les secondes, si vous savez que la période est inférieure à une seconde, lors de la seconde valeur est plus petite juste ajouter 1 000 000 pour elle. - J'ai juste besoin d'une microseconde d'horodatage pour calculer le défilement à inertie. J'ai besoin de quelque chose comme du temps (), mais pour une fraction de seconde.
- liées - stackoverflow.com/questions/361363/...
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'ajouter, dans les secondes, trop:
Notez que cela ne durera environ 232/106 =~ 4295 secondes, soit environ 71 minutes (sur un système 32-bits).
Vous avez deux choix pour l'obtention d'une microseconde d'horodatage. Le premier (et meilleur) choix, est d'utiliser le
timeval
taper directement:La deuxième, et pour moi, moins souhaitable, le choix est de construire un uint64_t d'un
timeval
:(uint64_t)1000000
au lieu de1000000ull
?(uint64_t)1000000
est même plus lisible que1000000ull
. Maintenant que je les ai vu ensemble, le second fait tout comme beaucoup de sens, mais je l'aurais reconnu le premier même comme un beaucoup plus jeune programmeur, alors que le dernier aurait exigé que je cherche à vérifier ce qu'il signifie.struct timeval contient deux composants, de la deuxième et de la microseconde. Un timestamp avec une précision est représenté sous forme de secondes depuis l'epoch stockées dans le tv_sec champ et que les fractions de microsecondes dans tv_usec. Ainsi, vous ne peut pas simplement ignorer tv_sec et attendre sensible des résultats.
Si vous utilisez Linux ou *BSD, vous pouvez utiliser timersub() pour soustraire deux struct timeval valeurs, qui pourrait être ce que vous voulez.
timersub
Ce qui vous fait penser à qui? La valeur est probablement OK. C'est la même situation qu'avec les secondes et les minutes – lorsque vous mesurez le temps en minutes et en secondes, le nombre de secondes repasse à zéro quand il arrive à soixante.
Pour convertir la valeur renvoyée dans un “linéaire” le nombre on pourrait multiplier le nombre de secondes et ajouter quelques microsecondes. Mais si je compte bien, l'un an est d'environ 1e6*60*60*24*360 µs et cela signifie que vous aurez besoin de plus de 32 bits pour stocker le résultat:
Qui est probablement l'une des raisons pour fractionner l'original de la valeur retournée en deux morceaux.
timespec_get de C11 les retours jusqu'à la nanoseconde, arrondie à la résolution de la mise en œuvre.
Plus de détails ici: https://stackoverflow.com/a/36095407/895245
Nous avons d'abord besoin de savoir sur la gamme de microsecondes c'est à dire 000_000 à 999_999 (1000000 microsecondes est égal à 1second). tv.tv_usec sera de retour la valeur de 0 à 999999 pas 000000 à 999999 donc, lors de l'utilisation de secondes que l'on pourrait avoir de 2,1 secondes au lieu de 2.000001 secondes parce que quand seulement parler de tv_usec 000001 est essentiellement 1.
Son meilleur si vous insérez
et ainsi de suite...
utiliser un unsigned long long (c'est à dire une version 64 bits de l'unité) pour représenter le temps de système: