Gibt es einen Weg in C++ auf Windows, Zeit in Nanosekunden zu messen?Windows C++ Nanosekunden-Timing?
Alles, was ich finden kann, sind Linux-Lösungen.
Gibt es einen Weg in C++ auf Windows, Zeit in Nanosekunden zu messen?Windows C++ Nanosekunden-Timing?
Alles, was ich finden kann, sind Linux-Lösungen.
Verwenden Sie die QueryPerformanceFrequency
Funktion zu sehen, mit welcher Geschwindigkeit die Queryperformancecounter an läuft . Ich denke, es könnte im Nanosekundenbereich liegen.
Sehr alter API-Aufruf und passt nicht für Task-Switches. – Lothar
@Lothar: Wenn Sie die Ausführungszeit in Nanosekunden messen, werden Sie bemerken, wenn ein Taskwechsel stattfindet, und Sie können diese Messung überspringen. –
Wenn Sie eine eigene Montage ausführen können, können Sie die CPU-Zykluszähler lesen konnte und einen Zyklus Unterschied durch die Taktrate der CPU unterteilen:
static inline uint64_t get_cycles()
{
uint64_t t;
__asm__ __volatile__ ("rdtsc" : "=A"(t));
return t;
}
IIRC, ist es vielleicht mit diesem eine Gotcha sein ... es ist entweder nur verfügbar auf neueren CPUs, oder es ist nur im Kernel-Modus oder so ähnlich ... – Mehrdad
@Mehrdad: 'rdtsc' ist seit P6-Familie CPUs verfügbar, möglicherweise sogar der ursprüngliche Pentium. Es kann auf Kernel-Modus beschränkt sein, aber ich weiß nicht, ob Windows das tut. – cHao
@Mehrdad: Nein, es ist nicht auf Kernel-Modus unter Windows beschränkt. Wenn Sie VC verwenden, lautet die Syntax 'long long ticks() { __asm {rdtsc}; } 'Und wenn Sie mit neueren CPUs Pentium meinen, dann ist es nur auf" neueren "CPUs verfügbar.Persönlich ist es eine Weile her, seit ich für die 486 und früher codiert habe. –
In QueryPerformanceCounter in Windows suchen.
Wenn die Codezeit Performance-Engpässe zu identifizieren, möchten Sie die höchste Auflösung verwenden Timer das System zu bieten hat. Dieser Artikel beschreibt, wie die Queryperformancecounter Funktion zu Zeit Anwendungscode
Dies ist ein Kommentar, keine gute Antwort. –
@MooingDuck: Warum nicht? – Mehrdad
@Mehrdad: Weil, wenn ich das lese, habe ich keine Fortschritte gemacht, um die Antwort auf die Frage zu verstehen. Dies ist ein Link. Es sollte mindestens eine Zusammenfassung haben. –
Verwenden Windows7 und der Hardware-Zähler Profilerstellungs-API ist http://msdn.microsoft.com/en-us/library/windows/desktop/dd796395(v=vs.85).aspx
Sowohl RDTSC und Queryperformancecounter/Queryperformance verwenden, nicht genau genug wegen des großen Overheads, Interrupts und Task Switches.
[EDIT]: Sorry durcheinander den Link für PerformanceCounter mit Hardware Counters. Sorry habe es nur einmal benutzt und das war eine schnelle Antwort.
Wie benutzt man das? Ich kann es nicht herausfinden. –
Hier ist etwas: http://msdn.microsoft.com/en-us/magazine/cc163996.aspx –
Und wenn Sie die Laufzeit für verschiedene Code-Implementierungen vergleichen möchten, verwenden Sie die Ausführungszyklen nicht die absoluten Zeiten. – Lothar
Siehe [Boost.Chrono] (http://www.boost.org/libs/chrono/). – ildjarn
[QueryPerformanceCounter] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904 (v = vs.85) .aspx) ist Windows, obwohl Boost ist so gut und ist auch portabel. –
Sie können die Ausführungszeit auf den meisten Systemen nicht über die Sekunden hinaus genau messen. – AJG85