Problem mit time.h, clock() und Zeitmessung im Allgemeinen bei C/C++ Code Mischmasch



  • Ich habe hier ein Stück Code das etwa folgendermaßen aussieht:

    [code]
    #include <time.h>
    #include "function.h" // meine Eigenen Funktionsdeklarationen aller meiner Funktionen in allen Quellcodedateien dieses Programmes

    int meine_funktion(int par_1, int par_2 usw..)
    {
    clock_t t1, t2;
    .
    .
    // ein paar Variablendefinitionen und weiteres unwichtiges Zeug

    t1 = clock();
    do
    // darin liegen 5 weitere do while Schleifen,
    // sowie 2 Funktionsaufrufe zu eigenen Funktionen, die aber in einer
    // anderen Quellcodedatei genau definiert sind.
    // Lediglich die Deklarationen stehen in der oben eingebundenen Headerdatei
    while (AUSDRUCK);

    // Marker 123, siehe Text weiter unten

    t2 = clock();
    cout << "Die Zeit der Berechnung betrug: " << (double) (t2-t1)*1000/CLOCKS_PER_SEC << " msec." << endl;
    return 0;
    }

    Das Problem an dem ganzen Programm ist, daß die gemessene Zeit
    immer 0 ist, obwohl die Berechnung innerhalb der geschachtelten do while Schleifen deutlich länger ist.

    Erst wenn ich an der Stelle in dem ich das Kommentar mit dem "Marker 123"
    erwähnt habe, eine For Schleife einbaue, die das darin liegende int i= 0 bis 50000 10 mal um 1 erhöt, berechnet, erhalte ich für meine Zeit einen Meßwert.

    Der Compiler ist der GNU g++ Compiler.
    Das ganze wird unter Linux compiliert.

    Meine Frage, warum ist das so?
    Ich kann mir das nicht erklären.

    Muß ich vielleicht die Headerdatei <time.h> auch in den anderen Funktionen, die ich innerhalb der do While Schleife aufrufe, includieren?
    Daran kann es doch aber nicht leigen, schließlich brauche ich die Time Funktionen nicht in diesen aufgerufenen Funktionen.

    Woran liegt das also?
    Warum erhalte ich nur 0 Sekunden als Wert?



  • Sorry, Abschlußtag vergessen.

    So sieht der Code aus:

    #include <time.h>
    #include "function.h" // meine Eigenen Funktionsdeklarationen aller meiner Funktionen in allen Quellcodedateien dieses Programmes
    
    int meine_funktion(int par_1, int par_2 usw..)
    {
      clock_t t1, t2;
      .
      .
      // ein paar Variablendefinitionen und weiteres unwichtiges Zeug
    
      t1 = clock();
      do
        // darin liegen 5 weitere do while Schleifen, 
        // sowie 2 Funktionsaufrufe zu eigenen Funktionen, die aber in einer
        // anderen Quellcodedatei genau definiert sind. 
        // Lediglich die Deklarationen stehen in der oben eingebundenen Headerdatei
      while (AUSDRUCK);
    
      // Marker 123, siehe Text weiter unten
    
      t2 = clock();
      cout << "Die Zeit der Berechnung betrug: " << (double) (t2-t1)*1000/CLOCKS_PER_SEC << " msec." << endl;
      return 0;
    }
    


  • Ach ja, eines ist vielleicht noch erwähnenswert.

    Eine Funktione die innerhalb der do-while Schleife aufgerufen wird,
    öffnet und schließt eine Datei und macht einen system("Programm") Call.



  • könnte es sein dass die berechnungen nicht sehr viel zeit brauchen (maximal einige millisekunden) und das deshalb nicht angezeigt wird?!?

    und selbst wenn es millisekunden sind wird es durch deine 1000/Clocks... wegegerundet weils ja int werte sind (übrigens ist soweit ich weis clocks per second als 1000 definiert)

    lass dir einfach mal t2-t1 ausgeben mehr nicht

    wenns immer noch 0 ist denk mal drüber anch ob dein problem überhaupt genug zeit für eine messung braucht 😉



  • Skym0sh0 schrieb:

    könnte es sein dass die berechnungen nicht sehr viel zeit brauchen (maximal einige millisekunden) und das deshalb nicht angezeigt wird?!?

    Nein, das ist ausgeschlossen.

    Ich kann bei den Berechnungen ja selbst mitzählen.
    Das sind mindestens 25 Sekunden.

    lass dir einfach mal t2-t1 ausgeben mehr nicht

    Hab ich auch schon gemacht, der zeigt immer 0 an.



  • On several other implementations, the value returned by clock() also includes the times of any children whose status has been collected via wait(2) (or another wait-type call). Linux does not include the times of waited-for children in the value returned by clock().

    es wäre also wichtig zu wissen, was die funktionen die du da aufrufst tatsächlich machen. forken die einen anderen prozess oder thread und warten darauf, dass er mit der arbeit fertig ist? im falle eines joins oder sleeps oder was weiß ich nicht noch alles konsumiert dein eigentlicher prozess nämlich keine cpu zeit. um die zeit aller kindprozesse oder threads mit einzubeziehen, nimm times() statt clock(). :xmas1:



  • sothis_ schrieb:

    On several other implementations, the value returned by clock() also includes the times of any children whose status has been collected via wait(2) (or another wait-type call). Linux does not include the times of waited-for children in the value returned by clock().

    es wäre also wichtig zu wissen, was die funktionen die du da aufrufst tatsächlich machen. forken die einen anderen prozess oder thread und warten darauf, dass er mit der arbeit fertig ist? im falle eines joins oder sleeps oder was weiß ich nicht noch alles konsumiert dein eigentlicher prozess nämlich keine cpu zeit. um die zeit aller kindprozesse oder threads mit einzubeziehen, nimm times() statt clock(). :xmas1:

    Ok, also ich würde es mal so sagen.

    Interne, innerhalb der eigenen Schleifen des eigenen Programmcodes wird nicht viel berechnet, die meiste Zeit dürfte wohl das Öffnen einer sehr kleinen Textdatei beanspruchen, aber das ist auch nicht viel Zeit.

    Die meiste Zeit wird also beim Systemaufruf system("anderes_programm..") verbraucht, wobei hier dieses Programm die meiste Zeit benötigt.

    Ich weiß jetzt nicht, inwiefern mein C++ Code bei einem Systemaufruf schlafen gelegt wird, aber ich kann zumindest sagen, daß der Systemaufruf in einer
    if Abfrage ausgeführt wird, weil ich wissen will, ob das Ergebis erfolgreich war.

    Sprich das sieht etwa so aus:

    if ( system("anderes_programm") == true)
    {
      cout << "Alles ok" << endl;
      // noch ein paar andere Dinge
    }
    else
    {
      return 1;
    }
    

    D.h. wenn das einen Sleep in meinem Prozess verursacht, dann könnte das wirklich so sein wie du sagst.
    Ich denke ich werde mal times() anstatt clock() probieren.



  • so sieht's aus. system() forked einen anderen prozess (eben dein anderes programm) und legt den prozess in dem du system() aufrufst solange schlafen bis dieser neue prozess beendet ist. deswegen denkt clock() das nüx passiert ist. in diesem fall hilft also times() auf jeden fall :xmas1:



  • Danke für den Hinweis, ich wäre schon fast verzweifelt.


Anmelden zum Antworten