Wie andere bereits bemerkt haben, hat die time () - Funktion in der C-Standardbibliothek keine bessere Auflösung als eine Sekunde. Die einzige vollständig tragbare C-Funktion, die möglicherweise eine bessere Auflösung bietet, scheint clock () zu sein, misst jedoch eher die Prozessorzeit als die Wanduhrzeit. Wenn man sich damit zufrieden gibt, sich auf POSIX-Plattformen (z. B. Linux) zu beschränken, ist die Funktion clock_gettime () eine gute Wahl.
Seit C ++ 11 gibt es viel bessere Timing-Möglichkeiten Verfügung, die eine bessere Auflösung in einer Form bieten, die für verschiedene Compiler und Betriebssysteme sehr portabel sein sollte. In ähnlicher Weise bietet die boost :: datetime-Bibliothek gute hochauflösende Timing-Klassen, die hoch portabel sein sollten.
Eine Herausforderung bei der Verwendung einer dieser Einrichtungen ist die Zeitverzögerung, die durch die Abfrage der Systemuhr eingeführt wird. Durch das Experimentieren mit clock_gettime (), boost :: datetime und std :: chrono kann diese Verzögerung leicht eine Frage von Mikrosekunden sein. Wenn Sie also die Dauer eines Teils Ihres Codes messen, müssen Sie einen Messfehler von etwa dieser Größe berücksichtigen oder versuchen, diesen Nullfehler auf irgendeine Weise zu korrigieren. Im Idealfall möchten Sie möglicherweise mehrere Messungen der von Ihrer Funktion benötigten Zeit erfassen und die durchschnittliche oder maximale / minimale Zeit berechnen, die für viele Läufe benötigt wird.
Um all diese Probleme mit der Portabilität und dem Sammeln von Statistiken zu lösen, habe ich die auf Github verfügbare cxx-rtimers-Bibliothek entwickelt, die versucht, eine einfache API für Timing-Blöcke von C ++ - Code bereitzustellen, null Fehler zu berechnen und Statistiken von mehreren eingebetteten Timern zu melden in Ihrem Code. Wenn Sie einen C ++ 11-Compiler haben, verwenden Sie einfach #include <rtimers/cxx11.hpp>
Folgendes:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Beim Beenden des Programms erhalten Sie eine Zusammenfassung der in std :: cerr geschriebenen Timing-Statistiken wie:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
Dies zeigt die mittlere Zeit, ihre Standardabweichung, die oberen und unteren Grenzen und die Häufigkeit, mit der diese Funktion aufgerufen wurde.
Wenn Sie Linux-spezifische Timing-Funktionen verwenden möchten, können Sie dies #include <rtimers/posix.hpp>
, oder wenn Sie die Boost-Bibliotheken, aber einen älteren C ++ - Compiler haben, können Sie dies #include <rtimers/boost.hpp>
. Es gibt auch Versionen dieser Timer-Klassen, die statistische Timing-Informationen aus mehreren Threads erfassen können. Es gibt auch Methoden, mit denen Sie den Nullfehler schätzen können, der mit zwei unmittelbar aufeinanderfolgenden Abfragen der Systemuhr verbunden ist.
time()
gibt also einen anderen Wert zurück.