gettimeofday() sehr ungenau



  • hi,

    ich wollte die Zeit messen, die ein "Unterprogramm" braucht, bis es beendet ist( es ist eine Klasse, also Konstruktor + interne Klassenmethoden).

    //code..
    timeval start, end;
    gettimeofday(&start, 0); 
    //code + Konstruktoraufruf
    gettimeofday(&end, 0);
    std::cout << end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 + start.tv_usec << endl; //wird ausgegeben + interpretiert (siehe unten)
    
    std::cout << static_cast<double> (end.tv_sec * 1000000 + end.tv_usec- start.tv_sec * 1000000 + start.tv_usec) / 1000000 << endl;
    //code..
    

    Doch leider ist die ausgegebene Zahl (ein long int) sehr ungenau. Sie schwankt bei den Ausführungen des Programms zwischen 10'000 und 2'000'000 (Das sind 0.01 bis 2.0 Sekunden!!). Es werden in der Klasse selber zwar nur arithmetische Funktionen ausgeführt, es ist aber grösstenteils eine rekursive Funktion. Da könnte man sagen, da sind die vielen Funktonsaufrufe schuld aber das Programm wird sofort ausgeführt und abgeschlossen (ich beobachte es auf der Konsole), d. h. es braucht sicher weniger als eine halbe Sekunde um sich auszuführen. Wo ist das Problem? Gibt es genaue Alternativen? (Habe ich das mit dem static_cast<double>() richtig gemacht?)

    schon mal Danke im Voraus.



  • Wenn du Sekunden willst ist es einfacher es so zu schreiben:

    std::cout << (end.tv_sec - start.tv_sec + 1e-6*(end.tv_usec - start.tv_usec));
    

    1. gettimeofday hat eine begrenzte Auflösung. Die sollte ungefähr bei Millisekunden liegen.

    2. Es können immer andere Programme während der Ausführung deines Programms gescheduled werden. Lass dein Programm mit time laufen. Die Realtime, die von time reported wird, darf nicht kleiner sein als die Zeit deiner gettimeofday-Aufrufe.

    3. Du musst start.tv_usec abziehen nicht addieren.



  • Dein dritter Punkt hat die Lösung gebracht. Da hat mir die Müdigkeit wohl einen Streich gespielt. Vielen Dank.


Anmelden zum Antworten