Zeitmessung



  • 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.



  • Ovaron123 schrieb:

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

    Dieser Code

    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main()
    {
      time_t start, end;
      time(&start);
      _sleep(2000);
      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);
    
      return 0;
    }
    

    gibt bei mir (in der Arbeit) diese Ausgabe

    Wed Jan 05 09:40:51 2005
    Wed Jan 05 09:40:51 2005
    Wed Jan 05 09:40:51 2005
    Wed Jan 05 09:40:53 2005
    

    Ovaron123 schrieb:

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

    Ja, hier in der Arbeit habe ich schon Windows - aber zuhause eben nicht.
    Und darum versuche ich eben nichts spezifisches von Windows zu nehmen.



  • hehejo schrieb:

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

    Und was steht in result drinnen?

    Nach dem ersten Aufruf steht was drinnen und was nach dem 2.?
    Und was wird dann cout übergeben?

    Denke nach: in welcher Reihenfolge werden diese 4(!) Funktionen aufgerufen



  • Shade Of Mine schrieb:

    hehejo schrieb:

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

    Und was steht in result drinnen?

    Nach dem ersten Aufruf steht was drinnen und was nach dem 2.?
    Und was wird dann cout übergeben?

    Nun, beim ersten Mal gibt es result noch nicht und darauf hin wird es als statische Funktionsvariable angelegt.
    D.h. beim zweiten Aufruf von ctime steht genau das gleiche drin.

    Wahrscheinlich prüft ctime ob es in result schon was stehen hat und wenn dann "rechnet/formatiert" ctime nimmer sondern gibt einfach das "Alte" aus.

    Shade Of Mine schrieb:

    Denke nach: in welcher Reihenfolge werden diese 4(!) Funktionen aufgerufen

    4 Funktionen? Hab ich was verpasst? 😕
    Oder anscheinend das "<<"-Prinzip nicht ganz verstanden.



  • hehejo schrieb:

    Nun, beim ersten Mal gibt es result noch nicht und darauf hin wird es als statische Funktionsvariable angelegt.
    D.h. beim zweiten Aufruf von ctime steht genau das gleiche drin.

    Wahrscheinlich prüft ctime ob es in result schon was stehen hat und wenn dann "rechnet/formatiert" ctime nimmer sondern gibt einfach das "Alte" aus.

    um genau zu sein, ist das keine statische variable, sondern eine globale variable, die von so ziemlicher jeder time funktion in <ctime> als puffer missbraucht wird.
    die funktion dürfte auch herzlich wenig interessieren, ob da schon was drinsteht oder nicht,und da der puffer nie genullt wird, weis die funktion auch nicht wann der puffer ausgelesen wurde.

    Shade Of Mine schrieb:

    Denke nach: in welcher Reihenfolge werden diese 4(!) Funktionen aufgerufen

    4 Funktionen? Hab ich was verpasst? 😕
    Oder anscheinend das "<<"-Prinzip nicht ganz verstanden.

    es sind genau 4 funktionen, da jeder op<< eine eigene funktion darstellt.

    @volkard mhh ich bin mir wirklich nicht sicher, was da los ist...

    cout << ctime(&start)<< ctime(&end);
    

    setzen wir mal klammern zur verdeutlichung:

    (cout << ctime(&start))<< ctime(&end);
    

    das forme ich mal so um, wies der compiler tut

    //disclaimer: kein valides c++ mehr, nur visualisierung
    operator <<(operator <<(cout,ctime(&start)),ctime(&end));
    

    und wenn man diesen wust durchsieht, sieht man, dass der 2. op<< vor dem ersten aufgerufen wird.

    nun hab ich leider mein drachenbuch nicht zur hand, aber soweit ich mich erinner,drehen die compiler die reihenfolge der parameter noch um,sodass quasi sowas am ende übrigbleibt:

    //disclaimer: kein valides c++ mehr, nur visualisierung
    operator <<(ctime(&end),operator <<(ctime(&start),cout));
    

    daraus kann man erkennen, dass ctime(&end) vor ctime(&start) aufgerufen wird, und somit der rückgabewert von ctime(&end) verloren ist.

    hier ein test der das beweist:

    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    //das muss in eine normale funktion, um sicherzustellen dass der aufruf nicht verschoben wird
    char* test(char* in){
    	cout<<in<<endl;
    	return in;
    }
    int main()
    {
      time_t start, end;
      time(&start);
      _sleep(2000);
      time(&end);
    
      // Gleichzeitige Ausgabe per ctime
      cout << ctime(&start)<< test(ctime(&end));
    
      int i;
      cin>>i;
    
      return 0;
    }
    


  • fast richtig.
    nur ist die Reihenfolge der Auswertung der Argumente unspezifiziert.

    Aber sonst korrekt!



  • Shade Of Mine schrieb:

    fast richtig.
    nur ist die Reihenfolge der Auswertung der Argumente unspezifiziert.

    mit anderen worten: wenn man eine funktion foo(a,b,c) hat, darf man sich nicht darauf verlassen, dass a vor b und b vor c ausgewertet wird?

    Aber sonst korrekt!

    Juhu 😃



  • otze schrieb:

    mit anderen worten: wenn man eine funktion foo(a,b,c) hat, darf man sich nicht darauf verlassen, dass a vor b und b vor c ausgewertet wird?

    Jo, alles was man weiss ist, dass in foo() a, b und c ausgewertet ankommen.


Anmelden zum Antworten