Mierzenie wydajności aplikacji przez analizowanie użycia procesora CPU (C#, Visual Basic, C++, F#)
Dotyczy:Visual Studio
Visual Studio dla komputerów Mac
Visual Studio Code
Znajdowanie problemów z wydajnością podczas debugowania za pomocą narzędzia diagnostycznego użycie procesora CPU zintegrowanego z debugerem. Możesz również analizować użycie procesora CPU bez dołączonego debugera lub kierowania uruchomionej aplikacji. Aby uzyskać więcej informacji, zobacz Uruchamianie narzędzi profilowania z debugerem lub bez tego debugera.
Po wstrzymaniu debugera narzędzie Użycie procesora CPU w oknie Narzędzia diagnostyczne zbiera informacje o funkcjach wykonywanych w aplikacji. Narzędzie wyświetla listę funkcji, które wykonywały pracę, i udostępnia wykres osi czasu, którego można użyć do skoncentrowania się na określonych segmentach sesji próbkowania.
Ważne
Zintegrowane z debugerem narzędzia diagnostyczne są obsługiwane w przypadku programowania na platformie .NET w programie Visual Studio, w tym ASP.NET, ASP.NET Core i programowania natywnego/C++. Wymagane jest odpowiednie obciążenie programu Visual Studio. Windows 8 i nowsze są wymagane do uruchamiania narzędzi profilowania za pomocą debugera (okno Narzędzia diagnostyczne).
W tym samouczku wykonasz następujące czynności:
- Zbieranie danych użycia procesora CPU
- Analizowanie danych użycia procesora CPU
Jeśli użycie procesora CPU nie zapewnia potrzebnych danych, inne narzędzia profilowania w profilerze wydajności udostępniają różne rodzaje informacji, które mogą być przydatne. W wielu przypadkach wąskie gardło wydajności aplikacji może być spowodowane przez coś innego niż procesor CPU, takich jak pamięć, renderowanie interfejsu użytkownika lub czas żądania sieciowego.
Krok 1. Zbieranie danych użycia procesora CPU
Otwórz projekt, który chcesz debugować w programie Visual Studio, i ustaw punkt przerwania w aplikacji w punkcie, w którym chcesz zbadać użycie procesora CPU.
Ustaw drugi punkt przerwania na końcu funkcji lub regionu kodu, który chcesz przeanalizować.
Ustawiając dwa punkty przerwania, można ograniczyć zbieranie danych do części kodu, które chcesz przeanalizować.
Zostanie wyświetlone okno Narzędzia diagnostyczne automatycznie, chyba że zostało wyłączone. Aby ponownie wyświetlić okno, kliknij pozycję Debuguj>narzędzia diagnostyczne Pokaż systemWindows>.
Możesz wybrać, czy chcesz wyświetlić użycie procesora CPU, użycie pamięci, czy oba te opcje, przy użyciu ustawienia Wybierz narzędzia na pasku narzędzi. Jeśli używasz Visual Studio Enterprise, możesz również włączyć lub wyłączyć funkcjęIntelliTrace w obszarze Narzędzia>Opcje> IntelliTrace.
Przyjrzyjmy się głównie wykorzystaniu procesora CPU, dlatego upewnij się, że jest włączone użycie procesora CPU (jest ono domyślnie włączone).
Kliknij pozycję Debuguj>rozpocznij debugowanie (lub Uruchom na pasku narzędzi lub F5).
Po zakończeniu ładowania aplikacji zostanie wyświetlony widok Podsumowanie narzędzi diagnostycznych. Jeśli musisz otworzyć okno, kliknij pozycję Debuguj>narzędzia diagnostyczne Pokaż systemWindows>.
Aby uzyskać więcej informacji na temat zdarzeń, zobacz Wyszukiwanie i filtrowanie kartę Zdarzenia w oknie Narzędzia diagnostyczne.
Uruchom scenariusz, który spowoduje trafienie pierwszego punktu przerwania.
Podczas wstrzymania debugera włącz zbieranie danych użycia procesora CPU, a następnie otwórz kartę Użycie procesora CPU .
Po wybraniu pozycji Zarejestruj profil procesora CPU program Visual Studio rozpocznie rejestrowanie funkcji i ile czasu zajmuje ich wykonanie. Zebrane dane można wyświetlić tylko wtedy, gdy aplikacja zostanie zatrzymana w punkcie przerwania.
Naciśnij klawisz F5, aby uruchomić aplikację w drugim punkcie przerwania.
Teraz masz teraz dane wydajności dla aplikacji przeznaczone specjalnie dla regionu kodu, który działa między dwoma punktami przerwania.
Profiler rozpoczyna przygotowywanie danych wątku. Poczekaj na zakończenie.
Narzędzie Użycie procesora CPU wyświetla raport na karcie Użycie procesora CPU .
Jeśli chcesz wybrać bardziej szczegółowy region kodu do analizy, wybierz region na osi czasu procesora CPU (musi to być region pokazujący dane profilowania).
W tym momencie możesz rozpocząć analizowanie danych. Jeśli masz problemy ze zbieraniem lub wyświetlaniem danych, zobacz Rozwiązywanie problemów z błędami profilowania i rozwiązywanie problemów.
Porada
Podczas próby zidentyfikowania problemów z wydajnością wykonaj wiele pomiarów. Wydajność naturalnie różni się od uruchamiania do uruchomienia, a ścieżki kodu zwykle są wykonywane wolniej przy pierwszym uruchomieniu z powodu jednorazowej pracy inicjowania, takiej jak ładowanie bibliotek DLL, metody kompilowania JIT i inicjowanie pamięci podręcznych. Wykonując wiele pomiarów, lepiej zrozumiesz zakres i medianę wyświetlanej metryki, co pozwala porównać pierwszy raz z wydajnością stałego stanu obszaru kodu.
Krok 2. Analizowanie danych użycia procesora CPU
Zalecamy rozpoczęcie analizowania danych przez zbadanie listy funkcji w obszarze Użycie procesora CPU, zidentyfikowanie funkcji, które wykonują najwięcej pracy, a następnie przyjrzenie się bliżej każdej z nich.
Na liście funkcji sprawdź funkcje, które wykonują najwięcej pracy.
Porada
Funkcje są wymienione w kolejności, począwszy od tych, które wykonują największą pracę (nie są w kolejności wywołań). Pomaga to szybko zidentyfikować najdłużej działające funkcje.
Na liście funkcji kliknij dwukrotnie jedną z funkcji aplikacji, która wykonuje wiele pracy.
Po dwukrotnym kliknięciu funkcji w okienku po lewej stronie zostanie otwarty widok usługi Functions . Wybierz widok wywołujący/wywoływany z menu rozwijanego.
W tym widoku wybrana funkcja jest wyświetlana w nagłówku i w polu Bieżąca funkcja (DoWork, w tym przykładzie). Funkcja, która nazywana bieżącą funkcją jest wyświetlana po lewej stronie w obszarze Wywoływanie funkcji, a wszystkie funkcje wywoływane przez bieżącą funkcję są wyświetlane w polu Wywoływane funkcje po prawej stronie. (Możesz wybrać jedno z pól, aby zmienić bieżącą funkcję).
Ten widok przedstawia łączny czas (ms) i procent całkowitego czasu działania aplikacji, jaki zajęło wykonanie funkcji. Treść funkcji pokazuje również łączną ilość czasu (i procent czasu) spędzonego w treści funkcji z wyłączeniem czasu spędzonego w wywoływaniu i wywoływaniu funkcji.
Po dwukrotnym kliknięciu funkcji w okienku po lewej stronie zostanie otwarty widok wywołujący/wywoływany .
W tym widoku wybrana funkcja jest wyświetlana w nagłówku i w polu Bieżąca funkcja (GetNumber, w tym przykładzie). Funkcja, która nazywana bieżącą funkcją jest wyświetlana po lewej stronie w obszarze Wywoływanie funkcji, a wszystkie funkcje wywoływane przez bieżącą funkcję są wyświetlane w polu Wywoływane funkcje po prawej stronie. (Możesz wybrać jedno z pól, aby zmienić bieżącą funkcję).
Ten widok przedstawia łączny czas (ms) i procent całkowitego czasu działania aplikacji, jaki zajęło wykonanie funkcji. Treść funkcji pokazuje również łączną ilość czasu (i procent czasu) spędzonego w treści funkcji z wyłączeniem czasu spędzonego w wywoływaniu i wywoływaniu funkcji. (W tym przykładzie wydano 2367 z 2389 ms w treści funkcji, a pozostałe 22 ms zostały wydane w kodzie zewnętrznym wywołanym przez tę funkcję).
Porada
Wysokie wartości w treści funkcji mogą wskazywać wąskie gardło wydajności w obrębie samej funkcji.
Aby wyświetlić widok wyższego poziomu przedstawiający kolejność wywoływania funkcji, wybierz pozycję Drzewo wywołań z listy rozwijanej w górnej części okienka.
Każdy ponumerowany obszar na rysunku odnosi się do kroku procedury.
Obraz Opis Węzeł najwyższego poziomu w drzewach wywołań użycia procesora CPU jest pseudowęźle W większości aplikacji, gdy opcja Pokaż kod zewnętrzny jest wyłączona, węzeł drugiego poziomu jest węzłem [Kod zewnętrzny], który zawiera kod systemu i struktury, który uruchamia i zatrzymuje aplikację, rysuje interfejs użytkownika, kontroluje planowanie wątków i udostępnia inne usługi niskiego poziomu do aplikacji. Elementy podrzędne węzła drugiego poziomu to metody kodu użytkownika i procedury asynchroniczne, które są wywoływane lub tworzone przez kod systemu drugiego poziomu i struktury. Węzły podrzędne metody zawierają dane tylko dla wywołań metody nadrzędnej. Gdy opcja Pokaż kod zewnętrzny jest wyłączona, metody aplikacji mogą również zawierać węzeł [Kod zewnętrzny]. Poniżej przedstawiono więcej informacji na temat wartości kolumn:
Łączna liczba procesorów wskazuje, ile pracy zostało wykonane przez funkcję i jakiekolwiek funkcje wywoływane przez nią. Wysokie łączne wartości procesora CPU wskazują funkcje, które są najdroższe ogólnie.
Samodzielne użycie procesora CPU wskazuje, ile pracy wykonano przez kod w treści funkcji, z wyłączeniem pracy wykonywanej przez funkcje, które zostały przez nią wywołane. Wysokie wartości własnego procesora CPU mogą wskazywać wąskie gardło wydajności w samej funkcji.
Moduły Nazwa modułu zawierającego funkcję lub liczbę modułów zawierających funkcje w węźle [Kod zewnętrzny].
Aby wyświetlić wywołania funkcji, które używają najwyższego procentu procesora CPU w widoku drzewa wywołań, kliknij pozycję Rozwiń ścieżkę gorącą.
Uwaga
Jeśli kod jest widoczny w drzewie wywołań oznaczonym jako "uszkodzony" kod lub "nieubiegalny stos", oznacza to, że śledzenie zdarzeń systemu Windows (ETW) prawdopodobnie zostało porzucone. Spróbuj zebrać ten sam ślad po raz drugi, aby rozwiązać problem.
Wyświetlanie kodu zewnętrznego
Kod zewnętrzny to funkcje składników systemu i struktury, które są wykonywane przez pisany kod. Kod zewnętrzny zawiera funkcje, które uruchamiają i zatrzymują aplikację, rysują interfejs użytkownika, kontrolują wątki i udostępniają inne usługi niskiego poziomu aplikacji. W większości przypadków nie interesuje Cię kod zewnętrzny, dlatego narzędzie Użycie procesora CPU zbiera funkcje zewnętrzne metody użytkownika w jednym węźle [Kod zewnętrzny].
Jeśli chcesz wyświetlić ścieżki wywołania kodu zewnętrznego, wybierz pozycję Pokaż kod zewnętrzny z listy Widok filtru , a następnie wybierz pozycję Zastosuj.
Należy pamiętać, że wiele łańcuchów wywołań kodu zewnętrznego jest głęboko zagnieżdżonych, dzięki czemu szerokość kolumny Nazwa funkcji może przekraczać szerokość wyświetlania wszystkich, ale największych monitorów komputerów. W takim przypadku nazwy funkcji są wyświetlane jako [...].
Użyj pola wyszukiwania, aby znaleźć węzeł, którego szukasz, a następnie użyj poziomego paska przewijania, aby przenieść dane do widoku.
Porada
Jeśli profilujesz kod zewnętrzny, który wywołuje funkcje systemu Windows, upewnij się, że masz najbardziej aktualny kod . Pliki pdb . Bez tych plików widoki raportu będą zawierać listę nazw funkcji systemu Windows, które są tajemnicze i trudne do zrozumienia. Aby uzyskać więcej informacji na temat sposobu upewnienia się, że masz potrzebne pliki, zobacz Określanie symboli (pdb) i plików źródłowych w debugerze.
Następne kroki
W tym samouczku przedstawiono sposób zbierania i analizowania danych użycia procesora CPU podczas debugowania. Możesz dowiedzieć się więcej na temat profilowania kompilacji wersji przy użyciu profilera wydajności.