2011-01-06 12 views
1

Manchmal kann Code Gerätetreiber verwenden, bis das System nicht mehr reagiert.Messgerätetreiber CPU/IO-Auslastung durch mein Programm

In letzter Zeit habe ich einen WIN32/VC++ - Code optimiert, der das System fast nicht mehr anspricht. Die CPU-Auslastung war jedoch sehr niedrig. Der Grund waren 1000er Schöpfungen und Zerstörungen von GDI-Objekten (Stifte, Pinsel, etc.). Sobald ich den Code umstrukturierte, um alle Objekte nur einmal zu erstellen, reagierte das System wieder.

Das führt mich zu der Frage: Gibt es eine Möglichkeit, die CPU/IO-Nutzung von Gerätetreibern (GPU/Festplatte/etc) für ein bestimmtes Programm/eine bestimmte Funktion/Codezeile zu messen?

+0

Wenn Sie die Wirkung Ihres Programms als Ganzes sehen möchten, öffnen Sie den Prozess-Explorer und sehen Sie sich Threads im Systemprozess und unter csrss.exe an. Nicht sicher, ob es möglich ist, das mit der Linie/Methode usw. zu korrelieren. –

+0

Werfen Sie einen Blick auf [diese Methode] (http://stackoverflow.com/questions/375913/what-cani-i-use-to-profile-c-code-in-linux/378024#378024). Seine Messungen sind sehr grob, aber es sagt Ihnen genau, bis zu der Codezeile, was die Zeit braucht und ob es I/O oder CPU ist. –

Antwort

3

Sie können verschiedene Tools von SysInternals Utilities (jetzt ein Microsoft-Produkt, siehe http://technet.microsoft.com/en-us/sysinternals/bb545027) verwenden, um eine grundlegende Idee vor dem Einspringen zu geben. In Ihrem Fall führt der Prozess Explorer (procexp) und Prozessmonitor (procmon) einen ordentlichen Job aus. Sie können verwendet werden, um eine grundlegende Vorstellung davon zu bekommen, um welche Art von Langsamkeit es sich handelt, bevor Sie einen Drilldown durchführen.

Dann können Sie Xperf http://msdn.microsoft.com/en-us/performance/default Drill-Down verwenden. Bei korrekter Einrichtung kann dieses Tool Sie zu der exakten Funktion bringen, die Langsamkeit verursacht, ohne Profiling-Code in Ihr bestehendes Programm einzufügen. Es gibt bereits ein PDC-Video, das darüber spricht, wie man es benutzt http://www.microsoftpdc.com/2009/CL16 und ich empfehle dieses Tool. Nach meinen eigenen Erfahrungen ist es immer besser, zuerst procexp/procmon zu verwenden und dann mit xperf auf Ihre Verdächtigen zu zielen, da xperf eine überwältigende Menge an Informationen generieren kann, wenn sie nicht auf intelligente Weise gefiltert wird.

In bestimmten schweren Fällen, in denen Sperren Konflikte, Debugging Tools für Windows (windbg) wird sehr praktisch sein, und es gibt spezielle Bücher über seine Verwendung sprechen. Diese Bücher sprechen in der Regel über Hang Detection und es gibt einige Techniken, die hier verwendet werden können, um Langsamkeit zu erkennen. (z. B.! runaway)

2

Vielleicht könnten Sie ETW dafür verwenden? Es ist nicht so sicher, dass es Ihnen helfen wird zu sehen, welche Zeile was verursacht, aber es sollte Ihnen ein gutes Gesamtbild davon geben, wie es Ihrer App geht.

0

Um die CPU/Speicher/Festplatten-Nutzung des Programms in Echtzeit zu finden, können Sie die Ressourcen-Monitor und Task-Manager-Programme, die mit Windows kommen. Sie können die Zeit, die ein Codeblock relativ zu den anderen Codeblöcken benötigt, ermitteln, indem Sie die sydeme-Datei ausdrucken. Denken Sie daran, nicht zu viel Überwachung auf einmal zu tun, weil das Ihre Berechnungen abwerfen kann.

Wenn Sie wissen, wie viel CPU-Zeit das Programm benötigt und wie viel Prozent der Zeit der Codeblock beansprucht, können Sie ungefähr schätzen, wie viel CPU-Zeit ein Codeblock benötigt.