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?
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:
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%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.
Und natürlich gibt es auch die gute alte Boost :: date_time :
%Vor%microsec nur, obwohl.
Tags und Links c++ benchmarking boost time