Zeitmessung



  • Hi,

    folgendes sollte doch eigentlich die verstrichene Zeit messen:

    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main()
    {
      cout << "Zeitmessung" << endl;
    
      double start_time_M2, time_dif_M2;
      start_time_M2 = (double) clock();
      start_time_M2 = start_time_M2 / CLOCKS_PER_SEC;
    
      cout << "bitte ein Zeichen eingeben und bestätigen" << endl;
      char t;
      cin >> t;
    
      time_dif_M2 = ( ((double) clock()) / CLOCKS_PER_SEC ) - start_time_M2;
      cout << "Verstrichene Zeit Methode 2: " << time_dif_M2 << " sec" << endl;
    }
    

    Es wird aber immer '0 sec' ausgegeben.

    Hmmm...

    Habt ihr ne Idee???



  • Hi,

    die Function 'clock' gibt Dir glaube ich die Zeit, die das Programm den
    Processor belegt hat zurück und nicht die ablsolute Laufzeit.

    Wenn du sowas suchst guck Dir mal 'gettimeofday' an.

    Gruss,

    Frodus



  • Frodus schrieb:

    die Function 'clock' gibt Dir glaube ich die Zeit, die das Programm den
    Processor belegt hat zurück und nicht die ablsolute Laufzeit.

    clock() gibt den momentanen wert eines frei laufenden timers wieder. deshalb auch das 'laufzeit = clock_jetzt - clock_vorher' in dem code.

    btw: der code sieht eigentlich ok aus. vielleicht liegt's an den doubles? probier's mal mit 'clock_t' statt 'double'



  • The clock() function returns the processor time since the program started, or -1 if that information is unavailable. To convert the return value to seconds, divide it by CLOCKS_PER_SEC. (Note: if your compiler is POSIX compliant, then CLOCKS_PER_SEC is always defined as 1000000.)

    versuch's mal mit time(0):

    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main()
    {
        cout << "Zeitmessung" << endl;
    
        double start_time_M2, time_dif_M2;
        start_time_M2 = time(0);
    
        cout << "bitte ein Zeichen eingeben und bestätigen" << endl;
        char t;
        cin >> t;
    
        time_dif_M2 = time(0) - start_time_M2;
        cout << "Verstrichene Zeit Methode 2: " << time_dif_M2 << " sec" << endl;
    }
    

    mfg.



  • joomoo schrieb:

    The clock() function returns the processor time since the program started, or -1 if that information is unavailable.

    du wolltest wohl '...or -1 if that information is unavailable' fett schreiben?



  • net schrieb:

    joomoo schrieb:

    The clock() function returns the processor time since the program started, or -1 if that information is unavailable.

    du wolltest wohl '...or -1 if that information is unavailable' fett schreiben?

    Ne, eigentlich nicht. Wieso denn auch?

    mfg.



  • joomoo schrieb:

    net schrieb:

    joomoo schrieb:

    The clock() function returns the processor time since the program started, or -1 if that information is unavailable.

    du wolltest wohl '...or -1 if that information is unavailable' fett schreiben?

    Ne, eigentlich nicht. Wieso denn auch?

    das würde erklären warum sein proggi immer 0 ausspuckt...



  • net schrieb:

    joomoo schrieb:

    net schrieb:

    joomoo schrieb:

    The clock() function returns the processor time since the program started, or -1 if that information is unavailable.

    du wolltest wohl '...or -1 if that information is unavailable' fett schreiben?

    Ne, eigentlich nicht. Wieso denn auch?

    das würde erklären warum sein proggi immer 0 ausspuckt...

    Das mit der Prozessorzeit auch: Beim Warten auf eine Eingabe macht die CPU was anderes.

    mfg.



  • joomoo schrieb:

    Das mit der Prozessorzeit auch: Beim Warten auf eine Eingabe macht die CPU was anderes.

    das ist doch wumpe. die zeit läuft trotzdem weiter.



  • net schrieb:

    joomoo schrieb:

    Das mit der Prozessorzeit auch: Beim Warten auf eine Eingabe macht die CPU was anderes.

    das ist doch wumpe. die zeit läuft trotzdem weiter.

    Aber clock() gibt nur die Zeit zurück die der CPU mit dem Programm verbringt (oder wie man das nennen mag).

    mfg.



  • joomoo schrieb:

    Aber clock() gibt nur die Zeit zurück die der CPU mit dem Programm verbringt (oder wie man das nennen mag).

    ja, aber clock() startet bei 0 und während das programm auf user-input wartet läuft die zeit trotzdem weiter. hab das programm des threadstarters eben bei mir ausprobiert: es funzt.



  • Also, auf meinem System (Debian Sarge, g++ 3.3.5) funktioniert das Programm, d.h., wenn ich gleich etwas eingebe, kommt etwa 1 raus, wenn ich ein bisschen warte, etwas Hoeheres.



  • net schrieb:

    joomoo schrieb:

    Aber clock() gibt nur die Zeit zurück die der CPU mit dem Programm verbringt (oder wie man das nennen mag).

    ja, aber clock() startet bei 0 und während das programm auf user-input wartet läuft die zeit trotzdem weiter. hab das programm des threadstarters eben bei mir ausprobiert: es funzt.

    Nein, tut es offenbar beim OP nicht. joomoo erklärt den Effekt schon richtig. clock zählt die vom Programm verbrauchte Prozessorzeit (bzw. lt. Norm deren beste Approximation), die auf einem multithread-fähigen System nichts mit der vergangen Zeit zu tun haben braucht (außer, daß sie kleiner ist). Für die Zuteilung der einzelnen Programme ist ein Scheduler verantwortlich. Der sagt im wesentlichen: "oh, das Programm von net wartet immer noch auf Usereingabe, dann kann ich in der Zeit ja weiter E-Mails abrufen und dann noch kurz die Videos weiterrandern und dann guck ich nochmal vorbei".

    Man kann mit clock nur sinnvoll Laufzeiten messen, wenn dazwischen wirklich was passiert, nicht, wenn dazwischen das Programm technisch gesehen gar nicht 'läuft', wie zB bei Usereingaben.

    Unter Unix kann mit time(1) auch die unterschiedlichen Zustandzeiten im Programm vermessen:

    de~ $ cat t.c
    #include <stdio.h>
    #include <time.h>
    int main() { clock_t t = clock(); int dummy; scanf("%d", &dummy); printf("%g", (double)(clock()-t)/CLOCKS_PER_SEC); }
    de~ $ gcc t.c -o t
    de~ $ time ./t
    42
    0
    real    0m5.176s
    user    0m0.001s
    sys     0m0.002s
    


  • Daniel E. schrieb:

    net schrieb:

    joomoo schrieb:

    Aber clock() gibt nur die Zeit zurück die der CPU mit dem Programm verbringt (oder wie man das nennen mag).

    ja, aber clock() startet bei 0 und während das programm auf user-input wartet läuft die zeit trotzdem weiter. hab das programm des threadstarters eben bei mir ausprobiert: es funzt.

    Nein, tut es offenbar beim OP nicht...

    das würde ja bedeuten, dass clock() sich systemabhängig verhält. igitt, und das ist eine standard library funktion. ich glaub ich werd' zum c-hasser...



  • Ok, vielen Dank für die Hinweise.


Log in to reply