9
votes

C Obtenez l'heure système à la précision microseconde sur Windows?

Dupliqué possible:
Temps de mesure avec résolution de microsecondes en C ++?

salut,

Y a-t-il un moyen simple de pouvoir obtenir le temps système sur une machine Windows, jusqu'à la précision de la microseconde?


3 Réponses :


4
votes

J'aime ce xxx


1 commentaires

QueryPerformEckecounter ne renvoie pas Durée du système mais haute résolution compteur .



11
votes

Regardez à GetSystemTimeasFileTime

Cela vous donne une précision dans 0,1 microsecondes ou 100 nanosecondes.

Notez que c'est Epoch différent de POSIX EPOCH.

SOINT pour obtenir le temps de POSIX dans des microsecondes Vous avez besoin de: xxx

donc dans ce cas temps (0) == TT / 1000000


8 commentaires

Plus probablement, c'est le temps exprimé en 100 nanosecondes plutôt que de la précision de 100 nanosecondes?


Vous pouvez également utiliser getSystemTime () ... mais le problème est, c'est une heure absolue, pas une heure relative. Il n'est pas bon d'utiliser à l'intérieur d'un programme pour déterminer le temps écoulé, car le temps absolu peut changer pour diverses raisons aléatoires (par exemple Synchronisation temporelle).


@Lambert GetSystemtime en tant que précision de millisecondes, il n'est pas assez bon, il est également utilisé au format de la date, il est donc difficile de calculer les différences


@ Steve-o Oui, vous avez raison. Mais c'est la mesure la plus précise que Win32api puisse donner


De KequerySystemTime : "Le temps système est généralement mis à jour environ tous les dix millisecondes."


"GetSystemtime en tant que précision millisecondes, il n'est pas assez bon" - alors la convertir à un moment de fichier le rendra magiquement plus précis? "La mesure la plus précise que Win32API peut donner" - directement, mais pas la plus précise pouvant être calculée. L'intervalle est de 10 ms, mais la précision de ces 10 ms est très élevée, comme on peut déterminer en utilisant QueryPerformCounter. Faites tourner jusqu'à ce que GetSystemTime change, et vous pouvez faire du timing très précis.


Je ne sais pas comment interpréter la sortie de "TT / 1000000". Par exemple, je reçois 1350054353. Quelqu'un pourrait-il m'aider?


Vous êtes déroutant la précision avec Precision .



0
votes

Ce dont nous avons vraiment besoin est une résolution gettickcount () . Autant que je sache, cela n'existe pas vraiment.

Si vous êtes prêt à utiliser une façon pirate de résoudre ce problème (cela ne fonctionnerait probablement que sur certaines versions de Windows comme XP), regardez ici réactos . Ensuite, essayez ce code: xxx

modifier peut vous donner ce dont vous avez besoin dans certaines versions de Windows.


8 commentaires

GetTickCount est toujours en millisecondes. La mise en œuvre de 32 bits GetTickCount que vous avez posté n'est pas différente de l'ancienne mise en œuvre Win32.


Exactement - c'est pourquoi j'ai dit Tweak . Vous pouvez faire des changements de bits plus petits ou multiplier par un nombre plus petit et obtenir plus de précision.


Ma faute. Vérifiez KequeryTimeIncrement à convertir en une valeur temporelle.


@ WJ32: Sauf que vous ne pouvez appeler que du mode de noyau ...


Vrai, mais j'ai dit "Découvrez" la fonction. Eh bien, il s'avère que vous avez l'appel système ntquerytimerresolution qui renvoie cette valeur exacte (l'incrément de l'heure).


@ WJ32: bon travail en trouvant ça! C'est sans papiers mais beaucoup moins hacable que ma solution; Je l'aime bien! +1 pour le commentaire. :)


Remarque: il fonctionne pour kequerytackcount , mais je ne sais pas quelle est la relation entre kequerytackcount et la structure user_shared_data que votre NtgeTickCount64 fonction utilise. CBB faisant plus de désassemblage.


Un autre chemin pirateux serait d'utiliser ntquerysysteminformation avec system_processor_performance_information et ajoutant les valeurs ...