Ich möchte die Zeit in Millisekunden berechnen, die für die Ausführung eines Teils meines Programms benötigt wird. Ich habe online gesucht, aber es gibt nicht viele Informationen zu diesem Thema. Weiß einer von euch wie das geht?
Berechnen der verstrichenen Zeit in einem C-Programm in Millisekunden
Benutzer69514
Am besten antwortest du mit einem Beispiel:
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/* Return 1 if the difference is negative, otherwise 0. */
int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1)
{
long int diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
result->tv_sec = diff / 1000000;
result->tv_usec = diff % 1000000;
return (diff<0);
}
void timeval_print(struct timeval *tv)
{
char buffer[30];
time_t curtime;
printf("%ld.%06ld", tv->tv_sec, tv->tv_usec);
curtime = tv->tv_sec;
strftime(buffer, 30, "%m-%d-%Y %T", localtime(&curtime));
printf(" = %s.%06ld\n", buffer, tv->tv_usec);
}
int main()
{
struct timeval tvBegin, tvEnd, tvDiff;
// begin
gettimeofday(&tvBegin, NULL);
timeval_print(&tvBegin);
// lengthy operation
int i,j;
for(i=0;i<999999L;++i) {
j=sqrt(i);
}
//end
gettimeofday(&tvEnd, NULL);
timeval_print(&tvEnd);
// diff
timeval_subtract(&tvDiff, &tvEnd, &tvBegin);
printf("%ld.%06ld\n", tvDiff.tv_sec, tvDiff.tv_usec);
return 0;
}
Eine andere Option (zumindest auf einigen UNIX) ist clock_gettime und damit verbundene Funktionen. Diese ermöglichen den Zugriff auf verschiedene Echtzeituhren und Sie können eine der höheren Auflösungen auswählen und die nicht benötigte Auflösung wegwerfen.
-
Besonders die
CLOCK_MONOTONIC
Uhr, wenn das System, auf dem Sie laufen, dies unterstützt (sysconf(_SC_MONOTONIC_CLOCK) > 0
).– Café
23. September 2009 um 23:16 Uhr
Das gettimeofday
Funktion gibt die Zeit mit Mikrosekunden-Präzision zurück (wenn die Plattform das natürlich unterstützen kann):
Die Funktion gettimeofday() erhält die aktuelle Zeit, ausgedrückt in Sekunden und Mikrosekunden seit der Epoche, und speichert sie in der timeval-Struktur, auf die tp zeigt. Die Auflösung der Systemuhr ist nicht spezifiziert.
-
gettimeofday
eignet sich nicht gut zum Messen der verstrichenen Zeit zwischen zwei Ereignissen, da die Uhrzeit des Systems zwischen den Ereignissen geändert werden kann (z. B. durch ein NTP-Update oder einfach durch eine Administratoraktion). (Manchmal es ist das Beste, was es gibt).– Café
23. September 2009 um 23:14 Uhr
gbarry
C-Bibliotheken haben eine Funktion, mit der Sie die Systemzeit abrufen können. Sie können die verstrichene Zeit berechnen, nachdem Sie die Start- und Stoppzeiten erfasst haben.
Die Funktion heißt gettimeofday() und Sie können in der Manpage nachsehen, was Sie einbinden und wie Sie sie verwenden.
Unter Windows können Sie einfach Folgendes tun:
DWORD dwTickCount = GetTickCount();
// Perform some things.
printf("Code took: %dms\n", GetTickCount() - dwTickCount);
Nicht die allgemeinste/eleganteste Lösung, aber nett und schnell, wenn Sie es brauchen.
Retagged mehr im Einklang mit der Konvention.
– dmckee — Ex-Moderator-Kätzchen
23. September 2009 um 21:45 Uhr
hm … habe ich diese Frage nicht vor einer Woche beantwortet: stackoverflow.com/questions/1444428/…
– Christoph
23. September 2009 um 22:37 Uhr