Erhalte lokale Zeit in Nanosekunden [duplizieren]

9

Ich muss die Dauer einer Funktionsausführung in Nanosekunden Auflösung messen. Ist es möglich? Unsere gewöhnliche Computerhardware und -software ist in der Lage, eine solche Präzision für die Zeit zu geben? Wenn ja, wie geht das mit C ++? Ist es mit Boost-Bibliothek möglich?

    
Narek 17.10.2012, 15:36
quelle

4 Antworten

34

Ja, heute unterstützt die meiste Hardware diese Art von Auflösung, und die C ++ - Standardbibliothek verfügt über eine API, die sie ebenfalls unterstützen kann. Leider liefern nicht alle Implementierungen von C ++ das.

Die API ist die <chrono> -Bibliothek, die in C ++ 11 eingeführt wurde:

%Vor%

Die <chrono> -Implementierung in libc ++ für Darwin bietet eine Auflösung im Nanosekundenbereich, aber die Implementierung in VS2012 scheint nur in Zehntel-Millisekunden zu liegen. Der obige Code wird immer noch Zeiten in Nanosekunden geben, aber Zeiten unter 100 Mikrosekunden werden am Ende Null Nanosekunden sein.

Boost bietet auch eine Implementierung, boost :: chrono, die anscheinend unter Windows in Nanosekunden arbeitet. Es ist auch mit C ++ 03 verwendbar.

%Vor%     
bames53 17.10.2012, 15:44
quelle
2

Ich bin mir nicht sicher, ob du nach Uhr oder Zeit suchst, aber eine davon sollte genau das sein, wonach du suchst:

Ссылка

Ссылка

Sie können diese Vorher-Nachher-Funktionen verwenden und die Unterschiede der Laufzeiten vergleichen, um die Gesamtlaufzeit einer Funktion zu sehen.

    
mttalxndrgrrtt 17.10.2012 15:41
quelle
1

Das Beste, was Sie mit der Windows-API tun können, ist QueryPerformanceCounter . Sie können die Auflösung mit QueryPerformanceFrequency abrufen. Abhängig von der Situation kann dies der RDTSC-Befehl der CPU sein, in welchem ​​Fall die Frequenz im Grunde die Taktfrequenz der CPU ist. In anderen Fällen verwendet es einen separaten Takt mit einer Frequenz von 1.024 MHz, so dass die Auflösung im Grunde eine Mikrosekunde ist.

C ++ 11 fügt eine Klasse chrono hinzu, die ebenfalls nützlich sein kann - vorausgesetzt, Sie verwenden einen Compiler, der diesen bereits enthält. Wenn Ihr Compiler keine Implementierung bereitstellt, ist Boost Chrono ein vernünftiger Ersatz, der mit den meisten existierenden Compilern / Bibliotheken funktioniert. Auch hier gibt es keine Garantie dafür, dass es eine Auflösung im Nanosekundenbereich bietet, aber ich gehe davon aus, dass es sich bei Windows wahrscheinlich um einen tragbaren Wrapper für QPC / QPF handelt, also wird es wahrscheinlich die gleiche Auflösung liefern, die portabler ist.

    
Jerry Coffin 17.10.2012 15:42
quelle
1

Und natürlich gibt es auch die gute alte Boost :: date_time :

%Vor%

microsec nur, obwohl.

    
Offirmo 17.10.2012 15:50
quelle

Tags und Links