CPU-Zeit von EXE-Programm exakt unter Windows messen?



  • Hallo!

    ich möchte exakt die CPU-Zeit d.h. soundsoviel Zyklen eines EXE-Programms unter Windows 7 messen. Wie kann ich das machen? Die Funktion clock() gibt nur die Anzahl der elapsed milliseconds ab Programmbeginn zurück. Auf dem Host besagt clock() Anzahl der Zyklen d.h. CPU-Zeit. Wie verhält sich das unter Windows oder Unix?

    Danke schon einmal & Gruß
    kjesse



  • Unmoeglich.



  • also auf den takt genau messen, den dein programm bekommen hat geht nich wäre ja verschwenderisch das mitzuloggen, weil das müsste das OS übernehmen. Aber ich weiß nich wies unter windows aussieht aber die rechenzeit, die du bekommen hast kannst unter linux durchaus messen, denn top kann das ja auch.

    Google einfach mal etwas rum aufjedenfall ist es das falsche forum weil sowas lässt sich nich mit standard C lösen.



  • knivil schrieb:

    Unmoeglich.

    Der Windows Scheduler verwendet diese Information afaik seit Vista. Die Frage ist, ob man da irgendwie drankommt...

    EDIT: http://msdn.microsoft.com/en-us/library/ms684929.aspx 🙂





  • rdtsc wird auf einem präemptiven Multitasking System, wie Windows eines ist, niemals korrekte Ergebnisse liefern. Vor allem auf einem Rechner mit mehreren Cores/CPUs ist rdtsc eingentlich komplett unbrauchbar sofern du nicht sicherstellen kannst, dass dein Thread immer auf dem selben physikalischen Core ausgeführt wird. Und auch dann misst du immer noch die Ticks von allen anderen Threads, die zwischendrin drankommen, mit.



  • Ja das ist alles richtig. Die Probleme damit sind klar.

    Aber in einer kontrollierten Umgebung klappt es ganz gut. Natürlich muss man dazu die Voraussetzungen sicherstellen.



  • lupo1977 schrieb:

    Aber in einer kontrollierten Umgebung klappt es ganz gut. Natürlich muss man dazu die Voraussetzungen sicherstellen.

    Was unter Windows unmöglich ist. Aber das macht auch nix, denn die Lösung hab ich ja oben schon gepostet...



  • Sorry:

    Habe nochmal die Ausgangsfrage genau gelesen. Um die Rechenzeit eine ganzen Exe zu messen ist das tatsächlich ungeeignet. Für kleine Routinen sollte es aber ok sein.



  • Naja, ich würde sagen: Unter Umständen könnte es für kleine Routinen akzeptabel sein. Für Profiling verwendet man am besten einen Profiler 😉



  • Unter Linux habe ich gesehen, gibt es den Befehl "time". Der zeigt zwar CPU-Zeit und Elapsed Time an, aber komischerweise sind die bei mir beide gleich groß. Das dürfte doch eigentlich nicht sein. Wenn man FIO rausrechnet, müsste ein viel kleinerer Wert für die CPU-Zeit gemessen werden. Vielleicht benutzt Linux auch nur irgendein Derivat von time_t und das ist Elapsed Time.



  • Du wolltest doch die CPU Zyklen unter Windows haben? Dafür hab ich doch schon eine Lösung gepostet!?



  • Es gibt das Built-in time der Bash und das time aus /usr/bin/time oder so. Welches meinst du?



  • Ja, ich weiß. Funktioniert diese Funktion auch unter ANSI-C. Ich benutze gcc-4.6.1. Linux habe ich nur mal als Vergleich genommen und da wird CPU-Zeit und Elapsed-Zeit angegeben, die vom Wert her bei mir beide identisch sind.


  • Mod

    kjesse schrieb:

    Ja, ich weiß. Funktioniert diese Funktion auch unter ANSI-C. Ich benutze gcc-4.6.1. Linux habe ich nur mal als Vergleich genommen und da wird CPU-Zeit und Elapsed-Zeit angegeben, die vom Wert her bei mir beide identisch sind.

    Ich verstehe nicht, was dich daran so stört. Wenn dein Programm dein System zu 100% auslastet, dann kommst du fast beliebig nahe an identische Zeiten für beide Werte. Ein paar Mikrosekunden IO gehen dann in der Rundung verloren.



  • Ich lasse einen sehr schnellen, selbst geschriebenen Kompressor/Dekompressor für große Dateien (Millionen Bytes) laufen und beim Schreiben müsste doch ein messbarer IO-Effekt da sein. Bei Windows/Linux sind die beiden Zeiten gleich, unter dem IBM Mainframe sehe ich einen Unterschied.


  • Mod

    Dann gibt's 2 Möglichkeiten:
    1. Deine Erwartungen sind falsch.
    2. Du benutzt das Kommando falsch.
    Die dritte Möglichkeit, dass der Befehl an sich fehlerhaft arbeitet darf wohl erst einmal ausgeschlossen werden, bis die ersten beiden Punkte nicht ganz sicher geklärt sind. Da wir das alles nicht von hier aus beurteilen können, geht der Fall erst einmal wieder an dich.



  • Ja, ich weiß. Funktioniert diese Funktion auch unter ANSI-C.

    /usr/bin/time ist ein Programm. Mit den noetigen Parametern sagt es dir aaaaalllllles, IO, CPU, Cache, .... .



  • Ich benutze in meinem C-Programm /usr/bin/time. Ich habe gelesen clock() würde die CPU-Zeit und eine andere Funktion die elapsed time wiedergeben. Der Befehl time -p command unter Linuxprompt ergibt das gleiche Ergebnis wie mein C-Programm und zeigt auch CPU-Zeit und Elapsed Time an. Falls clock() richtig arbeitet, würde das heißen, dass mein Programm kaum auf I/O wartet d.h. CPU-Zeit und Elapsed Time sind ähnlich. Mein Rechner hat einen Core i7-760 falls das hilft.



  • Sorry. Ich meinte i7-860 (4 Kerne / 8 "virtuelle" Kerne durch STM)


Anmelden zum Antworten