Comment puis-je obtenir le système Windows de temps avec milliseconde?
Comment puis-je obtenir le système Windows de temps avec milliseconde?
Si ce qui précède n'est pas possible, alors comment puis-je obtenir le temps de démarrage? Je voudrais utiliser cette valeur avec timeGetTime() afin de calculer un système de temps avec milliseconde.
Vous en remercie d'avance.
Vous devez vous connecter pour publier un commentaire.
GetTickCount
ne l'aurez pas fait pour vous.Regarder dans
QueryPerformanceFrequency
/QueryPerformanceCounter
. Le seul piège est ici de PROCESSEUR de mise à l'échelle, donc de faire votre recherche.Essayez de cet article de MSDN Magazine. C'est effectivement assez compliqué.
Mettre en œuvre une Permanence de la mise à Jour, de Temps à Haute Résolution Fournisseur pour Windows
C'est une élaboration des commentaires ci-dessus pour expliquer certains des tenants.
Tout d'abord, le Fonction getsystemtime* les appels sont la seule Api Win32, la fourniture du système de temps. Cette fois a assez grossier granularité, comme la plupart des applications n'ont pas besoin les frais généraux nécessaires pour maintenir un niveau de résolution. Le temps est (probablement) stocké en interne comme un 64-bit nombre de millisecondes. L'appel de timeGetTime obtient le faible de l'ordre de 32 bits. L'appel de fonction getsystemtime, etc les demandes de Windows pour revenir à ce temps milliseconde, après la conversion en jours, etc et y compris le système de démarrage.
Il y a deux sources de temps dans une machine: le PROCESSEUR de l'horloge et d'un conseil d'administration de l'horloge (par exemple, l'horloge temps réel (RTC), Programmable compteurs d'Intervalle (la FOSSE), et la Haute Précision de l'Événement Timer (HPET)). Le premier a une résolution d'environ ~0.5 ns (2GHz) et le second est généralement programmables vers le bas pour une période de 1 ms (si les nouvelles puces (HPET) ont une meilleure résolution). Windows utilise ces périodiques tiques pour effectuer certaines opérations, y compris la mise à jour de l'heure du système.
Les Applications peuvent modifier cette période via timerBeginPeriod; toutefois, cela affecte l'ensemble du système. L'OS va vérifier /mettre à jour régulièrement des événements à la fréquence demandée. Sous faible charge du CPU /fréquences, il y a des périodes d'inactivité pour économiser l'énergie. À haute fréquence, il n'y a pas de temps pour mettre le processeur en état de faible consommation énergétique. Voir La Résolution Du Timer pour plus de détails. Enfin, chaque tick a des coûts et l'augmentation de la fréquence consomme plus de cycles de PROCESSEUR.
Pour une meilleure résolution temps, l'heure du système n'est pas maintenu à cette précision, pas plus que Big Ben a une seconde main. À l'aide de QueryPerformanceCounter(QPC) ou de la CPU tiques (rdtsc) peut fournir la résolution entre le système de tiques de temps. Une telle approche a été utilisée dans l'article de MSDN magazine Kevin cité. Bien que ces approches peuvent dérive (par exemple, en raison de la fréquence de mise à l'échelle), etc et, par conséquent, doivent être synchronisés à l'heure du système.
Dans Windows, la base de tous les temps est une fonction appelée
GetSystemTimeAsFiletime
.La
FILETIME
structure enregistre le nombre de 100ns intervalles, depuis janvier 1, 1600; sens sa résolution est limitée à 100 ns.Ce qui fait notre première fonction:
Un nombre de 64 bits de 100ns tiques depuis le 1er janvier 1600, c'est un peu lourde. Windows fournit une pratique fonction d'assistance,
FileTimeToSystemTime
qui peut décoder ce entier 64 bits utiles de pièces:Avis que
SYSTEMTIME
a une limitation dans la résolution de1ms
Maintenant, nous avons un moyen d'aller d'
FILETIME
àSYSTEMTIME
:Nous pourrions écrire la fonction pour obtenir l'heure système actuelle comme un
SYSTEIMTIME
structure:À l'exception de Windows déjà écrit une telle fonction pour vous:
fonction getsystemtime
Local, plutôt que de l'UTC
Maintenant, si vous ne voulez pas au courant de l'heure UTC. Que faire si vous le souhaitez dans votre heure locale? Windows fournit une fonction pour convertir un
FILETIME
qui est en UTC en heure locale:FileTimeToLocalFileTime
Vous pouvez écrire une fonction qui retourne un
FILETIME
dans local temps déjà:Et permet de dire que vous voulez décoder le local FILETIME dans un SYSTEMTIME. C'est pas un problème, vous pouvez utiliser
FileTimeToSystemTime
de nouveau:Heureusement, Windows déjà vous offre une fonction qui renvoie la valeur:
Précis
Il est une autre considération. Avant Windows 8, l'horloge avait une résolution de autour de 15ms. Dans Windows 8, ils ont amélioré l'horloge à 100ns (correspondant à la résolution de
FILETIME
).GetSystemTimeAsFileTime
(héritage, 15ms résolution)GetSystemTimeAsPreciseFileTime
(Windows 8, 100ns résolution)Cela signifie que nous devons toujours préférer la nouvelle valeur:
Vous demandé pour le moment
Vous demandé pour le moment; mais vous avez quelques choix.
Le fuseau horaire:
Le format:
FILETIME
(système natif, 100ns résolution)SYTEMTIME
(décodé, 1ms résolution)Résumé
FILETIME
GetSytemTimeAsPreciseFileTime
(ouGetSystemTimeAsFileTime
)SYSTEMTIME
GetSystemTime
GetLocalTime
À partir de Windows 8, Microsoft a présenté la nouvelle API de commande GetSystemTimePreciseAsFileTime:
https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895%28v=vs.85%29.aspx
Malheureusement, vous ne pouvez pas l'utiliser si vous créer un logiciel qui doit aussi fonctionner sur les anciens systèmes d'exploitation.
Ma solution actuelle est comme suit, mais il faut être conscient que Le temps déterminé, il n'est pas exact, c'est seulement près du temps réel. Le résultat doit toujours être inférieur ou égal au temps réel, mais avec une résolution de l'erreur (à moins que l'ordinateur est en mode veille). Le résultat est une milliseconde. Mon objectif c'est assez exact.
GetSystemTimeAsFileTime donne la meilleure précision de toute fonction Win32 de temps absolu. FQD/QPC comme Joel Clark a suggéré donnera de meilleurs temps relatif.
timeBeginPeriod(1);
sera de définir la précision de 1ms.QueryPerformanceCounter() est construit pour la fine résolution du timer.
C'est la résolution la plus élevée de la minuterie que le système a à offrir, que vous pouvez utiliser dans votre code d'application pour identifier les goulots d'étranglement des performances
Ici est une simple application pour C# devs:
Si vous êtes un C/C++, dev, alors jetez un oeil ici:
http://support.microsoft.com/kb/815668
Bien, c'est très vieux, mais il est une autre fonction utile dans les Fenêtres de la bibliothèque C
_ftime
, qui renvoie une structure locale en temps quetime_t
, en millisecondes, le fuseau horaire et l'heure d'été drapeau.Puisque nous sommes tous venus ici pour rapide des extraits plutôt ennuyeux explications, je vais en écrire un:
Aucune idée de comment la dérive de la performance-contre-réponses est allé jusqu'à, ne pas faire de glissement de bugs, les gars.
J'ai écrit quelques informations sur la façon de mettre en œuvre facilement et rapidement, d'une manière appropriée pour la plupart des fins, dans ma réponse à la "La microseconde résolution des estampilles sur Windows" question.