Welches war der zuverlässigste und schnellste Windows C ++ - Profiler, den Sie verwendet haben?

8

Ich muss eine Echtzeit C ++ App unter Windows profilieren. Die meisten der verfügbaren Profiler sind entweder sehr teuer, totaler Overkill oder beides. Ich brauche keine .NET-Sachen. Da es sich um eine Echtzeit-App handelt, muss der Profiler so schnell wie möglich sein. Es wäre hervorragend, wenn es in irgendeiner Weise mit Visual Studio 2005/2008 integriert wäre, aber das ist nicht notwendig. Wenn diese Beschreibung Sie an einen Profiler erinnert, den Sie verwendet haben, würde ich gerne darüber informiert werden. Ich hoffe, dass ich aus der Verwendung von C ++ - Profilern unter Windows auf die Leute zusteuern kann, um einen zu finden, der die Aufgabe erfüllt. Vielen Dank.

    
Carl 21.02.2010, 23:59
quelle

7 Antworten

3

Wenn ich Echtzeit-Code profilieren muss, denke ich, dass die einzige Lösung etwas von Hand ist. Sie möchten nicht zu viel Abdeckung oder Sie verlangsamen den Code, aber mit einem kleinen Datensatz, müssen Sie sehr konzentriert sein, im Wesentlichen jeden Punkt von Hand auswählen.

Also habe ich vor einigen Jahren eine Header-Datei geschrieben, die einige Makros und einen Mechanismus zum Erfassen von Daten definiert, entweder als Funktionszeit oder als Zeitleiste (zum Zeitpunkt T in Funktion X). Der Code verwendet QueryPerformanceCounter für die Timings und schreibt die Daten in den benannten gemeinsamen Speicher über CreateFileMapping , damit ich die Timing-Daten von einem anderen Prozess live betrachten kann .

Es erfordert eine Neukompilierung, um die Timing-Informationen zu ändern, die ich erfassen möchte, aber der Code ist so günstig, dass er praktisch keinen Einfluss auf den Code hat.

Der gesamte Code ist in der Header-Datei (mit Makro-Wachen, so dass der Code nur einmal enthalten ist). Also ist die Header-Datei selbst mein 'Profiler'. Ich ändere einige Tabellen in der Kopfzeile, dann und markieren Sie den Zielcode, kompilieren Sie neu und starten Sie das Profiling.

    
John Knoeller 22.02.2010, 00:47
quelle
2

Berücksichtigen Sie die Option no-profiler .

Bei Leistungsproblemen ist es allgemein bekannt, dass Messen eine Voraussetzung dafür ist, sie zu finden.
Nicht so. Mehr zu diesem Thema.

Dies ist ein Beispiel für die Optimierung einer App für maximale Leistung.

Wenn Sie sich Sorgen machen müssen, was Overhead ist und wie Sie dies in einer DSP-Echtzeit-App tun können, so würde ich es tun. Lassen Sie es mit realistischen Eingaben laufen und halten Sie es mit der Pause-Taste in seinen Spuren. Erfassen Sie den Aufrufstapel in Editor. Dann starte es erneut und wiederhole es mehrmals. (Werfen Sie alle Stichproben weg, die irrelevant sind, z. B. Warten auf Benutzereingaben oder auf andere Weise im Leerlauf.) Beachten Sie, dass dieser Prozess Nullprofilierungs-Overhead auf das Programm setzt.

Wenn Sie das Problem haben, dass Ihr Code von einem Timer abläuft und nur für einen Bruchteil der Gesamtzeit läuft, dann können Sie a) entscheiden, dass Sie kein Problem haben, oder b) Sie können versuche immer noch, es schneller zu machen. Wenn (b) dann wickeln Sie eine Schleife um Ihren Code, so dass, was auch immer es tut, es 10, 100 oder 1000 Mal wiederholt, so dass es einen genügend großen Bruchteil der Zeit braucht, damit Proben darin landen. Verwenden Sie diese Beispiele, um herauszufinden, was zu beheben ist, um es schneller zu machen. Wenn Sie fertig sind, entfernen Sie die äußere Schleife, und es wird wie ein Bandit laufen.

    
Mike Dunlavey 22.02.2010 13:31
quelle
2

Performance Validator (von Software Verification, dem Unternehmen, für das ich arbeite) scheint zu dem zu gehören, was Sie sind Suche nach:

  • Sampling- und Nicht-Sampling-Modi.
  • C, C ++, Delphi, Windows.
Stephen Kellett 30.03.2010 09:31
quelle
1

Wir erstellen ziemlich viel Profiling und haben Shark (nur OSX), vTune verwendet Glowcode und der alte Favorit der Counter / Clocks. Glowcode

Von diesen Shark ist mit Abstand das beste (und kostenlos!), in dem Maße, wie ich versuche, Code portierbar zu OSX zu halten, damit ich es verwenden kann, um zu profilieren. Leider entspricht es nicht Ihren Anforderungen.

vTune war völlig unspektakulär, es war zu kompliziert, um ein anständiges Profil zu erstellen, ohne ein Experte in all den Profilierungsoptionen zu sein, die Front-End-GUI stürzte häufig oder brach einfach ab und ihr Sampler sampelte nicht den Call-Stack Es macht fast keinen Sinn mehr zu sehen, wie Engpässe in Ihrem Programm entstehen. Es war auch teuer (obwohl wir am Ende eine Lizenz gekauft haben). Zu seinen Gunsten ist es Cross-Plattform, und Sie können eine 30-Tage-Testversion bekommen, um zu sehen, ob es Ihnen gefällt.

Glowcode war anständig, nur IIRC Windows und bietet auch eine kostenlose Testversion. Es ist schon eine Weile her, dass wir es benutzt haben, aber es ist vielleicht kein schlechter Anfang.

Wir verwenden für unseren eingebetteten Code meistens Uhren, die einen einzelnen Prozess mit wenig oder keinem Systemaufwand ausführen - das heißt, wir können genau die Anzahl der Taktzyklen zählen, die Operationen benötigen. Persönlich würde ich "Rolling your own" Profiling-Code (außer bei einer extrem grobe Skala) aus zwei Gründen nicht empfehlen:

  • Es ist schwierig zu erklären, wie Ihr Prozess geplant wird und welche anderen Vorgänge ausgeführt werden.
  • Profiler heben häufig Hotspots hervor, die Sie ohne ihre Intervention niemals als Hotspots betrachtet hätten.
Adam Bowen 22.02.2010 14:57
quelle
1

Ich verwende gelegentlich eine Anwendung namens Very Sleepy: Ссылка

Es ist ein einfaches, anspruchsloses Werkzeug, und ich weiß nicht, wie gut es Ihren Bedürfnissen entspricht. Es ist gut genug für mich gemacht, als ein ziemlich unkomplizierter Sampling-Profiler. Ich entwickle einen .NET Profiler namens SlimTune, der irgendwann native Unterstützung bekommt - aber es ist jetzt nicht da und es könnte einige Monate dauern, bis es verfügbar ist.

    
Promit 22.02.2010 23:50
quelle
0
  

Da es sich um eine Echtzeit-App handelt, muss der Profiler so schnell wie möglich sein.

Ich weiß nicht, was Sie mit Echtzeit meinen (hart, halbhart, weich).

Ich musste einmal die Leistung eines Faxservers verbessern. Das Faxprotokoll ist derart, dass, wenn eines der Enden zu lange verzögert (einige zehn oder Hunderte von Millisekunden, abhängig), die Faxsitzung getrennt wird. Ich konnte daher keinen kommerziellen Profiler verwenden, der mir zur Verfügung stand, weil sie die Ausführung des Servers zu sehr verlangsamten. Stattdessen fügte ich verschiedene Protokollnachrichten (mit Zeitstempeln) hinzu, um den Code zu instrumentieren und so die Engpässe zu finden .

    
ChrisW 22.02.2010 14:45
quelle
0

Ich habe AMD CodeAnalyst sehr gut genutzt, aber natürlich muss es auf einem AMD-Prozessor laufen. Es ist mehr ein Fall von "sagt Ihnen mehr als Sie wissen wollen", wenn Sie tief genug graben. Ссылка

    
Arthur Kalliokoski 22.02.2010 15:05
quelle