Gibt unter Windows clock()
die Zeit in Millisekunden zurück, aber auf dieser Linux-Box, an der ich arbeite, wird sie auf die nächste 1000 gerundet, sodass die Genauigkeit nur auf der "zweiten" Ebene und nicht auf der Millisekunden-Ebene liegt.
Ich habe mit Qt eine Lösung gefunden, bei der die QTime
Klasse verwendet, ein Objekt instanziiert und aufgerufen start()
und dann aufgerufen wurde elapsed()
, um die Anzahl der verstrichenen Millisekunden abzurufen.
Ich hatte ein bisschen Glück, weil ich zunächst mit Qt zusammenarbeite, aber ich hätte gerne eine Lösung, die nicht auf Bibliotheken von Drittanbietern basiert.
Gibt es keinen Standardweg, um dies zu tun?
AKTUALISIEREN
Bitte empfehlen Sie Boost nicht ..
Wenn Boost und Qt das können, ist es sicherlich keine Magie, es muss einen Standard geben, den sie verwenden!
Antworten:
Sie können gettimeofday zu Beginn und am Ende Ihrer Methode verwenden und dann die beiden Rückgabestrukturen unterscheiden. Sie erhalten eine Struktur wie die folgende:
BEARBEITEN: Wie aus den beiden folgenden Kommentaren hervorgeht, ist clock_gettime (CLOCK_MONOTONIC) eine viel bessere Wahl, wenn Sie es zur Verfügung haben, was heutzutage fast überall sein sollte.
EDIT: Jemand anderes hat kommentiert, dass Sie auch modernes C ++ mit std :: chrono :: high_resolution_clock verwenden können, aber das ist nicht garantiert monoton. Verwenden Sie stattdessen stetige Uhr.
quelle
CLOCK_MONOTONIC
ist großartig, um lokalisierte Systemzeitanpassungen zu vermeiden.quelle
POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead.
@CTT, Sie das Beispiel , indem die Aktualisierung konntestruct timeval
zustruct timespec
, undgettimeofday(&start, NULL)
zuclock_gettime(CLOCK_MONOTONIC, &start)
so , dass die Menschen in Schwierigkeiten nicht laufen können?Bitte beachten Sie, dass die
clock
Wanduhrzeit nicht gemessen wird. Das heißt, wenn Ihr Programm 5 Sekunden dauert,clock
misst es nicht unbedingt 5 Sekunden, sondern könnte mehr (Ihr Programm könnte mehrere Threads ausführen und somit mehr CPU als Echtzeit verbrauchen) oder weniger. Es misst eine Annäherung an die verwendete CPU-Zeit . Um den Unterschied zu sehen, betrachten Sie diesen CodeEs wird auf meinem System ausgegeben
Weil wir nur geschlafen haben und keine CPU-Zeit verbraucht haben! Mit
gettimeofday
bekommen wir jedoch, was wir wollen (?)Ausgänge auf meinem System
Wenn Sie mehr Präzision benötigen, aber CPU-Zeit erhalten möchten, können Sie die
getrusage
Funktion verwenden.quelle
sleep()
- Es wird bereits angenommen, dass ich eine Frage stelle (warum funktioniert es für alle außer mir?!) , Wenn Ihre Antwort gefunden wurde.Ich empfehle auch die von Boost angebotenen Tools. Entweder der erwähnte Boost-Timer oder etwas aus Boost.DateTime hacken oder es gibt eine neue vorgeschlagene Bibliothek in der Sandbox - Boost.Chrono : Dieser letzte wird ein Ersatz für den Timer sein und Folgendes bieten :
duration
time_point
system_clock
monotonic_clock
high_resolution_clock
timer
mit typedefs:system_timer
monotonic_timer
high_resolution_timer
process_clock
Erfassen von Real-, Benutzer-CPU- und System-CPU-Zeiten.process_timer
Erfassen der verstrichenen Real-, Benutzer-CPU- und System-CPU-Zeiten.run_timer
, bequeme Berichterstattung über | process_timer | Ergebnisse.Hier ist die Quelle der Funktionsliste
quelle
Ich habe eine
Timer
Klasse geschrieben, die auf der Antwort von CTT basiert . Es kann folgendermaßen verwendet werden:Hier ist seine Implementierung:
quelle
Wenn Sie nicht möchten, dass der Code auf alte Unices portierbar ist, können Sie clock_gettime () verwenden, mit dem Sie die Zeit in Nanosekunden angeben können (wenn Ihr Prozessor diese Auflösung unterstützt). Es ist POSIX, aber ab 2001.
quelle
clock () hat oft eine ziemlich miese Auflösung. Wenn Sie die Zeit im Millisekundenbereich messen möchten, können Sie alternativ clock_gettime () verwenden, wie in dieser Frage erläutert.
(Denken Sie daran, dass Sie unter Linux eine Verknüpfung mit -lrt herstellen müssen.)
quelle
Mit C ++ 11
std::chrono::high_resolution_clock
können Sie dies tun:Ausgabe:
Link zur Demo: http://cpp.sh/2zdtu
quelle
clock () gibt unter Linux keine Millisekunden oder Sekunden zurück. Normalerweise gibt clock () auf einem Linux-System Mikrosekunden zurück. Die richtige Methode zur Interpretation des von clock () zurückgegebenen Werts besteht darin, ihn durch CLOCKS_PER_SEC zu teilen, um herauszufinden, wie viel Zeit vergangen ist.
quelle
Dies sollte funktionieren ... auf einem Mac getestet ...
Ja ... zweimal ausführen und subtrahieren ...
quelle
Im POSIX-Standard
clock
ist der Rückgabewert anhand des Symbols CLOCKS_PER_SEC definiert, und eine Implementierung kann diesen auf jede bequeme Weise definieren. Unter Linux hatte ich viel Glück mit dertimes()
Funktion.quelle
gettimeofday - das Problem ist, dass es niedrigere Werte geben kann, wenn Sie die Hardware-Uhr ändern (z. B. mit NTP). Boost - für diese Projektuhr nicht verfügbar () - gibt normalerweise eine 4-Byte-Ganzzahl zurück, was bedeutet, dass die Kapazität niedrig ist, und Nach einiger Zeit werden negative Zahlen zurückgegeben.
Ich ziehe es vor, meine eigene Klasse zu erstellen und alle 10 Millisekunden zu aktualisieren, damit dieser Weg flexibler ist und ich ihn sogar verbessern kann, um Abonnenten zu haben.
Um es zu aktualisieren, benutze ich Setitimer:
Schauen Sie sich Setitimer und ITIMER_VIRTUAL und ITIMER_REAL an.
Verwenden Sie nicht die Alarm- oder ualarm-Funktionen, da Sie eine geringe Präzision haben, wenn Ihr Prozess eine harte Arbeit erhält.
quelle
Ich bevorzuge die Boost-Timer-Bibliothek wegen ihrer Einfachheit, aber wenn Sie keine Bibliotheken für Drittanbieter verwenden möchten, erscheint die Verwendung von clock () sinnvoll.
quelle
Als Update erscheint, dass unter Windows clock () die Wanduhrzeit misst (mit CLOCKS_PER_SEC-Genauigkeit)
Unter Linux wird die CPU-Zeit über die Kerne hinweg gemessen, die vom aktuellen Prozess verwendet werden
und (wie es scheint und wie auf dem Originalplakat vermerkt) tatsächlich mit geringerer Genauigkeit als CLOCKS_PER_SEC, obwohl dies möglicherweise von der spezifischen Linux-Version abhängt.
quelle
Ich mag die Hola Soy-Methode, gettimeofday () nicht zu verwenden. Es ist mir auf einem laufenden Server passiert, dass der Administrator die Zeitzone geändert hat. Die Uhr wurde aktualisiert, um denselben (korrekten) lokalen Wert anzuzeigen. Dies führte dazu, dass die Funktionszeit () und gettimeofday () um 2 Stunden verschoben wurden und alle Zeitstempel in einigen Diensten stecken blieben.
quelle
Ich habe eine
C++
Klasse mit geschriebentimeb
.Mitgliedsfunktionen:
Anwendungsbeispiel:
Die Ausgabe auf meinem Computer ist '19'. Die Genauigkeit der
msTimer
Klasse liegt in der Größenordnung von Millisekunden. Im obigen Verwendungsbeispiel wird die Gesamtzeit der Ausführung, die von derfor
Schleife benötigt wird, verfolgt. Diese Zeit beinhaltete das Ein- und Ausschalten des Betriebssystems in den Ausführungskontextmain()
aufgrund von Multitasking.quelle