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

Znajdowanie problemów z wydajnością podczas debugowania za pomocą narzędzia diagnostycznego użycia 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ć, aby skoncentrować się na określonych segmentach sesji próbkowania.

Ważne

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++. Wymagane jest odpowiednie obciążenie programu Visual Studio. System Windows 8 lub nowszy jest wymagany do uruchamiania narzędzi profilowania przy użyciu debugera (okno Narzędzia diagnostyczne).

Ten samouczek obejmuje następujące kroki:

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

Jeśli użycie procesora CPU nie daje 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

  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. 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ż system Windows.>

  4. Możesz wybrać, czy na pasku narzędzi ma być widoczne użycie procesora CPU, użycie pamięci, czy oba te opcje. Jeśli używasz programu Visual Studio Enterprise, możesz również włączyć lub wyłączyć funkcję IntelliTrace w obszarze Narzędzia>Opcje>IntelliTrace.

    Screenshot that shows Diagnostics Tools.

    Screenshot that shows Diagnostics Tools.

    Przyjrzyjmy się głównie wykorzystaniu procesora CPU, dlatego upewnij się, że użycie procesora 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>narzędzia diagnostyczne w systemie Windows>.

    Screenshot that shows Diagnostics Tools Summary Tab.

    Screenshot that shows Diagnostics Tools Summary Tab.

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

  6. Uruchom scenariusz, który spowoduje trafienie pierwszego punktu przerwania.

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

    Screenshot that shows Diagnostics Tools enable CPU profiling.

    Screenshot that shows Diagnostics Tools enable CPU profiling.

    Po wybraniu pozycji Zarejestruj profil procesora CPU program Visual Studio rozpocznie rejestrowanie funkcji i ile czasu zajmuje wykonanie. Zebrane dane można wyświetlać tylko wtedy, gdy aplikacja zostanie zatrzymana w punkcie przerwania.

  8. Naciśnij klawisz F5, aby uruchomić aplikację w drugim punkcie 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.

    Screenshot that shows Diagnostics Tools preparing threads.

    Screenshot that shows Diagnostics Tools preparing threads.

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

    Screenshot that shows Diagnostics Tools CPU Usage Tab.

    Screenshot that shows Diagnostics Tools CPU Usage Tab.

  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).

    Screenshot that shows Diagnostics Tools selecting a time segment.

    Screenshot that shows Diagnostics Tools selecting a time segment.

    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.

    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ę.

    Screenshot that shows Diagnostics Tools CPU Usage Function List.

    Screenshot that shows Diagnostics Tools CPU Usage Function List.

    Napiwek

    Funkcje są wymienione w kolejności, począwszy od tych, którzy wykonują największą pracę (nie są w kolejności wywołania). 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 widok Funkcje zostanie otwarty w okienku po lewej stronie. Wybierz widok Wywołujący/Wywoływany z menu rozwijanego.

    Screenshot that shows Diagnostics Tools Caller Callee View.

    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 nazwała bieżącą funkcję, jest wyświetlana po lewej stronie w obszarze Funkcje wywołujące, a wszystkie funkcje wywoływane przez bieżącą funkcję są wyświetlane w polu Wywoływane funkcje 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ż łą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 .

    Screenshot that shows Diagnostics Tools Caller Callee View.

    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 nazwała bieżącą funkcję, jest wyświetlana po lewej stronie w obszarze Funkcje wywołujące, a wszystkie funkcje wywoływane przez bieżącą funkcję są wyświetlane w polu Wywoływane funkcje 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ż łą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ływanym przez tę funkcję).

    Napiwek

    Wysokie wartości w treści funkcji mogą wskazywać wąskie gardło wydajności w samej funkcji.

  3. 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.

    Diagnostics Tools Call Tree

    Obraz opis
    Step 1 Węzeł najwyższego poziomu w drzewach wywołań użycia procesora CPU jest pseudowęźle
    Step 2 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.
    Step 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.
    Step 4 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].

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

    • Łączna liczba procesorów 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.

    • Procesor własny 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 procesora CPU samodzielnego mogą wskazywać wąskie gardło wydajności w obrębie 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 używające najwyższego procentu procesora CPU w widoku drzewa wywołań, kliknij pozycję Rozwiń ścieżkę gorącą.

    Screenshot that shows Diagnostics Tools Hot Path.

    Uwaga

    Jeśli kod zostanie wyświetlony w drzewie wywołań oznaczonym jako "przerwany" kod lub "niemożliwy do stosu", oznacza to, że prawdopodobnie usunięto zdarzenia śledzenia zdarzeń systemu Windows (ETW). Spróbuj zebrać ten sam ślad po raz drugi, aby rozwiązać problem.

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

Screenshot that shows Choose Filter View, then Show External Code.

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 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 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 przedstawiono sposób zbierania i analizowania danych użycia procesora CPU. Jeśli przewodnik po profilerze został już ukończony, warto zapoznać się z ogólnym podejściem do optymalizacji kodu przy użyciu narzędzi profilowania.

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 wydań przy użyciu profilera wydajności.