Zeit messen
-
Jaah... sowas habe ich mir vorgestellt
Aber... *seufz*... meint ihr, es würde einmal was auf Anhieb klappen? Jetzt will er gar nicht mehr kompilieren
#include <ctime> #include <iostream> using namespace std; int main() { struct timespec tp; // time at begin and end double begin, end; clock_gettime(CLOCK_REALTIME, &tp); begin = 1e9*tp.tv_sec + tp.tv_nsec; for( long i = 0; i < 12345678; i++); clock_gettime(CLOCK_REALTIME, &tp); end = 1e9*tp.tv_sec + tp.tv_nsec; cout << "Time: " << (end-begin) << " nanoseconds (" << (end-begin)*1e-9 << " seconds)" << endl; }
Ausgabe beim kompilieren:
[21:45:21][~/dev/c++/damen] malte@fuchur $ g++ test.cpp /tmp/ccwqSts8.o(.text+0x1f): In function `main': : undefined reference to `clock_gettime' /tmp/ccwqSts8.o(.text+0x5e): In function `main': : undefined reference to `clock_gettime' collect2: ld returned 1 exit status
Was ist jetzt falsch? Egal, ob ich nun <ctime> oder <time.h> include, derselbe Fehler kommt. Und das, obwohl in der /usr/include/time.h dick und fett steht:
/* Get current value of clock CLOCK_ID and store it in TP. */ extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) __THROW;
Zu Hülf!
(sorry, wenn ich mich blöd anstelle... fang halt gerade erstmal an)
-
Achja... und was meintest du mit "nur POSIX"? Soweit ich weiss, ist POSIX ein Standard, der Funktionen definiert, die über die Standard C++ Library hinausgehen, richtig?
Meinst du, dass ich auch nicht unbedingt davon ausgehen kann, dass ich das auf allen Systemen habe? Und wenn ja, welche Funktion ist denn auf den "meisten" Systemen anzutreffen... gettimeofday oder clock_gettime?
-
einheitlix schrieb:
Achja... und was meintest du mit "nur POSIX"? Soweit ich weiss, ist POSIX ein Standard, der Funktionen definiert, die über die Standard C++ Library hinausgehen, richtig?
Meinst du, dass ich auch nicht unbedingt davon ausgehen kann, dass ich das auf allen Systemen habe? Und wenn ja, welche Funktion ist denn auf den "meisten" Systemen anzutreffen... gettimeofday oder clock_gettime?Posix ist das, woran sich eigentlich alle Unix Systeme halten. Windows hat das auch mal unterstützt. gettimeofday ist älter als clock_gettime und ich vermute, dass es von allen relevanten Plattformen unterstützt wird.
-
Alles klar... aber du hast auch keine Idee, woher der obige Fehler kommt? Das wurmt mich jetzt nämlich!
-
einheitlix schrieb:
Alles klar... aber du hast auch keine Idee, woher der obige Fehler kommt? Das wurmt mich jetzt nämlich!
clock_gettime ist in librt. Also -lrt benutzen.
-
Danke! Funktioniert jetzt alles wunderbar
-
vielleicht interressiert dich ja das hier auch noch:
http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=4&id=63830
dort wird eine Methode beschrieben wie man exakt die Ticks mit hilfe eines speziellen CPU counters bestimmen kann.Hab ich selber mal hier im Forum gefunden. sehr empfehlenswert. Aber an x86 gebunden da ASM instructionen benutzt werden.
-
Hi Leute,
kann ich die Funktion clock_gettime auch unter Windows XP benutzen?
Ich bekomme nämlich mit dem Dev-Cpp Compiler folgende Fehler:
17 [Warning] extra tokens at end of #include directive
52 aggregatetimespec tp' has incomplete type and cannot be defined 106
CLOCK_REALTIME' undeclared (first use this function)
106 `clock_gettime' undeclared (first use this function)Aber nach den vorhergehenden Beispielen müsste es ja funktionieren...
Und wie mache ich das? (Nur für den Fall... (Bin Newbie))
clock_gettime ist in librt. Also -lrt benutzen.
Danke an alle,
HdZ
-
Zeig bitte mal Deine #include<foobar.h>-Zeile; das sieht verheißungsvoll aus: "17 [Warning] extra tokens at end of #include directive". Passt gut zu den restlichen Fehlern.
-
hdz schrieb:
Hi Leute,
kann ich die Funktion clock_gettime auch unter Windows XP benutzen?
Wenn Windows den POSIX Standard und da die Realtime Extensions unterstützt, dann ja. Aber ich glaube nicht, dass Windows das kann.
-
Zeig bitte mal Deine #include<foobar.h>-Zeile;
Sorry, keine foobar.h
Brauch ich die? In den Beispielen war davon nie die Rede. Er sagt auch dass es die Datei net gibt.Wenn Windows den POSIX Standard und da die Realtime Extensions unterstützt, dann ja. Aber ich glaube nicht, dass Windows das kann.
Also bringt das hier eh nichts?
Danke,
HdZ
-
Oder meinst du meine #includes überhaupt?
Die wären#include <iostream> #include <windows.h> #include <winsock2.h> #include <stdio.h> #include <stdlib.h> //#include <sys/time.h> #include <ctime>;
-
foobar.h war nur ein Platzhalter.
Irgendwas passt laut Compiler mit dem #include in Zeile 17 nicht. Welches ist das denn?edit: Aber ob das unter Windows generell funktionieren kann oder nicht, weiß ich nicht. Soll ich Dich in ein geeignetes Forum verschieben?
-
Ne, die Zeile 17 ist schwer in Ordnug...
Das war irgendwie vom Compiler ein Fehler, er sagte nämlich in gewisser Weise:In Datei C:\Programme\....\ping.cpp**:7** | 17 [Warning] extra tokens at end of #include directive
Hab jetzt aber was gefunden:
time.h: timeGetTime()Gibt die Zeit seit dem Start von Windows zurück. (in ms)
Und nochwas rausgefunden: clock_gettime gibts unter windows nicht, die <ctime> ist unter Linux und Windoof einfach anders...
Danke euch allen...
HdZ
-
HdZ schrieb:
Und nochwas rausgefunden: clock_gettime gibts unter windows nicht, die <ctime> ist unter Linux und Windoof einfach anders...
Naja, clock_gettime ist aus der SuS IIRC und Windows ist größtenteils weder POSIX- noch SuS-kompatibel.
-
Die clock_gettime sollte in standard c library sein, ist sie aber nicht !
Dafür aber in librtman muss beim linken die -lrt dazulinken.
mfg.einheitlix schrieb:
Jaah... sowas habe ich mir vorgestellt
Aber... *seufz*... meint ihr, es würde einmal was auf Anhieb klappen? Jetzt will er gar nicht mehr kompilieren
#include <ctime> #include <iostream> using namespace std; int main() { struct timespec tp; // time at begin and end double begin, end; clock_gettime(CLOCK_REALTIME, &tp); begin = 1e9*tp.tv_sec + tp.tv_nsec; for( long i = 0; i < 12345678; i++); clock_gettime(CLOCK_REALTIME, &tp); end = 1e9*tp.tv_sec + tp.tv_nsec; cout << "Time: " << (end-begin) << " nanoseconds (" << (end-begin)*1e-9 << " seconds)" << endl; }
Ausgabe beim kompilieren:
[21:45:21][~/dev/c++/damen] malte@fuchur $ g++ test.cpp /tmp/ccwqSts8.o(.text+0x1f): In function `main': : undefined reference to `clock_gettime' /tmp/ccwqSts8.o(.text+0x5e): In function `main': : undefined reference to `clock_gettime' collect2: ld returned 1 exit status
Was ist jetzt falsch? Egal, ob ich nun <ctime> oder <time.h> include, derselbe Fehler kommt. Und das, obwohl in der /usr/include/time.h dick und fett steht:
/* Get current value of clock CLOCK_ID and store it in TP. */ extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) __THROW;
Zu Hülf!
(sorry, wenn ich mich blöd anstelle... fang halt gerade erstmal an)
-
ich hab ein problem
ich will die zeit zu beginn und am ende einer funktion messen
und dann die differenz bildenfunction function()
{
zeitmessen();}
2. mal zeitmessen2();
zeitdifferenz=zeitmessen2-zeitmessen;
-
Wo ist nun dein Problem und warum erweckst du dafür einen 1 1/2 Jahre alten Thread zum leben?
-
-
mein problem ist dass ich eine funktion brauch die mir die zeit misst