Zeitmessung



  • Warum ergibt das unterschiedliche Ausgaben:

    #pragma warning(disable: 4786)
    
    #include <iostream>
    #include <ctime>
    using namespace std;
    int main()
    {
    	time_t zeit1;
    	time_t zeit2;
    
    	time(&zeit1);
    	cout << "programm start: " <<ctime(&zeit1);
    	_sleep(2000);
    	time(&zeit2);
    	cout << ctime(&zeit1)  << ctime(&zeit2);
    
    	time(&zeit1);
    	cout << ctime(&zeit1);
    	_sleep(2000);
    	time(&zeit2);
    	cout << ctime(&zeit2);
    
    	return 0;
    }
    

    Ausgabe

    programm start: Tue Jan 04 12:29:45 2005
    Tue Jan 04 12:29:45 2005
    Tue Jan 04 12:29:45 2005
    Tue Jan 04 12:29:47 2005
    Tue Jan 04 12:29:49 2005
    

    Wieso klappt das mit den Zeiten nicht.
    Oder müsste ich mir die erst in einen string abspeichern???



  • cout << ctime(&zeit1) << ctime(&zeit2);
    glaub ich nicht.
    cout << ctime(&zeit1); cout << ctime(&zeit2);
    ist mir glaubwürdiger.

    @otze: genug übriggelassen? dann übernimm mal. 🙂



  • 🙂
    Also hier wird das

    cout << ctime(&time1) << ctime(&time2);
    

    ohne Fehler und Murren kompiliert.

    Nur habe ich dann exakt die gleiche Ausgabe.

    Schreibe ich es aber so:

    cout << ctime(&time1); cout ctime(&time2);
    

    bekomme ich die gewünschte Ausgabe.

    Es wird schon etwas klarer (hat bestimmt mit << zu tun - aber ich verstehe es im Moment nicht.



  • Jo, das ist echt eine verzwickete Situation.
    Das Problem ist: das Design von ctime() ist einfach mies, und daran scheitert dein Code.

    Man page schrieb:

    these functions leaves their result in an internal static object
    and return a pointer to that object. Subsequent calls to these function
    will modify the same object.

    Kommt dir jetzt die erleuchtung?
    Wenn nein, dann überlege dir, wie genau der ablauf von
    cout<<ctime(a)<<ctime(b);
    aussieht.
    was wird aufgerufen und in welcher reihenfolge.

    damit sollte das problem lösbar sein.
    wenn nicht -> frag nach, aber du müsstest es auch so schaffen.



  • wenn du die zeit behalten möchtest, dann übergib sie einer variable und lies sie nicht immer wieder aufs neue aus



  • enno-tyrant schrieb:

    wenn du die zeit behalten möchtest, dann übergib sie einer variable und lies sie nicht immer wieder aufs neue aus



  • ich frage mich oft warum solche Sachen nicht gepath werden oder
    warum man es nicht vorher schon ordentlich macht (bzw testet)



  • Zu C-Zeiten hatte man sich scheinbar keine Gedanken darüber gemacht, dass man irgendwann Operatoren überladen kann und es für eine gute Lösung gehalten. Nachträglich rumpatchen ist auch Mist, weil dann bereits bestehender Code fehlerhaft wird.



  • leo aka qsch schrieb:

    ich frage mich oft warum solche Sachen nicht gepath werden oder
    warum man es nicht vorher schon ordentlich macht (bzw testet)

    Es ist by Design so.
    ctime() ist sowieso blödsinnig, weil so nen Datumstring kann man sich leicht selber bauen und den bedürfnissen anpassen.

    außerdem ist es bereits 'gepatcht' es gibt ctime_r() welches zu POSIX gehört

    ctime() ist einfach dafür da, mal schnell ein Datum auszugeben, quasi eine RAD funktion 🙂

    @MaSTaH:
    nur doof, dass printf("%s%s", ctime(a), ctime(b));
    das selbe Problem hat wie das cout hat 😉



  • Shade Of Mine schrieb:

    @MaSTaH:
    nur doof, dass printf("%s%s", ctime(a), ctime(b));
    das selbe Problem hat wie das cout hat 😉

    Wer macht denn auch so was 🕶 ? Ausserdem gibts ja boost.date_time.



  • Shade Of Mine schrieb:

    Kommt dir jetzt die erleuchtung?
    Wenn nein, dann überlege dir, wie genau der ablauf von
    cout<<ctime(a)<<ctime(b);
    aussieht.
    was wird aufgerufen und in welcher reihenfolge.

    Analog meinen Ausgaben:
    Erst wird ctime(a) an cout gegeben und dann ctime(b).
    Aber so ganz raff ich des dennoch nicht.



  • Eine kleine Hilfe: die Funktion könnte so aussehen:

    const char* const ctime(time_t& t)
    {
        static char* result;
        //formatiere result anhand von t
        return result;
    };
    

    (Stimmt doch so in etwa, oder?)
    /edit: ich bin doof



  • hehejo schrieb:

    Erst wird ctime(a) an cout gegeben und dann ctime(b).
    Aber so ganz raff ich des dennoch nicht.

    und ctime() liefert einen zeiger
    und worauf zeigt dieser?



  • Shade Of Mine schrieb:

    hehejo schrieb:

    Erst wird ctime(a) an cout gegeben und dann ctime(b).
    Aber so ganz raff ich des dennoch nicht.

    und ctime() liefert einen zeiger
    und worauf zeigt dieser?

    Dieser müsste dann auf static char result;* zeigen.

    Nebenbei:
    Das mit einer "static" Variablen in einer Funktion kenne ich nicht und weiß auch nicht, was das bewirkt.
    //edit
    Jetzt weiß ich das:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=static#Answ



  • ist das vielleicht so gemeint?

    time_t anfangszeit;
    time_t zeit1,zeit2;
    
    zeit1 = time(&anfangszeit);
    _sleep(2000);
    zeit2 = time(&anfangszeit);
    

    Aber das funktioniert glaub ich bloß bis:
    19:14:07, January 18, 2038



  • Ovaron123 schrieb:

    Aber das funktioniert glaub ich bloß bis:
    19:14:07, January 18, 2038

    aus zuverlässigen quellen haben wir erfahren, daß mitte 2015 time_t auf 64 bit augeblasen wird. bis 2038 sollten alle rechner upgedated worden sein. wir haben nich nicht abschließend berechnen können, bis wann der 64-bitter langen wird. wie berechnet man das?



  • Keine Ahnung, aber in MSDN steht:

    After 23:59:59, December 31, 3000, UTC (using _time64 and __time64_t).



  • Ovaron123 schrieb:

    ist das vielleicht so gemeint?

    time_t anfangszeit;
    time_t zeit1,zeit2;
    
    zeit1 = time(&anfangszeit);
    _sleep(2000);
    zeit2 = time(&anfangszeit);
    

    Also eigentlich wollte ich ja nur ganz simpel den Zeitunterschied darstellen.

    time_t start, end;
    time(&start);
    // ganz viele lange Sachen
    time(&end);
    
    // Gleichzeitige Ausgabe per ctime
    cout << ctime(&start) << ctime(&end);
    
    // Aber wie ich jetzt ja erfahren habe funktioniert das nicht wie gewünscht.
    // Eher so
    cout << ctime(&start); cout << ctime(&end);
    


  • ich habe noch keine begründung gesehen, warum das in einem ausgabebefehl nicht klappt. es scheinen zwar viele einen schimmer davon zu haben, aber es bleibt ein geheimnis und wird nubes nicht verraten.



  • Ich weiß zwar nicht was er bei dir ausspuckt, aber bei mir ist ein Zeitunterschied von genau 2 Sekunden.

    Aber wenn du Windows benutzen solltest, würde ich sowiso den Api-Befehl
    "GetTickCount" benutzen.


Anmelden zum Antworten