Eine Hacker-Geschichte
Das Datum ist der 12.02.10. Die Tage vor Weihnachten sind vorbei und ich habe als Windows-Programmierer so ziemlich eine große Straßensperre getroffen. Ich habe AQTime verwendet, ich habe versucht, schläfrig, glänzend und sehr schläfrig zu sein, und während wir sprechen, wird VTune installiert. Ich habe versucht, den VS2008-Profiler zu verwenden, und er war sowohl positiv als auch oft unempfindlich. Ich habe die Technik der zufälligen Pause verwendet. Ich habe Rufbäume untersucht. Ich habe Funktionsspuren abgefeuert. Aber die traurige, schmerzhafte Tatsache ist, dass die App, mit der ich arbeite, mehr als eine Million Codezeilen umfasst, wahrscheinlich auch Apps von Drittanbietern im Wert von einer weiteren Million Zeilen.
Ich brauche bessere Werkzeuge. Ich habe die anderen Themen gelesen. Ich habe jeden in jedem Thema aufgeführten Profiler ausprobiert. Es muss einfach etwas Besseres geben als diese unkonventionellen und teuren Optionen oder lächerliche Mengen an Arbeit, die fast keinen Gewinn bringen. Um die Sache noch weiter zu verkomplizieren, ist unser Code stark mit Threads versehen und führt eine Reihe von Qt-Ereignisschleifen aus, von denen einige so zerbrechlich sind, dass sie aufgrund von Zeitverzögerungen unter starker Instrumentierung abstürzen. Fragen Sie mich nicht, warum wir mehrere Ereignisschleifen ausführen. Niemand kann es mir sagen.
Gibt es in einer Windows-Umgebung weitere Optionen nach dem Vorbild von Valgrind?
Gibt es etwas Besseres als den langen Schwad kaputter Werkzeuge, die ich bereits ausprobiert habe?
Gibt es etwas, das für die Integration in Qt entwickelt wurde, möglicherweise mit einer nützlichen Anzeige von Ereignissen in der Warteschlange?
Eine vollständige Liste der Tools, die ich ausprobiert habe, mit denen, die in Kursivschrift wirklich nützlich waren:
- AQTime: Ziemlich gut! Hat einige Probleme mit der tiefen Rekursion, aber das Anrufdiagramm ist in diesen Fällen korrekt und kann verwendet werden, um eventuelle Verwirrungen zu beseitigen. Kein perfektes Werkzeug, aber einen Versuch wert. Es könnte Ihren Bedürfnissen entsprechen, und es war sicherlich die meiste Zeit gut genug für mich.
- Random Pause-Angriff im Debug-Modus: Nicht genügend Informationen zur Zeit.
Ein gutes Werkzeug, aber keine vollständige Lösung. - Parallel Studios: Die nukleare Option. Aufdringlich, seltsam und verrückt mächtig. Ich denke, Sie sollten die 30-Tage-Bewertung treffen und herausfinden, ob sie gut passt. Es ist auch verdammt cool.
- AMD Codeanalyst: Wunderbar, einfach zu bedienen, sehr absturzanfällig , aber ich denke, das ist eine Umgebungssache. Ich würde empfehlen, es zu versuchen, da es kostenlos ist.
- Luke Stackwalker: Funktioniert gut bei kleinen Projekten, es ist ein bisschen versucht, es bei uns zum Laufen zu bringen. Einige gute Ergebnisse, und es ersetzt definitiv Sleepy für meine persönlichen Aufgaben.
- PurifyPlus: Keine Unterstützung für Win-x64-Umgebungen, vor allem Windows 7. Ansonsten ausgezeichnet. Einige meiner Kollegen in anderen Abteilungen schwören darauf.
- VS2008 Profiler: Erzeugt eine Ausgabe im Bereich von über 100 Gigs im Funktionsablaufverfolgungsmodus mit der erforderlichen Auflösung. Positiv zu vermerken ist, dass solide Ergebnisse erzielt werden.
- GProf: Erfordert, dass GCC auch nur mäßig effektiv ist.
- VTune: Die W7-Unterstützung von VTune grenzt an Kriminelle. Ansonsten hervorragend
- PIN: Ich müsste mein eigenes Tool hacken, das ist also ein letzter Ausweg.
- Sleepy \ VerySleepy: Nützlich für kleinere Apps, aber hier scheitert ich.
- EasyProfiler: Nicht schlecht, wenn Ihnen ein bisschen manuell eingefügter Code nichts ausmacht, um anzugeben, wo das Instrument eingesetzt werden soll.
- Valgrind: * nur nix, aber sehr gut, wenn Sie in dieser Umgebung sind.
- OProfile: Nur Linux.
- Proffy: Sie schießen wilde Pferde.
Vorgeschlagene Tools, die ich nicht ausprobiert habe:
- XPerf:
- Glowcode:
- Devpartner:
Anmerkungen: Intel-Umgebung im Moment. VS2008, Boost-Bibliotheken. Qt 4+. Und der elende Hummel von allen: Qt / MFC-Integration über Trolltech.
Jetzt: Fast zwei Wochen später scheint mein Problem behoben zu sein. Dank einer Vielzahl von Tools, darunter fast alles auf der Liste und einige meiner persönlichen Tricks, haben wir die primären Engpässe gefunden. Ich werde jedoch weiterhin neue Profiler und neue Technologien testen, erforschen und ausprobieren. Warum? Weil ich es euch schulde, weil ihr rockt. Es verlangsamt zwar die Zeitachse ein wenig, aber ich bin immer noch sehr aufgeregt, immer wieder neue Tools auszuprobieren.
Synopsis
Neben vielen anderen Problemen wurde kürzlich eine Reihe von Komponenten auf das falsche Threading-Modell umgestellt, was zu schwerwiegenden Problemen führte, da der Code unter uns plötzlich nicht mehr multithreaded war. Ich kann nicht mehr sagen, weil es gegen meine NDA verstößt, aber ich kann Ihnen sagen, dass dies niemals durch gelegentliche Inspektion oder sogar durch normale Codeüberprüfung gefunden worden wäre. Ohne Profiler, Callgraphs und zufällige Pausen in Verbindung würden wir immer noch unsere Wut auf den wunderschönen blauen Bogen des Himmels schreien. Zum Glück arbeite ich mit einigen der besten Hacker zusammen, die ich je getroffen habe, und ich habe Zugang zu einem erstaunlichen Vers voller großartiger Werkzeuge und großartiger Leute.
Meine Herren, ich weiß das sehr zu schätzen und bedauere nur, dass ich nicht genug Repräsentanten habe, um jeden von Ihnen mit einem Kopfgeld zu belohnen. Ich denke immer noch, dass dies eine wichtige Frage ist, um eine bessere Antwort zu erhalten als die, die wir bisher auf SO haben.
Infolgedessen werde ich in den nächsten drei Wochen jede Woche das größte Kopfgeld aufbringen, das ich mir leisten kann, und es der Antwort mit dem nettesten Werkzeug zuweisen, von dem ich denke, dass es nicht allgemein bekannt ist. Nach drei Wochen haben wir hoffentlich ein endgültiges Profil der Profiler erstellt, wenn Sie meine List verzeihen.
Take-away
Verwenden Sie einen Profiler. Sie sind gut genug für Ritchie, Kernighan, Bentley und Knuth. Es ist mir egal, wer du denkst, dass du bist. Verwenden Sie einen Profiler. Wenn der, den Sie haben, nicht funktioniert, suchen Sie einen anderen. Wenn Sie keinen finden können, codieren Sie einen. Wenn Sie keinen codieren können oder es sich um ein kleines Auflegen handelt oder Sie einfach nicht weiterkommen, verwenden Sie eine zufällige Pause. Wenn alles andere fehlschlägt, stellen Sie einige Studenten ein, um einen Profiler herauszuholen.
Eine längere Sicht
Also dachte ich, es wäre vielleicht schön, eine Retrospektive zu schreiben. Ich habe mich für eine intensive Zusammenarbeit mit Parallel Studios entschieden, auch weil es tatsächlich auf dem PIN-Tool basiert. Nachdem ich mit einigen der beteiligten Forscher akademische Beziehungen hatte, war ich der Meinung, dass dies wahrscheinlich ein Qualitätsmerkmal war. Zum Glück hatte ich recht. Obwohl die GUI ein bisschen schrecklich ist, fand ich IPS unglaublich nützlich, obwohl ich es nicht jedem empfehlen kann. Kritisch gesehen gibt es keinen offensichtlichen Weg, um Trefferzahlen auf Zeilenebene zu erhalten, was AQT und eine Reihe anderer Profiler bieten, und ich habe es unter anderem als sehr nützlich empfunden, die Rate der Zweigauswahl zu untersuchen. Im Internet hat es mir auch Spaß gemacht, AQTime zu verwenden, und ich habe festgestellt, dass ihre Unterstützung sehr reaktionsschnell ist. Auch hier muss ich meine Empfehlung qualifizieren: Viele ihrer Funktionen funktionieren nicht so gut, und einige von ihnen sind unter Win7x64 geradezu absturzgefährdet. XPerf zeigte ebenfalls eine bewundernswerte Leistung, ist jedoch für die Abtastdetails, die erforderlich sind, um bei bestimmten Arten von Anwendungen gute Lesevorgänge zu erzielen, äußerst langsam.
Im Moment muss ich sagen, dass ich nicht glaube, dass es eine endgültige Option für die Profilerstellung von C ++ - Code in einer W7x64-Umgebung gibt, aber es gibt sicherlich Optionen, die einfach keinen nützlichen Dienst ausführen.