clock_gettime schwankt



  • Hallo Zusammen,

    Wenn ich mit clock_gettime, in einer Schleife rein die ticks ausgebe,
    beobachte ich ein komisches Verhalten:

    277353414       0
    277358998       1
    /* klasse! steigt bei jedem Schleifendurchgang */
    954764214       3376
    954767136       3377
    4620820         3378 /* wieso ist es ploetzlich gesunken? 
    4626538         3379   wenn resettet wurde, wieso dann nicht auf ~0? */
    /*.. */
    /* steigt wieder */ 
    5027881         3504
    5030820         3505
    64319850        3506  /* steigt sehr steil */
    64326134        3507
    

    Der Code, der die Ausgabe macht:

    /* .. */
    clock_gettime(CLOCK_REALTIME, &start) ;
        while( (received = recvfrom(sockfd, buffer, BIN_BUF_LEN-1 , 0, (struct sockaddr *) &client, &sin_size )) > -1){
    
           /* tue etwas */ 
            clock_gettime(CLOCK_REALTIME, &finish) ;
            /* wegen der gesunkenen finish ticks, kriegt man negative werte */
            /* proc_list[counter].cumulitive_time = finish.tv_nsec - start.tv_nsec ; */ 
            proc_list[counter].cumulitive_time = finish.tv_nsec ;
    
        counter++ ;
        }
    

    Das Problem ist, dass der Processor-Ticks nicht stetig steigt sondern einfach
    schwankt (aus einem Grund den ich nicht weiss). Deswegen wenn ich einen
    Differenz aus ( finish - start ) bilden moechte, kriege ich einen negativen Wert
    was definitiv fuer die Zeitmessung nicht nutzbar ist.

    Meine Frage ist, warum sinkt der Wert von Processor-Ticks ueberhaupt?
    (Zeile 6 in "Code" Section!) Wie kann man damit umgehen? Gibt es einen besseren
    Weg zur Zeitmessung unter *x?

    Gruss,

    ps: Ich habe erst mit clock() ausprobiert aber die Aufloesung war sehr sehr
    schlecht (um 10000).



  • Für Zeitmessungen CLOCK_MONOTONIC statt CLOCK_REALTIME nehmen.



  • tonic schrieb:

    Für Zeitmessungen CLOCK_MONOTONIC statt CLOCK_REALTIME nehmen.

    ok, habe gemacht. Das problem bleibt dasselbe. Ich habe das Gefuehl dass
    die member variable tv_nsec von struct timespec zum Ueberlaufen(Overflow) gebracht
    wird. Dadurch passiert eine Art von "Reset".

    Was ist der Datentyp von tv_nsec, unsigned long oder? Kann man die tv_nsec in eine
    "unsigned long long" variable uebergeben? Wie kann ich das machen? wenn ich etwa
    dies mache:

    fprintf(timer_handle,"%llu \t %ld\n", finish->tv_nsec, idno) ;
    

    bekomme ich wiederum andere Werte als vorherige unsigned long Werte..

    Gruss,



  • struct timespec {
        time_t   tv_sec;        /* seconds */
        long     tv_nsec;       /* nanoseconds */
    };
    

    sonst einfach mal man: clock_gettime


Anmelden zum Antworten