2012-06-29 65 views
8

Podczas korzystania z profilera w Visual Studio do wyśledzenia drogich funkcji, widziałem czasami, że większość pracy kończy się w [clr.dll] . To w zasadzie sprowadza się do czarnej skrzynki i zastanawiam się, czy istnieje sposób na wyśledzenie, dlaczego spędza się tam tak dużo czasu.Profiler programu Visual Studio, jak wyśledzić użycie [clr.dll]

Zakładam, że clr.dll obsługuje takie rzeczy jak kompilacja JIT, ładowanie złożeń i zarządzanie aplikacjami domowymi, zbieranie śmieci, odbicie itp. Jednak naprawdę trudno jest powiedzieć, jaki kod powoduje to spędzanie tak dużo czasu.

Oczywiście jest to inny kod, poza samym runtime, który powoduje, że spędza on tyle czasu w clr.dll, więc jak wyśledzić, który kod jest winny?

Odpowiedz

1

Musisz wiedzieć, która część kodu - kod, który możesz edytować i skompilować, który jest jedynym kodem, który możesz naprawić - która część tego kodu odpowiada za znaczny procent wykorzystanego czasu.

Nie jest dobrze wiedzieć, że clr.dll używa dużo czasu, chyba że można stwierdzić, która część kodu jest za to odpowiedzialna.

Ta informacja znajduje się w stosie wywołań.

Jeśli masz metodę, a nawet pojedynczą linię kodu, która jest na stosie przez jakiś procent czasu, na przykład 20%, to odpowiada za mniej więcej ten procent czasu. Jeśli zdołasz jakoś wyeliminować ten wiersz kodu (lub sprawisz, że zajmie dużo mniej czasu), że 20% całkowitego czasu stanie się zero lub prawie tak, co daje współczynnik przyspieszenia 1,0/0,8 = 1,25 lub 25 %

Jak znaleźć takie linie? This is the method I use. Nikt nie twierdzi, że jest ładny, chyba że wszystkie wyniki zostaną docenione. Jeśli jest stosowany wielokrotnie, large speedup factors are possible.

+0

Dla wszystkiego, co jest zarządzanym kodem, robi naprawdę dobrą robotę śledzenia całego stosu wywołań, to właśnie kiedy dostaje się do kodu natywnego, traci informacje o tym, które funkcje były odpowiedzialne. Tak więc pauza to sprawdzić ręcznie stos wywołań wydaje się, że powinien dać więcej przydatnych wyników. –

+0

@Bryce: 1) Tak, ale zakładam, że twój kod to kod zarządzany (chyba że nie jest), a jeśli jest coś, co możesz naprawić, to jest to * twój kod *. 2) Profiler zbiera informacje o stosie, ale problemem jest to, że zamiast pokazywać, co mówią stosy, podsumowują one drzewa wywołań i inne. To traci potrzebne informacje: pełne zrozumienie, co dokładnie dzieje się w konkretnych próbkach, a nie w zbiorach. –

1

Na podstawie mojego doświadczenia prawdopodobnie znajduje się w GC. Jeśli używasz LINQ, prawie na pewno w GC. Polecam CLRProfiler, aby wykryć spam o wartości 0.

+0

Powinny być najlepszą odpowiedzią, jak dotąd. W oryginalnym pytaniu wyraźnie już patrzy na linie kodu i stos kodów profilera. – Celess

Powiązane problemy