Seltsames timing Verhalten mit clock()



  • Hallo,

    Ich habe ein Problem bei einer For schleife in der ein Prozessabschnitt gemessen werden soll

    Pseudocoide is ca so

    for(i=0;i<N,i++){
    struct timeval t_start,t_stop;
    gettimeofday (&t_start);
    unsigned int start = clock();

    MeanFilter(3,data,data_ref, Width, Height);
    --> ZU MESSENDE PROZEDUR

    unsigned int stop = clock();
    gettimeofday(&t_stop);

    }

    die differnez gibt sowohl bei clock() als auch by gettimeofday schön abwechselnd 10ms, und 0 ms

    Offenbar wird der counter langsamer weitergezählt als die prozedur benötigt

    Wie kann ich das umgehen?

    Lg
    Maz



  • clock schaltet traditionell 19.2-mal pro sekunde hoch. nu isses aber so, daß die armen user mit takten zu je 1000/19.2= 52ms nicht alle zurechtkommen. außerdem will man auch lecker betriebssysteme unterstützen, die ein feineres clock können. also hat man es so gemacht, daß clock in jedem takt 52 dazuzählt und dann zeigt sie halt in millisekunden an. aber sie zählt halt nicht in einerschritten hoch. sie geht nicht millisekundengenau.
    die 52 hat man fallenlassen, aber trotzdem hat man auch heute noch praktisch nie einerschritte.



  • Danke, das ist zwar sehr informativ, aber inwiefern hilft mir das bei meinem problem?
    Das erklärt mir nicht warums einmal 0 und einmal 10 ist



  • Natürlich erklärt es das.
    Anscheinend ist die Auflösung von clock() auf deinem System 10ms. D.h. zwei Zeiten die du dir holst können nur 0, 10, 20, 30 ... ms auseinander sein, aber niemals 1, 2, 3 ... ms.

    Wenn du nun versuchst etwas zu messen, was < 10 ms dauert, dann wirst du mal 0 mal 10ms rausbekommen. Je nachdem ob dazwischen ein "Clock-Tick" aufgetreten ist.

    Lösen kannst du das z.B. indem du versuchst die Dauer des zu messenden Vorgangs so gross zu machen, dass die Auflösung der Clock wieder reicht. z.B. wenn du die Funktion einfach so lange wiederholst, dass es insgesamt vielleicht eine Sekunde dauert. In deinem Fall sollte das einfach sein: nimm die Zeiterfassung aus der Schleife raus, und ermittle nur die Zeit die die ganze Schleife braucht.

    Dabei solltest du allerdings sicherstellen, dass der Compiler die Funktion nicht wegoptimiert. Aber das ist wieder ein anderes Thema. Und ... dass der Compiler die Funktion wegoptimiert, kann natürlich auch passieren, wenn du keine Schleife hast, und die Funktion nur 1x aufrufst.

    Oder, andere Möglichkeit: eine Clock mit höherer Auflösung verwenden. Auf Windows Systemen gibt es z.B. QueryPerformanceCounter.



  • Danke herzlichst, ich werds mir gleich mnal reinziehen!! 🙂

    lg
    M


Anmelden zum Antworten