c++ bekommen Millisekunden seit ein paar Tag
Ich brauche eine Möglichkeit in c++ zu verfolgen die Anzahl der Millisekunden seit der Ausführung des Programms. Und ich brauche die Genauigkeit in Millisekunden. (In meinem googeln habe ich gefunden, dass viele Leute, die gesagt gehören Zeit.h und multiplizieren der Ausgabe des time()
von 1000 ... das wird nicht funktionieren.)
- Ich denke, wir müssen wissen, über das Betriebssystem, das Sie interessiert; ich bin ziemlich sicher, dass es keine portable Möglichkeit, diese zu bekommen.
- Es scheint, dass die Zeit.h clock () - Lösung unten funktioniert Prima. Ist es ein Problem, dass ich hier nicht gedacht haben?
- gut, ich persönlich benutze clock (), um zu sehen, wie lange es dauert, zu lösen euler Probleme.. Es ist perfekt für meinen Fall, so dass es hängt wirklich davon ab, wie spezifisch Sie sein möchten.
- ja --
clock
gibt die Zeit mit einer Auflösung vonCLOCKS_PER_SEC
, die könnte überall sein von Millisekunden bis ganze Sekunden.CLOCKS_PER_SEC
können Sie konvertieren, um Sekunden, aber es kann nicht gleich die richtige Auflösung. Zum Beispiel, VC++ liefert ein Ergebnis in Millisekunden -- aber die tatsächliche Schrittweite ist in der Regel rund 10 ms. I. e., erhalten Sie eine Zeit von 0, dann 10, dann 20, und so weiter. - guter Punkt (+1). Obwohl für meine aktuellen mock-up I hohe Auflösung erfordern eher als Genauigkeit. Albern, nicht wahr?
clock()
hat nicht zählen zu den Uhren. Es zählt Uhren Sie das Programm ausgeführt wurde, eine feine, aber wichtige Unterscheidung. Der Bemerkenswerte Unterschied ist, dassclock()
nicht weiter zu zählen, während das Programm schläft oder blockiert I/O (dist/Netzwerk).- außer, wenn es funktioniert. Wie bereits in meiner Antwort, verschiedene Implementierungen funktionieren anders in dieser Hinsicht. Während ich damit einverstanden, dass die Absicht ist, dass
clock
zählen nur CPU-Zeit, ist es nicht immer umgesetzt werden, dass Art und Weise.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen
std::clock()
clock()
ist nicht real-time-clock. Es ist die CPU-time-clock, das kann schneller laufen, wenn multi-threading verwendet wird, und langsamer (gestoppt), wenn Sie blockiert wird, die von einigen IO.clock
wurde vorgeschlagen, eine Anzahl von Zeiten. Dies hat zwei Probleme. Zuerst von allen, ist es oft nicht eine Auflösung haben, die einmal in die Nähe einer Millisekunde (10-20 ms ist wohl eher üblich ist). Zweitens, einige Implementierungen (z.B., Unix und ähnliche) Rückkehr CPU-Zeit, während andere (E. g., Windows) return-Wand Zeit.Hast du nicht wirklich gesagt, ob Sie möchten, Wand, Zeit oder CPU-Zeit, was es schwierig macht, zu geben eine wirklich gute Antwort. Auf Windows könnten Sie
GetProcessTimes
. Geben Sie die kernel-und user-CPU-Zeit, direkt. Es wird auch Ihnen sagen, Wann der Prozess erstellt wurde, wenn Sie so wollen Millisekunden der Wand Zeit, da der Prozess der Schöpfung, Sie können abziehen, die Prozess-Erstellung Zeit von der aktuellen Zeit (GetSystemTime
).QueryPerformanceCounter
wurde auch erwähnt. Dieser hat ein paar Merkwürdigkeiten seiner eigenen-zum Beispiel, in einigen Implementierungen, es ruft die Zeit aus den CPUs Zyklus-Zähler, so dass deren Frequenz variiert, wenn/falls die CPU-Geschwindigkeit ändert. Andere Implementierungen Lesen von der Hauptplatine 1.024 MHz timer, die nicht nicht variieren mit der CPU-Geschwindigkeit (und die Bedingungen, unter denen jede verwendet werden, sind nicht völlig offensichtlich ist).Unter Unix verwenden, können Sie
GetTimeOfDay
zu bekommen, die Wand der Zeit mit (zumindest die Möglichkeit) relativ hohe Genauigkeit. Wenn Sie möchten-Zeit für einen Prozess, die Sie verwenden können,mal
odergetrusage
(letzteres ist neuer und bietet mehr vollständige Informationen, kann auch nicht mehr so genau).Bottom line: wie ich sagte, in meinem Kommentar, es gibt keine Möglichkeit, das zu bekommen, was Sie wollen Mobil. Da du noch nicht gesagt, ob Sie möchten, CPU-Zeit oder an der Wand Zeit, auch für ein bestimmtes system, es gibt nicht die eine richtige Antwort. Die von Ihnen "akzeptiert" (
clock()
) hat die Tugend, dass verfügbar auf nahezu jedem system, aber was, es gibt auch variiert nur über die am weitesten verbreitete.Zeit.h, und verwenden Sie dann die clock () - Funktion. Es gibt die Anzahl von Uhr-ticks vergangen sind, seit das Programm gestartet wurde. Nur dividieren Sie durch "CLOCKS_PER_SEC", um die Anzahl der Sekunden, können Sie multiplizieren Sie mit 1000, um die Anzahl der Millisekunden.
Einige cross-Plattform-Lösung. Dieser code verwendet wurde, für irgendeine Art von benchmarking:
Den meisten tragbaren Weg ist mit dem Uhr Funktion.Es in der Regel berichten die Zeit, die Ihr Programm wurde mit dem Prozessor, oder eine Annäherung davon. Beachten Sie jedoch die folgenden:
Die Auflösung ist nicht sehr gut für GNU-Systeme. Das ist wirklich schade.
Kümmern casting alles zu Doppel - vor Spaltungen und Rendezvous.
Den Zähler gehalten wird als 32-bit-Zahl in GNU 32 bits, das kann ziemlich ärgerlich für lange laufende Programme.
Gibt es alternativen mit "Mauer-Zeit", die bessere Auflösung in Windows und in Linux. Aber wie das libc-Handbuch sagt: Wenn Sie versuchen, optimieren Sie Ihr Programm, oder Messen Sie Ihre Effizienz, ist es sehr nützlich zu wissen, wie viel Prozessor-Zeit, die es verwendet. Für, die, Kalender, Uhrzeit und verstrichene Zeiten sind nutzlos, denn ein Prozess kann zu verbringen Zeit mit dem warten auf I/O oder für andere Prozesse auf die CPU.
Hier ist eine C++0x-Lösung und ein Beispiel, warum
clock()
könnte nicht tun, was Sie denken, es tut.Auf meinem system Ausgänge:
Werden Sie feststellen, die
clock()
- Methode fehlt ein zweites. Eine aufmerksame Beobachter können auch feststellen, dassclock()
sieht weniger Auflösung. Auf meinem system ist es das ticken von in 12 Millisekunde Schritten, schreckliche Auflösung.Wenn Sie nicht in der Lage oder nicht Willens ist, die C++0x, werfen Sie einen Blick auf Boost.DateTime's
ptime microsec_clock::universal_time()
.Dies ist nicht C++ - spezifisch (noch tragbare), aber Sie tun können:
In Windows.
Von dort aus können Sie auf jedes Mitglied des systemDT
struct
.Können Sie erfassen die Zeit, als das Programm begann, und vergleichen Sie die aktuelle Zeit auf die Zeit aufgezeichnet (
systemDT
versussystemDTtemp
zum Beispiel).Zu aktualisieren, rufen Sie
GetLocalTime(&systemDT);
Zugang zu jedem Mitglied, Sie würde tun
systemDT.wHour
,systemDT.wMinute
,systemDT.wMilliseconds
.Um mehr Informationen zu bekommen SYSTEMTIME.
Wollen Sie die wall clock time, CPU-Zeit, oder eine andere Messung? Auch, welche Plattform ist das? Es gibt keine universell tragbare Weg, um mehr Präzision als
time()
undclock()
Ihnen, aber...gettimeofday()
und/oderclock_gettime()
, die mindestens Mikrosekunden-Präzision und Zugang zu einer Vielzahl von Timern;Können Sie versuchen, diesen code (erhalten Sie von Stockfisch Schach-engine, source-code (GPL)):