getitimer()

16/09/2016 - 17:02 von Helmut Schellong | Report spam
Vor langer Zeit hatte ich Zeitmessungen mit clock() durchgeführt.
Die funktioniert nicht unter FreeBSD.

Ich habe dann getrusage() und letztlich setitimer()+getitimer()
verwendet. (Bei getrusage funktioniert ru_stime nicht.)

Die Ergebnisse sind jedoch keineswegs so korrekt, wie die Dokumentation
dies erscheinen làßt.
Das Verhalten solcher Messungen ist 'weich' und nicht deterministisch.

== ca.it_value.tv_sec00, ca.it_value.tv_usec=0;
ca.it_interval.tv_sec=0, ca.it_interval.tv_usec=0;
setitimer(ITIMER_VIRTUAL, &ca, 0);
is=CntA; do ZUWA PROCA KLAMA ; while (--is>0); //dummy-Zeit

getitimer(ITIMER_VIRTUAL, &ca);
is=CntA; do ZUWA PROCA KLAMA ; while (--is>0);
getitimer(ITIMER_VIRTUAL, &cb);
t1 = (double) ((ca.it_value.tv_sec*1000000+ca.it_value.tv_usec)
-(cb.it_value.tv_sec*1000000+cb.it_value.tv_usec));
//...

Grundsàtzlicher Aufbau:

Mathematischer Ansatz: 2t+s -t-s = t

time
loop a, a
time
t2

time
loop a
time
t1

tA = t2-t1 Schleifenzeit s eliminiert!
==
Erstens àndert die dummy-Zeit die Resultate erheblich.
Wenn dann zwei Zeiten tA tB
4.3 ns
5.1 ns
sind, àndert ein Umtauschen der Meßlinge die Resultate nicht zu
5.1 ns
4.3 ns
sondern zu
5.0 ns
5.3 ns
Die Angelegenheit ist also ziemlich 'matschig'.
Ohne dummy-Zeit ist die erste Zeit erheblich geringer, fàlschlicherweise.

Die Meßwerte springen allerdings nicht, wenn die Exe mehrfach hintereinander
aufgerufen wird. Sie sind reproduzierbar. Sie àndern sich auch nicht bei
stark unterschiedlicher Systemlast.

ITIMER_VIRTUAL bewirkt, daß itimer nur dekrementiert wird, wàhrend der Prozeß
die CPU zugeteilt bekommen hat, also nur bei aktivem Prozeß.
Von daher müßten die Resultate nachvollziehbarer sein.
Es ist jedoch so, daß die Zeit, die seit dem Start des Prozesses vergangen
ist, die Einzelmessungen der Reihe nach unterschiedlich beeinflußt.


Mit freundlichen Grüßen
Helmut Schellong var@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
 

Lesen sie die antworten

#1 Michael Bäuerle
16/09/2016 - 17:35 | Warnen spam
Helmut Schellong wrote:

Vor langer Zeit hatte ich Zeitmessungen mit clock() durchgeführt.
Die funktioniert nicht unter FreeBSD.

Ich habe dann getrusage() und letztlich setitimer()+getitimer()
verwendet. (Bei getrusage funktioniert ru_stime nicht.)

Die Ergebnisse sind jedoch keineswegs so korrekt, wie die Dokumentation
dies erscheinen làßt.
[...]



Verstehe ich das richtig: Du möchtest nicht die Ausführungszeit, sondern
die CPU-Zeit messen?

Frage dein System mal, ob es die TMR (Realtime Timer Option) und CPT
(Process CPU-Time Clocks) Extensions unterstützt:
|
| $ getconf _POSIX_TIMERS
| 200809
| $ getconf _POSIX_CPUTIME
| 200809

Falls ja, bringt vielleicht 'clock_gettime()' eine Verbesserung.
Die Auflösung sollte sich mit 'clock_getres()' ermitteln lassen:
<http://pubs.opengroup.org/onlinepub...e.html>

Ähnliche fragen