Prozessorzeit ermitteln
-
Ich möchte bei meinem Programm gerne die Prozessorzeit, die es verbraucht hat ermitteln. Da mein Programm mit mehreren Threads arbeitet würde ich das gerne mit jedem Thread einzeln machen können.
Ich denke mal das ist betriebssystemabhängig. Meine Anwendung wird unter Linux entwickelt und läuft unter Linux. Außerdem verwende ich schon boost, gibt es da vielleicht schon was eingebaut?Ich rufe mit den Threads Funktionen auf. Bisher nehme ich einen timestamp am Anfang der Funktion und am Ende der Funktion und messe die Mikrosekunden, welche während dem Abarbeiten der Funktion vergangen sind. Das Problem ist halt, dass der Thread nicht während der ganzen Zeit Prozessorzeit vom Scheduler bekommt sondern unterbrochen wird.
Gibt es vielleicht eine Möglichkeit das mitzubekommen wann der Scheduler Prozessorzeit zuweist und wann er sie abzieht?
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Klar geht das. Mit settimer und gettimer aus der sys/time.h kann man, neben der Echtzeit, auch die Laufzeit eines Prozesses sehr genau messen. Ich weiß aber nicht genua wie sich dies im Zusammenhang mit Threads verhält, du dürftest wohl nur die Gesamtzeit aller Threads erhalten.
-
Also ich hab da nun diese Funktion gefunden: http://rabbit.eng.miami.edu/info/functions/time.html#getrusage
Aber der letzte Satz irritiert mich:
Note: Although the format used is capable of measuring time to an accuracy of a microsecond, do not expect that much precision from any real system.
-
Du hast zwar beschrieben, wie du bisher die Zeit misst, aber es sagt mir nicht, welche Zeitinformationen du genau haben moechtest.
/usr/bin/time gibt Zeit im Usermodus und Prozessorauslastung zurueck. Die kann man dann entsprechend gegenrechnen.
Aber der letzte Satz irritiert mich
Die Zeit wird nicht so genau gemessen, wie sie angegeben werden kann.
-
Ich habe nun ein Testprogramm erstellt, welches zwei Threads erstellt. Beide berechnen und schlafen teilweise, ich summiere die Lautzeit und die Prozessorzeit und gebe sie am Ende aus. Während das Programm läuft messe ich die Zeiten mit 'time'. Der Vergleich ist niederschmetternd: Ich kann die einzelnen Threads nicht messen
g++ -lboost_thread threadprozessorzeit.cpp
fabske@neptun:~$ time ./a.out Laufzeit1: 5637000 Prozessorzeit1: 4.14026 Laufzeit2: 5636128 Prozessorzeit2: 4.14026 real 0m5.643s user 0m4.144s sys 0m0.000s
-
/usr/bin/time sollte einige Optionen haben, dir detailierte Werte anzuzeigen, aber ob fuer einzelne Threads, weiss ich nicht. Den Befehl time, den du verwendet hast, ist ein build-in der Shell und nur so aehnlich wie das Original.
-
knivil schrieb:
/usr/bin/time sollte einige Optionen haben, dir detailierte Werte anzuzeigen, aber ob fuer einzelne Threads, weiss ich nicht. Den Befehl time, den du verwendet hast, ist ein build-in der Shell und nur so aehnlich wie das Original.
also "man time" ergibt keine Hinweise dass das Programm irgendwie mit Threads umgehen könnte..
-
Das was du suchst befindest sich in "sys/resource.h" und nennt sich "getrusage()" in Verbindung mit der Struktur "struct rusage". Diese Struktur beinhaltet einen Vielzahl von Information bis hin zur Speichernutzung und Stacknutzung. Da sind auch sämtliche Zeiten drinne.
Boost kapselt diese Struktur nur und pappt ein paar nette Methoden dran.
-
/usr/bin/time ist verschieden von time. Letzteres ist ein build-in der Shell (was nicht so viel kann) und ersteres ein eigenstaendiges Programm. Auch kannst du mit --help wahrscheinlich die Optionen erfragen.