C Systemzeit in Millisekunden abfragen

$ch4pse

Lt. Junior Grade
Registriert
Feb. 2007
Beiträge
390
Hi Leute,

Ich muss am Mittwoch mein Projekt abgeben um an der Modulprüfung programmieren an meiner Hochschule dabei sein zu dürfen. Bin seoweit auch schon fertig, muss aber noch die Durchlaufzeit berechnen. Dazu soll die Systemzeit in millisekunden zu beginn des Algorithmus abgefangen werden und dann mit der Systemzeit in Millisekunden am Ende des Algo verglichen werden. Ich programmiere auf einem Ubuntu System in C.
Wie kann ich die Sysmzeit abfragen? ich hab was gelesen mit ftime und alle, das lässt sich auch schön durch-compilern aber es errechnet immer eine durchlaufzeit von 0ms was nicht sein kann. Was mach ich da falsch?

Bitte um Hilfe
Greetz Phil
 
hi,
z.B. so:

#include <sys/time.h>
...
gettimeofday(&start, NULL);
...
gettimeofday(&end, NULL);
...
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;

gruß
 
Keine Ahnung, wie du es nun implementiert hast, aber i.d.R. laufen Algorithmen sehr schnell, wenn sie nicht zu komplex sind und haben eine Laufzeit von wenigen Microsekunden. Darum wirst du u.U. mit Millisekunden da nichts messen können. Für gewöhnlich werden Algorithmen mehrmals (1.000 Mal oder mehr) durchlaufen, um ein Ergebnis zu bekommen.
 
Zuletzt bearbeitet:
Also bisher habe ich es folgendermaßen implementiert:
Code:
void calc_time()
{
long actual_time, runtime;
ftime(&actual_time);
runtime = actual_time - starting_time;
printf("Laufzeit: %li ms\n", runtime);
}

Anmerkung: "starting_time" ist eine globale Variable die bei jedem Erreichen des Algo neu beschrieben wird.
 
soyd schrieb:
hi,
z.B. so:

#include <sys/time.h>
...
gettimeofday(&start, NULL);
...
gettimeofday(&end, NULL);
...
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;

gruß

Genau so. Musst Du aber ggf. noch in Millisekunden umrechnen.
 
Schau mal in die Manpage von clock_gettime(), das könnte auch noch interessant sein, solange es nur auf einem neueren System laufen muss. High-Precision-Timer in der CPU vorausgesetzt und im BIOS aktiviert. Die NOTES sorgfältig lesen.

Falls du die Manpages nicht installiert hast:
apt-get install manpages-dev

Je nach Implementierung und Hardware-Unterstützung "tickt" gettimeofday üblicherweise im 4ms oder 13ms Takt - von daher sollte man gemessenen Zeiten im Millisekundenbereich nie so recht trauen. Lieber die Berechnung ein paar Sekunden oder noch mehr rechnen lassen und das ganze das selbst durch die Anzahl der Durchläufe teilen, um auf einen realistischeren Wert zu kommen.
Außerdem ist noch die Frage, ob du die Realtime oder die Wall Clock Time willst.

Edit:
Eine weitere Möglichkeit wäre getrusage. Einfach mal die Manpage quälen. Die interessanten Felder sind ru_utime und ru_stime, insbesondere wenn du nach User- und Systemtime unterscheiden willst.
 
Zuletzt bearbeitet:
kuddlmuddl schrieb:
Ich hab sowas immer ganz einfach so gemacht:
Code:
#include <ctime>
clock_t start, ende;
start = clock();
// hier vergeht Laufzeit die gemessen werden soll
ende = clock();
std::cout << ende - start << endl;

http://stefanhermann.com/?p=10 zB

edit: Je nach Plattform kann es scheinbar nötig sein noch CLOCKS_PER_SEC abzufragen und evtl. mit einzurechnen.
http://www.cplusplus.com/reference/clibrary/ctime/clock/


Ob das geht, hängt von der Aufgabenstellung ab. clock() gibt die vergangene CPU-Zeit wieder, was nicht notwendigerweise der tatsächlich verstrichenen Zeit entsprechen muß. Wenn in der Realität 3 Sekunden verstrichen sind, dein Programm aber zwischen 2 clock()-Aufrufen nur insgesamt 0.5 Sekunden die CPU in Beschlag hatte, dann wirst du mit clock() eben nur ein Delta von 0.5 Sekunden kriegen.
 
Also ich komme hier gar nicht zurande. wenn ich den vorschlag von soyd benutze bekomm ich den compiler-fehler dass "timeval" nicht definiert sei. Benutze ich den Vorschlag von kuddlmuddl bekomme ich folgende ausgabe:
Code:
fatal error: ctime: Datei oder Verzeichnis nicht gefunden
compilation terminated.

bin ich nach einem jahr abstinenz zu blöd zum programmieren oder hab ich grundliegende fehler gemacht? Hier nochmal zum besseren Verständnis mein Code zum testen der zeitfunktionen.

Code:
#include<stdio.h>
#include<ctime>

int main(){
int i, diff;
clock_t start, end;
start = clock();
printf("now idling");
for(i=0; i=100; i++) {}
end = clock();
diff = end-start;
printf("Laufzeit: %i\n", diff);
return 0;
}
 
$ch4pse schrieb:
Also ich komme hier gar nicht zurande. wenn ich den vorschlag von soyd benutze bekomm ich den compiler-fehler dass "timeval" nicht definiert sei. Benutze ich den Vorschlag von kuddlmuddl bekomme ich folgende ausgabe:
Code:
fatal error: ctime: Datei oder Verzeichnis nicht gefunden
compilation terminated.

bin ich nach einem jahr abstinenz zu blöd zum programmieren oder hab ich grundliegende fehler gemacht? Hier nochmal zum besseren Verständnis mein Code zum testen der zeitfunktionen.

Code:
#include<stdio.h>
#include<ctime>

int main(){
int i, diff;
clock_t start, end;
start = clock();
printf("now idling");
for(i=0; i=100; i++) {}
end = clock();
diff = end-start;
printf("Laufzeit: %i\n", diff);
return 0;
}

Bis auf die "for"-Schleife kann ich es ordentlich übersetzen:

statt
for (i=0; i=100; i++)

schreibe
for (i=0; i==100; i++)

Mein System ist ein Berkeley UNIX. Standardmäßig wird ausf solchen Systemen stets sauber auch die Entwicklungsumgebung mitinstalliert. Das ist bei LinSux immer ein Streß mit den "Header" Dateien. Hast Du die Kernel-HEader installiert? "ctime" sollte existieren ...
 
Das erklärt zwar nicht den Fehler - aber "100x nichts" dauert definitiv weniger als auch nur 1ms. Mal abgesehen davon, dass vermutlich beim release (statt debug) build durch automatische optimierung der code eh verschwindet.
Mach doch sowas wie 100x print rand(). Allein das printen wird dann messbare Zeit verbrauchen.

Woher der Fehler kommt weiß ich aber auch nicht..
ich würd hiernach googlen:
fatal error: ctime: no such file or directory
 
Zuletzt bearbeitet:
$ch4pse schrieb:
Code:
fatal error: ctime: Datei oder Verzeichnis nicht gefunden
compilation terminated.
ctime ist ein C++-Header.

In C heißt das Ding time.h
Für timeval sollte man ggf. <sys/time.h> noch inkludieren.
 

Ähnliche Themen

Zurück
Oben