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