clock_gettime alternative dans Mac OS X
Lors de la compilation d'un programme que j'ai écrit sur Mac OS X après avoir installé les bibliothèques nécessaires par MacPorts, j'obtiens cette erreur:
In function 'nanotime':
error: 'CLOCK_REALTIME' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
Il semble que clock_gettime
n'est pas mis en œuvre dans Mac OS X. Est-t-il un autre moyen d'accéder à la époque dans nanosecondes? Malheureusement gettimeofday
est dans microsecondes.
- Ma documentation dit "Toutes les implémentations de soutien à l'échelle du système en temps réel de l'horloge, qui est identifié par CLOCK_REALTIME." Avez-vous
#include <time.h>
? - Oui, j'ai inclus
time.h
. Aussi,man gettimeofday
fonctionne sur OSX, tandis queman clock_gettime
ne le fait pas. - Essayez également
cc -g `pkg-config --cflags libcurl glib-2.0 libpcre libconfuse` -D_POSIX_C_SOURCE=199309L -c getbooru-util.c
- Cela n'a pas aidé.
clock_gettime
n'est pas mis en œuvre dans Mac OS X. - Sur mon système (Debian), de lien j'ai besoin de la librt de la bibliothèque.
- Je sais. Il est dans ma ligne de commande liens. Je ne me lève pas à l'étape de lien à tous. Mac OS X n'a pas
clock_gettime
, alors que Linux n'. - J'ai écrit une petite enveloppe pour ceci: gist.github.com/alfwatt/3588c5aa1f7a1ef7a3bb
- Notez que macOS Sierra 10.12 (septembre 2016, XCode, 8) et, plus tard, prend en charge
clock_gettime()
directement — comme indiqué dans ce répondre par James Wald.
Vous devez vous connecter pour publier un commentaire.
En effet, il ne semble pas être mis en œuvre pour macOS avant de la Sierra 10.12. Vous pouvez regarder ce l'entrée de blog, mais cela ne semble pas être plus disponible. L'idée principale est dans l'extrait de code suivant:
gettimeofday
etmach_absolute_time
au début de votre programme, puis ajouter les choses.Après des heures de dépouillement des réponses différentes, les blogs, et les en-têtes, j'ai trouvé un portable de façon à obtenir l'heure actuelle:
ou consultez ce gist: https://gist.github.com/1087739
Espère que cela sauve quelqu'un le temps. Cheers!
__MACH__
code? À l'aide d'un indépendant, une minuterie (bien testé), j'ai l'impression, que les deux invocations du code ci-dessus, le coût ~25microseconds.mach_absolute_time()
prend 68 ns pour exécuter sur le MacBook Air 2015Aucune des solutions ci-dessus répond à la question. Soit ils ne vous donnent pas absolue heure Unix, ou leur précision est de 1 microseconde. Le plus populaire de la solution par jbenet est lent (~6000ns) et ne compte pas en nanosecondes, même si son retour suggère donc. Ci-dessous est un test pour les 2 solutions proposées par jbenet et Dmitri B, de plus, mon prendre sur cette. Vous pouvez exécuter le code sans modification.
La 3ème solution ne compte pas en nanosecondes et vous donne absolue Unix de temps assez rapide (~90ns). Donc, si quelqu'un la trouver utile - s'il vous plaît laissez-nous le savons tous ici :-). Je m'en tiendrai à celle de Dmitri B (solution n ° 1 dans le code) - il correspond à mes besoins mieux.
J'avais besoin de qualité commerciale alternative à clock_gettime() pour faire pthread_...chronométré.. appels, et trouvé ce débat très utile. Merci les gars.
mach_absolute_time()
en plus de la multiplication parinfo.numer / info.denom
prend plus ou moins 33ns par appel: indice de référence: gist.github.com/aktau/9f52f812200d8d69a5d1 libuv question: github.com/joyent/libuv/pull/1325clock_gettime
rarement (jamais) être de l'ordre de la nanoseconde), et b) le temps retourné pargettimeofday
est différent et non monotone. Il peut sauter sauvagement (par exemple, lorsque l'heure d'été a lieu), ou il peut même fonctionner à un peu plus lent / rapide (!) rythme, après le temps de synchronisation du serveur a eu lieu, où le temps de service pour éviter les petites brusques changements de temps.Tout ce dont vous avez besoin est décrit dans Technique Q&UN QA1398: Technique Q&UN QA1398: Mach Absolu Unités de Temps, fondamentalement, la fonction que vous voulez est
mach_absolute_time
.Ici est un peu une version antérieure de l'échantillon de code de la page qui fait tout à l'aide de Mach appels (la version actuelle utilise
AbsoluteToNanoseconds
de CoreServices). Dans le courant de l'OS X (c'est à dire, sur Snow Leopard sur x86_64) l'absolu des valeurs de temps sont en fait en nanosecondes et donc ne nécessite pas réellement de conversion à tous. Donc, si vous êtes bon et écrire du code portable, vous pourrez convertir, mais si vous êtes en train de faire quelque chose de rapide et sale pour vous-même, vous n'avez pas besoin de s'embêter.FWIW,
mach_absolute_time
est vraiment rapide.Noter que macOS Sierra 10.12 prend désormais en charge clock_gettime():
Elle n'en nanosecondes; cependant, la résolution est de 1000, de sorte qu'il est (dans)effectivement limité à quelques microsecondes:
Vous aurez besoin de XCode 8 ou plus pour être en mesure d'utiliser cette fonctionnalité. Le Code compilé pour utiliser cette fonctionnalité ne fonctionnera pas sur les versions de Mac OS X (10.11 ou plus tôt).
Use of undeclared identifier 'CLOCK_REALTIME'
xcode-slect --install
!clock_gettime
symbole au moment de la compilation, mais lors de l'exécution du binaire sur le 10.11 ou ci-dessous, vous obtiendrez "dyld: Symbole non trouvé: _clock_gettime" parce que le compilateur a généré un faible le symbole.Merci pour vos messages
Je pense que vous pouvez ajouter les lignes suivantes
Laissez-moi savoir ce que vous obtenez pour la latence et de la granularité
mach_timebase_info
appel (peut-être avec une variable statique à garder bien rangé).mach_timebase_info()
est un syscall et prend ~180ns sur ma machine. Contrairement à l' ~22ns pourmach_absolute_time()
, qui est fondamentalement juste d'échantillonnagerdtsc
.Maristic a la meilleure réponse à ce jour. Permettez-moi de simplifier et d'ajouter une remarque.
#include
etInit()
:Utiliser comme:
Tels minuterie de latence de
65ns +/- 2ns
(PROCESSEUR 2 ghz). Utilisez cette option si vous avez besoin de "temps de l'évolution" de la seule exécution. Sinon, boucle votre code10000
fois de profil et même avecgettimeofday()
, ce qui est portable (POSIX), et a le temps de latence de100ns +/- 0.5ns
(mais seulement1us
granularité).mach_absolute_time
pouvez retourner quoi que ce soit dans une version 64 bits de large. Juste curieux.J'ai essayé la version avec clock_get_time, et ne s'en cache les host_get_clock_service appel. C'est beaucoup plus lent que gettimeofday, il faut plusieurs microsecondes par l'invocation. Et, ce qui est pire, la valeur de retour a étapes de 1000, c'est à dire c'est toujours la microseconde granularité.
J'aimerais des conseils pour utiliser gettimeofday, et de multiplier tv_usec par 1000.
gettimeofday
est potentiellement non-monotone. Il peut sauter sauvagement (par exemple, lorsque l'heure d'été a lieu), ou il peut même fonctionner à un peu plus lent / rapide (!) rythme, après le temps de synchronisation du serveur a eu lieu, où le temps de service pour éviter les petites brusques changements de temps.Basé sur l'open source mach_absolute_time.c nous pouvons voir que la ligne
extern mach_port_t clock_port;
nous dit il y a un mach de port déjà initialisé pour une fonction monotone de temps. Cette horloge de port peut être accessible directement, sans avoir à recourir à l'appel demach_absolute_time
puis de les convertir retour à unstruct timespec
. En contournant un appel àmach_absolute_time
devrait améliorer les performances.J'ai créé un petit Dépôt Github (PosixMachTiming) avec le code basé sur la extern
clock_port
et un fil similaire. PosixMachTiming émuleclock_gettime
pourCLOCK_REALTIME
etCLOCK_MONOTONIC
. Il émule également la fonctionclock_nanosleep
absolue monotone de temps. S'il vous plaît donner un essai et voir comment la performance se compare. Peut-être que vous pouvez créer des tests comparatifs ou imiter les autres POSIX horloges/fonctions?Comme au moins aussi loin que Mountain Lion,
mach_absolute_time()
retourne nanosecondes et pas de temps absolu (ce qui était le nombre de cycles de bus).Le code suivant sur mon MacBook Pro (2 GHz Core i7) ont montré que le temps d'appeler
mach_absolute_time()
moyenne 39 ns plus de 10 pistes (35 min, max 45), qui est essentiellement le temps entre le retour de deux appels à mach_absolute_time(), environ 1 invocation:J'ai trouvé une autre solution portable.
Déclarer dans certains fichier d'en-tête (ou même dans votre source):
Et l'ajouter à la fonction de mise en œuvre:
N'oubliez pas d'inclure
<time.h>
.Pour MacOS, vous pouvez trouver une bonne information sur leurs développeurs page
https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/services/services.html