2010-02-21 8 views
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.Welcher war der zuverlässigste und schnellste Windows C++ - Profiler, den Sie verwendet haben?

+0

Was möchten Sie? Du hast dich noch nicht entschieden. Der Titel besagt, dass Ihre zwei wichtigsten Anliegen Zuverlässigkeit und Geschwindigkeit sind. Diese sind bereits im Widerspruch. Dann fügen Sie in Ihrem zweiten Satz Preis und Einfachheit hinzu. – MSalters

+0

In Bezug auf Zuverlässigkeit, meinte ich eine, die nicht abstürzt, nicht die Genauigkeit der Ergebnisse.Nach meinem Verständnis ist das, wonach ich suche, wirklich ein Sampling-Profiler, da sie am wenigsten invasiv sind. Preis und Einfachheit sind zusätzliche Überlegungen, da beide sich direkt darauf auswirken, ob es sinnvoll ist, den Profiler der Business-Toolbox hinzuzufügen. – Carl

Antwort

3

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

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

Es dauert eine Neukompilierung zu ändern, welche Timing-Informationen ich erfassen möchte, aber der Code ist so günstig, dass es 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.

+0

Einverstanden. Wenn Sie keine Echtzeitanalyse benötigen, dumpen Sie die Ergebnisse von queryperformancecounter in einen Protokollpuffer und geben am Ende des Programms eine CSV-Datei mit Werten in Milli/Mikrosekunden aus. Excel/OpenOffice ist ein überraschend gutes Werkzeug, um Ergebnisse grafisch darzustellen. – Justicle

+0

Interessant. Danke dafür. Es scheint so zu sein, wie ich vorgehen werde, obwohl andere Antworten darauf hinweisen, dass es nicht hilft, Hotspots zu identifizieren. – Carl

2

Berücksichtigen Sie die no-profiler option.

Bei Leistungsproblemen ist es allgemein bekannt, dass Messen eine Voraussetzung dafür ist, diese zu finden.
Nicht so.More on that subject.

This is an example of tuning an app for maximum performance.

Falls Sie besorgt sind über Overhead und wie diese in Echtzeit App in einem DSP zu tun, hier ist, wie ich es tun würde. 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 unbedeutenden Stichproben weg, z. B. warten Sie auf Benutzereingaben oder auf andere Weise im Leerlauf.) Beachten Sie, dass dieser Prozess null Profiling-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 a) können Sie entscheiden, dass Sie kein Problem haben, oder b) Sie kann immer noch versuchen, es schneller gehen zu lassen. 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.

+1

Das ist ein Sampling-Profiler - das OSX-Tool Shark ist ein exzellenter Sampling-Profiler, leider weiß ich nichts, was für Windows nah ist. vTune ist ein Profiler, aber es ist nicht großartig IMO (siehe http://blog.vlad1.com/2008/07/16/why-cant-vtune-be-more-like-shark/) –

+0

@ Adam-Bowen: Es ist dahin kommen. Es sieht so aus, als ob es Stackshots zur Wanduhrzeit aufnimmt. Es ist nicht klar, dass Sie es in Zeiten subjektiver Langsamkeit leicht einschränken können. Es ist nicht klar, ob es * Linien-Level * Prozent der Inklusivzeit gibt. Dann gibt es das Problem, dass selbst die Stackshots nicht ausreichend State Information sein können - nichts ist vergleichbar mit dem Finger in den Code. –

+1

@ Adam-Bowen: Für diejenigen, die wirklich ein Profiling-Tool verwenden möchten, ist dies eine, die ich glaube fast alles richtig macht (obwohl es in Linux ist): http://www.rotateright.com Auch gibt es die nützlichen Unix-Dienstprogramme ** pstack ** und ** lsstack ** - da kann sowas für OSX und Windows sein - ich weiß es nicht. –

0

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

Ich weiß nicht, was Sie in 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 .

+0

Ich meine Profil eine Audio-Streaming-Anwendung mit 1ms Latenz. – Carl

1

Wir machen eine Menge Profiling und haben Shark (nur OSX), vTune, Glowcode und den alten Favoriten der Zähler/Uhren verwendet.

Von denen Shark ist bei weitem die beste (und kostenlos!), In dem Maße, wie ich versuche, Code portable zu OSX zu halten, damit ich es zum Profil verwenden kann. Leider entspricht es nicht Ihren Anforderungen.

vTune war völlig unscheinbar, es war zu kompliziert, um ein anständiges Profil zu bekommen, ohne ein Experte in was die Profiling-Optionen, die Front-End-GUI häufig abgestürzt oder einfach nur pleite und sein Sampler nicht den Aufruf Damit ist es nahezu nutzlos, tatsächlich 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, IIRC Windows nur und bietet auch eine kostenlose Testversion. Es ist eine Weile her, seit wir es benutzt haben, aber es ist vielleicht kein schlechter Startpunkt.

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

  • Es ist schwierig zu erklären, wie Ihr Prozess geplant wird und welche andere Operationen ausgeführt werden.
  • Profiler markieren häufig Hotspots, die Sie ohne ihre Intervention nie als Hotspots betrachtet hätten.
+0

+1 für einen guten Beitrag, aber in Bezug auf eingebetteten Code habe ich diese Kriegsgeschichte: http://StackOverflow.com/Questions/890222/Analyzing-Code-for-Efficiency/893272#893272. Grundsätzlich gibt es eine orthogonale Ansicht, dass Messzeit nur eine Ablenkung von dem Prozess des Findens von Code ist, der optimiert werden muss. –

+0

Ich stimme der Probenahme zu, obwohl ich immer noch lieber einen Profiler verwende, um die harte Arbeit für mich zu erledigen (IE die Sampling/Callstack-Auflösung etc.). Mein Hauptproblem mit vTune ist, dass es nicht genügend Informationen ausprobiert, um herauszufinden, was das Problem ist. Wenn ich Timing verwende, ist es normalerweise, einen Teil des Algorithmus zu identifizieren, der langsam arbeitet (und so ein Kandidat ist, um nach einer besseren Komplexität im Algorithmus zu suchen), anstatt nach Codezeilen zu suchen, die optimiert werden können. –

+0

Danke. Bis heute habe ich nur auf Mac OS X mit Shark profiliert. Ich habe mir die Tools von VTune und AMD angeschaut, aber die Tatsache, dass beide nur mit ihren Prozessoren arbeiten, hielt mich davon ab. Ich habe Glowcode ausprobiert, aber es ist bei der Auswertung 6 Mal abgestürzt, also werde ich es wahrscheinlich nicht aufnehmen. AQTime ist mir am nächsten gekommen, um einen Profiler zu bekommen, der tut, was ich tun muss, aber ich hatte auch ein paar Abstürze damit. – Carl

0

Ich habe AMD CodeAnalyst mit großer Wirkung verwendet, 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. http://developer.amd.com/cpu/codeanalyst/Pages/default.aspx

+0

Codeanalyst läuft gut auf Intel, aber nur Timer-basierte Profilerstellung –

1

ich eine Anwendung gelegentlich sehr schläfrig genannt verwenden: http://www.codersnotes.com/sleepy

Es ist ein einfaches, bescheidenes Werkzeug, und ich weiß nicht, wie gut es Ihre Bedürfnisse 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 jetzt ist es nicht drin und es könnte einige Monate dauern, bis es verfügbar ist.

+0

Ich habe versucht, sehr schläfrig. Es gibt mir nur Fehler darüber, dass es nicht in der Lage ist, den Prozess zu starten, und es hängt auch nicht an dem Prozess an.Ich denke, ich habe kein Glück. – Carl

2

Performance Validator (von Software Verification, die Firma für die ich arbeite) scheint, was Sie suchen, entsprechen:

  • Probenahme und nicht-Sampling-Modi.
  • C, C + +, Delphi, Windows.