2012-06-29 5 views
8

Aufspüren Wenn Sie den Profiler in Visual Studio verwenden, um teure Funktionen aufzuspüren, habe ich gelegentlich gesehen, dass die meisten der Arbeit in [clr.dll] endet . Das ist im Grunde eine Black Box, und ich frage mich, ob es einen Weg gibt, herauszufinden, warum es dort so viel Zeit verbringt.Visual Studio Profiler, wie [Clr.dll] Verwendung

Ich gehe davon aus, dass clr.dll Dinge wie JIT kompilieren, Laden von Assemblys und Verwalten von Appdomains, Garbage Collection, Reflektion usw. behandelt. Aber es macht es wirklich schwierig zu sagen, welcher Code verursacht es so viel Zeit zu verbringen.

Offensichtlich ist es ein anderer Code neben der Laufzeit selbst, die verursacht, dass es so viel Zeit in clr.dll verbringen, also wie finden Sie, was Code falsch ist?

Antwort

1

Sie müssen wissen, welcher Teil Ihres Codes - der Code, den Sie bearbeiten und kompilieren können, ist der einzige Code, den Sie beheben können - welcher Teil des Codes für einen erheblichen Prozentsatz der Zeit verantwortlich ist.

Es ist nicht gut zu wissen, dass clr.dll eine Menge Zeit verwendet, es sei denn, Sie können feststellen, welcher Teil Ihres Codes dafür verantwortlich ist.

Diese Information befindet sich im Aufruf-Stack.

Wenn Sie eine Methode oder sogar eine einzelne Codezeile haben, die sich für einige Prozent der Zeit im Stapel befindet, z. B. 20%, ist sie für ungefähr diesen Prozentsatz der Zeit verantwortlich. Wenn Sie diese Codezeile irgendwie eliminieren könnten (oder es viel weniger Zeit benötigen), würden 20% der Gesamtzeit Null oder fast werden, was einen Beschleunigungsfaktor von 1,0/0,8 = 1,25 oder 25 ergibt %

Also wie finden Sie solche Linien? This is the method I use. Niemand behauptet, es ist schön, es sei denn, die Gesamtergebnisse werden geschätzt. Wenn es wiederholt angewendet wird, large speedup factors are possible.

+0

Für alles, was verwaltet wird, ist es eine wirklich gute Aufgabe, den gesamten Call-Stack zu verfolgen, es ist nur, wenn es in nativen Code kommt, dass es den Überblick verliert, welche Funktionen verantwortlich waren. Also pausiert es den Call-Stack manuell zu prüfen scheint, als sollte es nützlichere Ergebnisse geben. –

+0

@Bryce: 1) Ja, aber ich nehme an, Ihr Code ist verwalteter Code (es sei denn, es ist nicht), und wenn Sie etwas reparieren können, ist es in * Ihrem Code *. 2) Der Profiler sammelt Stack-Informationen, aber das Problem ist, dass, anstatt Sie sehen zu lassen, was die Stack-Samples sagen, sie in Call-Trees & whatnot zusammenfassen. Das verliert die Information, die Sie brauchen: das volle Verständnis dessen, was genau in bestimmten Proben passiert, nicht in aggregierter Form. –

1

Basierend auf meiner Erfahrung ist es wahrscheinlich in der GC. Wenn Sie LINQ verwenden, ist es fast sicher im GC. Ich empfehle CLRProfiler, um Gen-0-Spam aufzuspüren.

+0

Sollte die beste Antwort sein, so weit. In der Ausgangsfrage sieht er klarerweise schon Profiler Code Zeilen und Stack. – Celess

Verwandte Themen