Mal wieder ein versuchter Zugriff auf Euer Know-How: ich wurde gefragt ob es ein Tool gibt mit dem ich den CPU-Verbrauch eines Programmes messen kann. Also nicht beobachtend wie top
oder als Momentaufnahme (das geht glaube ich irgendwie mit ps
), sondern mehr so wie mit time
: ich starte mein Programm mit $toolname $programmname
, und nach Abschluss erhalte ich eine Angabe darüber wie viel CPU-Last das Programm tatsächlich erzeugt hat.
Die Laufzeit mit time
zu messen ist zwar ein Ansatz, allerdings ist die Ausgabe wohl stark davon abhängig was sonst auf meiner Maschine los ist.
Nach einer kleineren Google-Orgie bin ich um folgendes schlauer, vielleicht ist das sachdienlich: der Kernel misst CPU-Zeit in sogenannten Jiffies. Ein Jiffy ist auf einem System immer gleich lang (typischerweise 1/100 oder 1/250 Sekunde) und stellt praktisch eine Zeitscheibe dar die der Kernel auf einen Prozess verwendet. Man kann im /proc-Dateisystem nachsehen wie viele Jiffies ein Prozess bis dato verbraucht hat. Allerdings nur so lange der Prozess auch noch läuft.
Was ich suche ist also praktisch ein Tool das mir nach Beendigung meines Programms sagt wie viele Jiffies es gebraucht hat. Oder so. Gibt es das irgendwo fertig? Oder suche ich eigentlich was völlig anderes?
Also eigentlich sollte ‚time‘ genau das machen – es gibt ja unter anderem die ’systime‘ aus, die die tatsächlich verbrauchte CPU-Zeit wiederspiegelt.
Merkwuerdig. Jetzt gerade habe ich das nochmal gezielt getestet, und es sieht tatsaechlich so aus als ob das schon die Loesung ist. Ich koennte schwoeren dass ich das schon mal getestet hatte, und dass ich da auf komische Ergebnisse gekommen bin…
Wie auch immer: Danke fuer den Hinweis!
Ach, und ich denke dass ich fuer meine Fragestellung die User- und die Systemtime addieren muss. Ich will ja wirklich die komplette Laufzeit haben.
Usertime entspricht IIRC „walltime“, also dass was man als Benutzer wahrnimmt. Ich müsste da jetzt aber auch nochmal in der man-Page nachschauen.
Nee, nicht ganz. Ich versuche es mal mit
time ping -c 4 google.de
In meiner zsh steht unter den Pings folgende Zeile:
ping -c 4 google.de 0,00s user 0,00s system 0% cpu 3,130 total
Die bash schreibt:
real 0m3.191s
user 0m0.003s
sys 0m0.003s
Nach meinem Verstaendnis (Halbwissen voraus!) ist ’sys‘ die Zeit die im Kernel verbracht wird (System Mode), ‚user‘ die im eigentlichen Programm (User Mode), und ‚total‘ bzw. ‚real‘ die tatsaechliche Zeit die von Start bis Ende des Programms vergangen ist.
Der Ping verbraucht kaum Rechenzeit, also kommen kaum user- und sys-Zeiten zusammen. Zwischen den vier Pings verbringt er jeweils eine Sekunde mit Warten, es kommt also eine ‚echte‘ Zeit von etwas ueber drei Sekunden zustande.
Das was ich gesucht habe waere dann wohl die Summe aus user- und sys-Zeit. Darauf habe ich als Programmierer einen Einfluss. Bestenfalls…