Wie bereits von anderen bemerkt, hat die Funktion time() in der C-Standardbibliothek keine bessere Auflösung als eine Sekunde. Die einzige vollständig portable C-Funktion, die eine bessere Auflösung bieten könnte, scheint clock() zu sein, aber diese misst die Prozessorzeit und nicht die Wanduhrzeit. Wenn man sich auf POSIX-Plattformen (z. B. Linux) beschränken möchte, ist die Funktion clock_gettime() eine gute Wahl.
Seit C++11 gibt es viel bessere Zeitmesseinrichtungen verfügbar, die eine bessere Auflösung in einer Form bieten, die über verschiedene Compiler und Betriebssysteme hinweg sehr portabel sein sollte. In ähnlicher Weise bietet die boost::datetime-Bibliothek gute hochauflösende Timing-Klassen, die sehr portabel sein sollten.
Eine Herausforderung bei der Nutzung dieser Möglichkeiten ist die Zeitverzögerung, die durch die Abfrage der Systemuhr entsteht. Aus Experimenten mit clock_gettime(), boost::datetime und std::chrono kann diese Verzögerung leicht eine Sache von Mikrosekunden sein. Wenn Sie also die Dauer eines beliebigen Teils Ihres Codes messen, müssen Sie einen Messfehler in dieser Größenordnung einkalkulieren oder versuchen, diesen Null-Fehler auf irgendeine Weise zu korrigieren. Idealerweise sollten Sie mehrere Messungen der von Ihrer Funktion benötigten Zeit durchführen und den Durchschnitt oder die maximale/minimale Zeit über viele Durchläufe hinweg berechnen.
Um bei all diesen Problemen mit der Portabilität und dem Sammeln von Statistiken zu helfen, habe ich die cxx-rtimers-Bibliothek entwickelt, die auf Github das versucht, eine einfache API für die Zeitmessung von C++-Codeblöcken, die Berechnung von Nullfehlern und die Meldung von Statistiken von mehreren in Ihrem Code eingebetteten Zeitmessern bereitzustellen. Wenn Sie einen C++11-Compiler haben, können Sie einfach #include <rtimers/cxx11.hpp>
und verwenden Sie etwas wie:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Beim Beenden des Programms erhalten Sie eine Zusammenfassung der Timing-Statistiken, die in std::cerr geschrieben wird:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
die die mittlere Zeit, die Standardabweichung, die Ober- und Untergrenze sowie die Anzahl der Aufrufe dieser Funktion angibt.
Wenn Sie Linux-spezifische Timing-Funktionen verwenden möchten, können Sie #include <rtimers/posix.hpp>
oder wenn Sie die Boost-Bibliotheken, aber einen älteren C++-Compiler haben, können Sie #include <rtimers/boost.hpp>
. Es gibt auch Versionen dieser Timer-Klassen, die statistische Zeitinformationen über mehrere Threads hinweg sammeln können. Es gibt auch Methoden, die es Ihnen ermöglichen, den Null-Fehler zu schätzen, der mit zwei unmittelbar aufeinander folgenden Abfragen der Systemuhr verbunden ist.
10 Stimmen
Ich verstehe die Frage nicht. Natürlich sind die Werte unterschiedlich. Dazwischen ist Zeit vergangen, also
time()
gibt einen anderen Wert zurück.1 Stimmen
Was meinen Sie mit "Ich verstehe nicht, warum die Werte im Vorher und Nachher unterschiedlich sind"? Sie erhalten die aktuelle Zeit (in Sekunden seit dem 1. Januar 1970) mit
time(NULL)
... das zweite Mal, wenn Sie es aufrufen, wird N Sekunden nach dem ersten und damit ... anders sein (es sei denn, was auch immer es ist Sie tun, dauert nicht eine Sekunde zu beenden ... in diesem Fall, es wird das gleiche wie das erste sein).1 Stimmen
Können Sie uns sagen, was gedruckt wird und wie lange es dauert, wenn Sie es mit einer Stoppuhr oder einer Wanduhr (oder einem Kalender) messen?
5 Stimmen
Entschuldigung, ich meine, dass beide Werte gleich sind. Ich habe meine Frage falsch geschrieben.
2 Stimmen
Siehe dieses Thema: stackoverflow.com/questions/275004/
0 Stimmen
@hap497 cool, aber was druckt es (und wie lange dauert es, wenn man es von Hand macht)?
0 Stimmen
Haben Sie schon einmal Folgendes gelesen open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
0 Stimmen
Möchten Sie messen Wanduhr Zeit (Zeitpunkt des Prozessendes - Zeitpunkt des Prozessbeginns), oder wollen Sie messen verbrauchte CPU-Zeit ? (Die Wanduhrzeit kann ein Bruchteil der CPU-Zeit bei Multithreading sein, und die CPU-Zeit kann ein Bruchteil der Wanduhrzeit sein, wenn Ihr Prozess auf E/A wartet.) Hierfür müssen Sie verschiedene Funktionen verwenden. Für letzteres ist es am einfachsten, Ihren Prozess unter der Kontrolle der
time
(keine Änderung des Quellcodes erforderlich); dadurch erhalten Sie auch die Zeit, die der Kernel für die Verarbeitung der E/A des Prozesses benötigt.0 Stimmen
Sie erleben vielleicht die Microsoft Minute .
0 Stimmen
Wenn einfach ist das Wichtigste: $
time ./MyProgram
(nur Linux). Referenz: levelup.gitconnected.com/ .0 Stimmen
time(NULL)
hat ein Ergebnis in Sekunden. Wenn das Programm weniger als eine Sekunde dauert, sind Start- und Endzeit gleich lang. Das Ergebnis von timersub ist eine Struktur mit ganzzahligen Sekunden und ganzzahligen Mikrosekunden (siehe man7.org/linux/man-pages/man2/settimeofday.2.html ) Man könnte es also ausdrucken mitprintf("**time taken = %ld.%06ld\n", diff.tv_sec, diff.tv_usec);
0 Stimmen
Beachten Sie, dass
tv_usec
ist Mikrosekunden nicht Nanosekunden. Dieu
wird oft anstelle von (Kleinbuchstabe mu) verwendet, da es in ASCII (nicht erweitert) nicht verfügbar ist, daher "usec" anstelle von "s".