Udostępnij za pośrednictwem


Mierzenie wydajności aplikacji przez analizowanie użycia procesora CPU (C#, Visual Basic, C++, F#)

Znajdź problemy z wydajnością podczas debugowania za pomocą narzędzia diagnostycznego Użycie procesora zintegrowanego z debugerem. Możesz również analizować użycie procesora bez dołączonego debugera lub celując w działającą aplikację. Aby uzyskać więcej informacji, zobacz Uruchamianie narzędzi profilujących na wersjach wydań lub debugów oraz Analiza wydajności przy użyciu profilowania CPU.

Gdy debuger zostanie wstrzymany, narzędzie Użycie procesora 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ć, aby skoncentrować się na określonych segmentach sesji próbkowania.

Ważny

Zintegrowane z debugerem narzędzia diagnostyczne są obsługiwane w przypadku programowania dla platformy .NET w programie Visual Studio, w tym ASP.NET, ASP.NET Core i programowania natywnego/C++. Wymagany jest odpowiedni pakiet pracy programu Visual Studio . System Windows 8 lub nowszy jest wymagany do uruchamiania narzędzi profilowania z oknem debugera (Narzędzia Diagnostyczne).

W tym samouczku nauczysz się:

  • Zbieranie danych użycia procesora CPU
  • Analizowanie danych użycia procesora CPU

Krok 1. Zbieranie danych użycia procesora CPU

  1. Otwórz projekt, który chcesz debugować w programie Visual Studio, i ustaw punkt przerwania w aplikacji w miejscu, w którym chcesz zbadać użycie procesora CPU.

  2. 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ć.

  3. Okno narzędzi diagnostycznych pojawi się automatycznie, o ile nie zostało przez Ciebie wyłączone. Aby ponownie wyświetlić okno, kliknij pozycję Debuguj>Windows>Pokaż narzędzia diagnostyczne.

  4. Możesz wybrać wyświetlanie użycia procesora , użycia pamięci lub obu, ustawiając "Wybierz narzędzia" na pasku narzędzi. Jeśli używasz programu Visual Studio Enterprise, możesz również włączyć lub wyłączyć funkcję IntelliTrace w narzędziach Tools>Options>IntelliTrace.

    zrzut ekranu przedstawiający narzędzia diagnostyczne.

    zrzut ekranu przedstawiający narzędzia diagnostyczne.

    Skupimy się głównie na wykorzystaniu CPU, więc upewnij się, że użycie CPU jest włączone (domyślnie jest włączone).

  5. 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>Windows>Pokaż narzędzia diagnostyczne.

    zrzut ekranu przedstawiający kartę Podsumowanie narzędzi diagnostycznych.

    zrzut ekranu przedstawiający kartę Podsumowanie narzędzi diagnostycznych.

    Aby uzyskać więcej informacji na temat zdarzeń, zobacz Wyszukiwanie i filtrowanie kartę Zdarzeń w oknie Narzędzia diagnostyczne.

  6. Uruchom scenariusz, który spowoduje, że pierwszy punkt przerwania zostanie trafiony.

  7. Podczas wstrzymania debugera włącz zbieranie danych użycia CPU, a następnie otwórz kartę użycie CPU.

    Zrzut ekranu przedstawiający narzędzia diagnostyczne umożliwiające profilowanie procesora CPU.

    Zrzut ekranu przedstawiający narzędzia diagnostyczne umożliwiające profilowanie procesora CPU.

    Po wybraniu rejestrowanie profilu działania procesoraprogram Visual Studio rozpocznie rejestrowanie funkcji i czas potrzebny na ich wykonanie. Zebrane dane można wyświetlać tylko wtedy, gdy aplikacja zostanie zatrzymana w punkcie przerwania.

  8. Naciśnij F5, aby uruchomić aplikację do drugiego punktu przerwania.

    Teraz masz teraz dane wydajności 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.

    Zrzut ekranu przedstawiający narzędzia diagnostyczne przygotowujące wątki.

    Zrzut ekranu przedstawiający narzędzia diagnostyczne przygotowujące wątki.

    Narzędzie Użycie procesora wyświetla raport na karcie Użycie procesora.

    zrzut ekranu pokazujący kartę Użycie procesora narzędzi diagnostycznych.

    zrzut ekranu pokazujący kartę Użycie procesora narzędzi diagnostycznych.

  9. Jeśli chcesz wybrać bardziej szczegółowy region kodu do przeanalizowania, wybierz region na osi czasu procesora CPU (musi to być region pokazujący dane profilowania).

    Zrzut ekranu przedstawiający narzędzia diagnostyczne wybierające segment czasu.

    Zrzut ekranu przedstawiający narzędzia diagnostyczne wybierające segment czasu.

    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 naprawianiem usterek.

    Napiwek

    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 po pierwszym uruchomieniu z powodu jednorazowej pracy inicjowania, takiej jak ładowanie bibliotek DLL, kompilowanie metod 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 stałą wydajnością obszaru kodu.

Krok 2. Analizowanie danych użycia procesora CPU

Zalecamy rozpoczęcie analizowania danych przez sprawdzenie listy funkcji w obszarze Użycie procesora CPU, zidentyfikowanie funkcji, które wykonują najwięcej pracy, a następnie przyjrzenie się bliżej każdemu z nich.

  1. Na liście funkcji sprawdź funkcje, które wykonują największą pracę.

    Zrzut ekranu pokazujący listę funkcji użycia CPU w narzędziach diagnostycznych.

    Zrzut ekranu pokazujący listę funkcji użycia CPU w narzędziach diagnostycznych.

    Napiwek

    Funkcje są wymienione w kolejności, zaczynając od tych wykonujących największą pracę (nie są uporządkowane według kolejności wywołań). Ułatwia to szybkie identyfikowanie najdłużej działających funkcji.

  2. Na liście funkcji kliknij dwukrotnie jedną z funkcji aplikacji, która wykonuje wiele pracy.

    Po dwukrotnym kliknięciu funkcji otwiera się widok Functions w lewym panelu. Wybierz widok wywołujący/wywoływany z menu rozwijanego.

    Zrzut ekranu przedstawiający widok wywoływania narzędzi diagnostycznych.

    W tym widoku wybrana funkcja jest wyświetlana w nagłówku i w polu Current Function (DoWork, w tym przykładzie). Funkcja, która wywołała bieżącą funkcję, jest wyświetlana po lewej stronie w sekcji Funkcje wywołujące, a wszystkie funkcje, które są wywoływane przez bieżącą funkcję, są pokazane w sekcji Funkcje wywoływane po prawej stronie. (Możesz wybrać dowolny z pól, aby zmienić bieżącą funkcję).

    Ten widok przedstawia łączny czas (ms) i procent całkowitego czasu działania aplikacji, który upłynął do ukończenia funkcji. Treść funkcji pokazuje również łączny czas (i procent czasu) spędzony w treści funkcji, bez uwzględnienia czasu spędzonego w funkcjach wywołujących i wywołanych.

    Po dwukrotnym kliknięciu funkcji w okienku po lewej stronie zostanie otwarty widok obiektu wywołującego/wywoływanego.

    Zrzut ekranu przedstawiający widok wywoływania narzędzi diagnostycznych.

    W tym widoku wybrana funkcja jest wyświetlana w nagłówku i w polu Current Function (GetNumber, w tym przykładzie). Funkcja, która wywołała bieżącą funkcję, jest wyświetlana po lewej stronie w sekcji Funkcje wywołujące, a wszystkie funkcje, które są wywoływane przez bieżącą funkcję, są pokazane w sekcji Funkcje wywoływane po prawej stronie. (Możesz wybrać dowolny z pól, aby zmienić bieżącą funkcję).

    Ten widok przedstawia łączny czas (ms) i procent całkowitego czasu działania aplikacji, który upłynął do ukończenia funkcji. Treść funkcji pokazuje również łączny czas (i procent czasu) spędzony w treści funkcji, bez uwzględnienia czasu spędzonego w funkcjach wywołujących i wywołanych. (W tym przykładzie spędzono 2367 z 2389 ms w treści funkcji, a pozostałe 22 ms zostały spędzone w kodzie zewnętrznym wywołanym przez tę funkcję).

    Napiwek

    Wysokie wartości w Ciele funkcji mogą wskazywać na wąskie gardło wydajności wewnątrz samej funkcji.

  3. Aby wyświetlić widok wyższego poziomu przedstawiający kolejność wywoływania funkcji, wybierz drzewo wywołań z listy rozwijanej w górnej części okienka.

    Każdy ponumerowany obszar na rysunku odnosi się do kroku procedury.

    Narzędzia diagnostyczne—drzewo wywołań

    Obraz Opis
    Krok 1 Węzeł najwyższego poziomu w drzewie wywołań użycia procesora CPU reprezentujący aplikację.
    Krok 2 W większości aplikacji, gdy opcja Pokaż kod zewnętrzny jest wyłączona, węzeł drugiego poziomu to węzeł [Kod zewnętrzny], który zawiera kod systemu i frameworku, uruchamiający i zatrzymujący aplikację, rysujący interfejs użytkownika, kontrolujący planowanie wątków i udostępniający inne usługi niskiego poziomu dla aplikacji.
    Krok 3 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 i struktury drugiego poziomu.
    Krok 4 Węzły podrzędne metody zawierają dane tylko dla wywołań metody nadrzędnej. Po wyłączeniu Pokaż kod zewnętrzny, metody aplikacji mogą również zawierać węzeł [kod zewnętrzny].

    Oto więcej informacji na temat wartości kolumn:

    • łączna liczba procesora CPU wskazuje, ile pracy wykonano przez funkcję i jakiekolwiek funkcje wywoływane przez nią. Wysokie łączne wartości procesora CPU wskazują funkcje, które są najdroższe ogólnie.

    • "Self 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 samodzielnego procesora CPU mogą wskazywać na wąskie gardło wydajności w samej funkcji.

    • Modules Nazwa modułu zawierającego funkcję lub liczba modułów zawierających funkcje w węźle [Kod zewnętrzny].

    Aby wyświetlić wywołania funkcji, które używają największego procentu mocy CPU w widoku drzewa wywołań, kliknij Rozwiń gorącą ścieżkę. Gorąca ścieżka może pomóc skupić badanie na obszarze, który będzie miał największy wpływ.

    zrzut ekranu przedstawiający gorącą ścieżkę narzędzi diagnostycznych.

    Notatka

    Jeśli kod jest oznakowany w drzewie wywołań jako "przerwany" kod lub "niedostępny stos", oznacza to, że prawdopodobnie pominięto zdarzenia ETW (Event Tracing for Windows). Spróbuj zebrać ten sam ślad po raz drugi, aby rozwiązać problem.

  1. Aby wyświetlić inny widok danych, wybierz pozycję Flame Graph z listy rozwijanej w górnej części okienka.

    Wykres płomieniowy oferuje inne odwzorowanie drzewa wywołań, co może pomóc w analizie danych. Aby uzyskać więcej informacji, zobacz Identyfikowanie ścieżek gorących za pomocą grafu płomienia.

  2. Aby wyświetlić widoki danych zagregowanych według funkcji lub modułu, wybierz pozycję Functions lub moduły z listy rozwijanej w górnej części okienka.

    Te widoki pomagają zidentyfikować funkcje lub moduły, które mogą być wąskimi gardłami wydajności z powodu kombinacji wysokiej liczby wywołań i/lub problemów z wydajnością.

    zrzut ekranu przedstawiający widok funkcji narzędzi diagnostycznych.

Wyświetlanie kodu zewnętrznego

Kod zewnętrzny to funkcje w składnikach systemu i platformy, które są wykonywane przez kod, który piszesz. Kod zewnętrzny zawiera funkcje, które uruchamiają i zatrzymują aplikację, rysują interfejs użytkownika, kontrolują wątki oraz dostarczają inne usługi niskopoziomowe dla aplikacji. W większości przypadków nie będziesz zainteresowany kodem zewnętrznym, dlatego narzędzie Użycia Procesora zbiera funkcje zewnętrzne metody użytkownika do jednego węzła [Wywołanie zewnętrzne].

Jeśli chcesz wyświetlić ścieżki wywołania kodu zewnętrznego, odznacz Pokaż tylko mój kod z listy Ustawienia, a następnie wybierz Zastosuj.

Zrzut ekranu przedstawiający ustawienia, a następnie pokaż tylko mój kod.

Kod zewnętrzny to funkcje w składnikach systemu i platformy, które są wykonywane przez kod, który piszesz. Kod zewnętrzny zawiera funkcje, które uruchamiają i zatrzymują aplikację, rysują interfejs użytkownika, kontrolują wątki oraz dostarczają inne usługi niskopoziomowe dla 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 [kod zewnętrzny] węźle.

Jeśli chcesz wyświetlić ścieżki wywołania kodu zewnętrznego, wybierz pozycję Pokaż kod zewnętrzny z listy filtru, a następnie wybierz pozycję Zastosuj.

Zrzut ekranu przedstawiający pozycję Wybierz widok filtru, a następnie Pokaż kod zewnętrzny.

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 komputerowych. 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 wyświetlić dane.

Napiwek

Jeśli profilujesz kod zewnętrzny wywołujący funkcje systemu Windows, upewnij się, że masz najbardziej aktualne 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 tego, jak upewnić się, że masz potrzebne pliki, zobacz Określanie symboli (.pdb) i plików źródłowych w debugerze.

Następne kroki

W tym samouczku nauczyłeś się, jak zbierać i analizować dane dotyczące użycia procesora. Jeśli zakończyłeś trasę po profilerze, warto zapoznać się z samouczkiem, który pokazuje, jak efektywniej korzystać z narzędzi.

W tym samouczku nauczyłeś się, jak zbierać i analizować dane użycia procesora podczas debugowania. Możesz dowiedzieć się więcej na temat profilowania kompilacji wydań przy użyciu profilera wydajności.