2016-07-29 17 views
0

Ich verwende Visual Studio, um meine Multi-Thread-C++ - Anwendung zu profilieren. Von dem, was ich über Sampling-Methode gelesen habe, verstehe ich, dass es Prozessor in bestimmten Intervallen untersucht, um zu sehen, welche Funktion ausgeführt wird.Profiling Multithread-Code, wie funktioniert die Stichprobenverarbeitung

Ich bin gespannt, wie es Multi-Thread-Code behandelt. Es ist durchaus möglich, dass zwei oder mehr Funktionen gleichzeitig auf verschiedenen Threads auf verschiedenen Kernen ausgeführt werden. In diesem Fall wird der Zählvorgang für beide Funktionen inkrementiert? Ich glaube, dass das tatsächlich passiert.

Dies macht es tatsächlich schwierig, Erkenntnisse aus dem Profiling-Bericht abzuleiten. Die Funktion, die die meisten gesammelten Stichproben enthält, wird bei Ausführung auf einem Worker-Thread möglicherweise auf einem anderen Kern (als Hauptthread) ausgeführt und beeinträchtigt möglicherweise die Anwendungsleistung überhaupt nicht. Wenn es jedoch den Hauptthread ausschaltet, um seine Arbeit zu verrichten, sollte es einen beobachtbaren Einfluss auf die Leistung haben.

Gibt es eine bessere Möglichkeit, Multithread-Code zu profilieren?

+1

Ja. Wenn sich Threads nicht auf die Leistung Ihrer App auswirken, tun Sie es falsch, und Sie wären besser dran, sie überhaupt nicht zu verwenden. Modulo die Notwendigkeit für asynchronicity zu verhindern, dass UI einfriert, aber das ist kein Nebenläufigkeit. Um herauszufinden, warum ein Multithreaded-Programm Muckeln saugt, ist ein anderes Tool erforderlich, [ein Parallelitätsanalysator] (https://msdn.microsoft.com/en-us/library/dd537632.aspx?f=255&MSPPError=-2147217396). . –

Antwort

1

Wenn Sampling-Funktionen ausgeführt werden, tasten Profiler typischerweise jeden Software-Thread einzeln ab. Wenn Sie also drei Threads haben, die CPU-intensive Funktionen foo(), bar() und baz() ausführen und die Abtastfrequenz 100Hz beträgt und die Dauer der Profiling-Sitzung 1s beträgt, erhalten Sie jeweils 100 Abtastwerte der Funktionen.

Ein anständiger Profiler gibt Ihnen auch eine Möglichkeit, die Daten nach einem bestimmten Thread zu filtern, so dass Sie sehen können, welche Hotspots isoliert in welchem ​​Thread vorhanden sind. Was beispielsweise im Hauptthread passiert, ist möglicherweise sehr wichtig, wenn der Hauptthread das UI-Rendering mit dem von Ihnen verwendeten Framework ist.

herauszufinden, wie Berechnungen in Hintergrund Threads die Reaktionsfähigkeit der Anwendung beeinflussen, ist ein breites Thema für sich und ist oft anwendungsspezifisch. Einige Muster:

  • Suchen Sie nach, wo der Hauptfaden blockiert wird. Es blockiert möglicherweise das Warten auf das Ergebnis der Hintergrundberechnung.
  • Suchen Sie, ob der Haupt-Thread irgendwelche Punkte hatte, wo er etwas tun musste, weil er die Daten nicht ohne weiteres zur Verfügung hatte. Dies ist insbesondere bei der UI/Rendering-Verarbeitung üblich - wenn die Daten zu dem Zeitpunkt, zu dem ein Frame gerendert werden muss, nicht bereit sind, hat der Code nichts besseres zu tun, als den Frame zu rendern, der in der Benutzeroberfläche Benutzer sichtbare Jank verursacht.

Hoffe das hilft.

0

Gibt es eine bessere Möglichkeit, Multithread-Code zu profilieren?

Ich muss immer fragen, weil diese nicht gleich:
Suchen Sie 1), was wanduhr Zeit nimmt, und das korrigiert werden, um die Anwendung zu beschleunigen, oder 2) Messungen von verschiedenen Arten wie Funktionsaufruf zählt, CPU-Eigenzeit, CPU inklusive Zeit, Hot-Pfad, etc.?

Angenommen, die Antwort ist 1, die Methode, die viele Leute und ich verwenden, ist einfach pause the application, mehrmals wenn nötig, unter der Visual Studio IDE. Wenn Sie das tun, pausiert es alle Threads. Sie können den Aufruf-Stack für jeden Thread anzeigen. Dies zeigt Ihnen, worauf es wartet und warum. Einer oder mehrere der Threads werden während eines Bruchteils der Pausen entweder von einer Berechnung oder einem Systemwartevorgang oder einer E/A-Operation betroffen, die Sie für vermeidbar halten.

Sie könnte es ein „Profiler armen Person“ nennen, aber hier ist, wie es über Profiler-Ausgang geht:

  • Sie haben nicht zu kümmern, ob das Problem bei der Berechnung oder I/O, oder rate mal, was es ist und wähle verschiedene Profilierungsmethoden. Wie auch immer, Sie sehen es.

  • Wenn Sie wissen möchten, wie viel Zeit in einer Funktion/Methode insgesamt in Anspruch genommen wird, ist es grob gesagt der Bruch der Samples, in dem sich die Funktion auf dem Stapel befindet. Das Gleiche gilt für jede Codezeile. Wenn Sie den exklusiven (Eigen-) Bruch kennen wollen, dann ist es, wenn die Funktion oder die Codezeile bei Ende des Stapels ist.

  • Wenn Sie wissen wollen, was Bruchteil der Zeit mit der Funktion A Aufruf Funktion B ausgegeben wird, ist es der Anteil der Proben, bei denen A ruft B. Wenn Sie in einem rufenden B über einen Vermittler interessiert sind, Sie können das auch sehen (was kein Call Graph Ihnen sagen kann).

  • Angenommen, der Stapel ist 30 Ebenen tief, endet in einigen I/O, und Sie möchten wissen, welcher Teil Ihres Codes dies verursacht, scannen Sie einfach den Stapel und schauen Sie sich jede Codezeile an du findest es. Beachten Sie, dass dies wahrscheinlich nicht der "heiße Pfad" ist, da es mehrere Möglichkeiten gibt, zum Problemcode zu gelangen.

  • Wenn Sie dies tun, können Sie nicht nur die zuständige (n) Codezeile (n) sehen, sondern auch die Werte der relevanten Datenvariablen. Profiler können Ihnen diese nicht zeigen; du musst raten.

  • Es verschwendet keine Zeit, indem es Ihnen sagt, viele Dinge sind nicht Probleme, weil sie kleine Prozente nehmen. (Manchmal denken Leute, dass sie nur nach kleinen Dingen wie 5% oder weniger suchen, während sie die rosige Annahme machen, dass es nichts Größeres gibt. Ein Profiler kann einen dazu bringen, diese Annahme zu machen .)

  • Sie können sich auf den Code konzentrieren, über den Sie etwas tun können, Ihren Code, im Gegensatz zu Systemcode.

  • Sie müssen nicht durch Timelines jagen, um das interessierende Intervall zu finden. Sie unterbrechen es, wenn es Sie warten lässt; Es ist schwer, es zu jeder anderen Zeit zu unterbrechen. So wird es Ihnen sagen, warum es Sie warten lässt.