Im Allgemeinen eignet sich timeGetTime () am besten für die Timing-Spielelogik - GetTickCount ist nicht hoch genug aufgelöst, und QPC & RDTSC sind viel schwieriger, als sie für diesen Zweck wert sind.
Für die Profilerstellung hingegen kann sich entweder RDTSC oder QPC durchaus lohnen. Ich bevorzuge RDTSC gegenüber QPC, obwohl Microsoft QPC empfiehlt.
Die vier gängigen Zeitfunktionen, die ich unter win32 verwende:
GetTickCount () gibt die aktuelle Zeit in Millisekunden relativ zu einer beliebigen Null (normalerweise, wenn auch nicht immer, die Systemstartzeit) als 32-Bit-Ganzzahl zurück (wird also etwa alle 49 Tage umgebrochen). Dies ist normalerweise die schnellste Methode, um eine Zeit zu messen. Leider ist die Auflösung niedrig - normalerweise wird sie nur 64 Mal pro Sekunde aktualisiert. Im Gegensatz zu populären Gerüchten wird das Aufrufen von timeBeginPeriod (1) die Auflösung auf keinem System erhöhen, auf dem ich das getestet habe. Es gibt auch eine 64-Bit-Variante, wenn Sie sich Sorgen über das Umschließen machen.
timeGetTime () gibt die aktuelle Zeit in Millisekunden relativ zu einer beliebigen Null als 32-Bit-Wert zurück (wird also nach etwa 49 Tagen umgebrochen). Es ist nicht so schnell wie GetTickCount, aber immer noch ziemlich vernünftig. Es kann auf eine Millisekunde genau sein, obwohl dazu möglicherweise zuerst timeBeginPeriod (1) aufgerufen werden muss. Die Verwendung von timeGetTime erfordert eine Verknüpfung mit winmm.lib und einschließlich Mmsystem.h.
QueryPerformanceCounter () gibt die aktuelle Zeit in beliebigen Einheiten als 64-Bit-Ganzzahl zurück. Sie können herausfinden, um welche Einheiten es sich handelt, indem Sie QueryPerformanceFrequency () aufrufen. Die Einheiten ändern sich nicht (ohne Neustart). Die zugrunde liegende Implementierung ist sehr unterschiedlich, und jede Implementierung weist ihre eigenen Macken und Fehler auf, die auf einigen Hardwarekomponenten auftreten können, was die Verwendung in weit verbreiteten Anwendungen unangenehm macht. Einige Implementierungen sind sehr langsam, andere sind sinnvoll, obwohl keine so schnell ist wie GetTickCount oder sogar timeGetTime. Normalerweise ist die Timing-Auflösung besser als 1 Mikrosekunde, wenn auch nicht unbedingt viel besser.
RDTSC ist ein Opcode in x86 / x64-Assemblersprache, der die aktuelle Zeit in Einheiten von CPU-Zyklen zurückgibt (dh als 64-Bit-Ganzzahl. Auf einigen Compilern kann als intrinsische (__rdstc) zugegriffen werden, auf anderen benötigen Sie Inline-ASM. Die Geschwindigkeit variiert ein wenig zwischen den CPUs, ist aber normalerweise ziemlich vernünftig - normalerweise deutlich schneller als QueryPerformanceCounter, aber nicht so schnell wie GetTickCount. Leider hat es einige Macken - nicht so viele wie QueryPerformanceCounter, aber immer noch viel mehr als die Funktionen mit niedrigerer Auflösungszeit. Auf Multicore-CPUs kann es manchmal rückwärts laufen, wenn Sie aufgrund einer unvollständigen Synchronisation zwischen den Kernen die Kerne wechseln, die Einheiten schwer herauszufinden sind und sich die Einheiten während des Timings ändern können, da die Energieverwaltung die Rate des CPU-Takts ändert.
Beachten Sie, dass jede dieser vier Methoden relativ zu den anderen drei Methoden abweichen kann - es gibt keinen eindeutigen maßgeblichen Zeitfluss.