2012-04-04 7 views
2

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.

+1

Siehe [Boost.Chrono] (http://www.boost.org/libs/chrono/). – ildjarn

+0

[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. –

+0

Sie können die Ausführungszeit auf den meisten Systemen nicht über die Sekunden hinaus genau messen. – AJG85

Antwort

5

Verwenden Sie die QueryPerformanceFrequency Funktion zu sehen, mit welcher Geschwindigkeit die Queryperformancecounter an läuft . Ich denke, es könnte im Nanosekundenbereich liegen.

+2

Sehr alter API-Aufruf und passt nicht für Task-Switches. – Lothar

+0

@Lothar: Wenn Sie die Ausführungszeit in Nanosekunden messen, werden Sie bemerken, wenn ein Taskwechsel stattfindet, und Sie können diese Messung überspringen. –

1

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; 
} 
+0

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

+0

@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

+0

@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. –

4

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

http://support.microsoft.com/kb/172338

+4

Dies ist ein Kommentar, keine gute Antwort. –

+3

@MooingDuck: Warum nicht? – Mehrdad

+1

@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. –

1

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.

+0

Wie benutzt man das? Ich kann es nicht herausfinden. –

+0

Hier ist etwas: http://msdn.microsoft.com/en-us/magazine/cc163996.aspx –

+0

Und wenn Sie die Laufzeit für verschiedene Code-Implementierungen vergleichen möchten, verwenden Sie die Ausführungszyklen nicht die absoluten Zeiten. – Lothar