Analizowanie wydajności przy użyciu profilowania procesora CPU w profilerze wydajności (C#, Visual Basic, C++, F#)

Dobrym sposobem na rozpoczęcie badania problemów z wydajnością w aplikacji jest zrozumienie wykorzystania procesora CPU przy użyciu profilera procesora CPU. Narzędzie wydajności użycia procesora CPU pokazuje czas procesora CPU i procent spędzony na wykonywaniu kodu w języku C++, C#/Visual Basic.

Narzędzie Użycie procesora CPU może pomóc:

  • Diagnozowanie spowolnienia lub zawieszania się procesu w bazie kodu zespołu. Narzędzie może pomóc zdiagnozować problem z kodem produkcyjnym zespołu. Narzędzie zapewnia automatyczne szczegółowe informacje i różne widoki danych, dzięki czemu można analizować i diagnozować problemy z wydajnością.

  • Zidentyfikuj problemy z wydajnością w scenariuszach devOps, na przykład wtedy, gdy klient zgłasza, że niektóre żądania lub zamówienia nie przechodzą do witryny sieci Web handlu detalicznego w okresie szczytu. Często problemy występują w środowisku produkcyjnym i trudno jest debugować w tej chwili, ale to narzędzie może pomóc w przechwyceniu wystarczającej ilości informacji i dowodów na problem. Po zebraniu pliku śledzenia analiza może szybko pomóc zrozumieć potencjalne przyczyny i przekazać sugestie w kontekście kodu, aby można było wykonać kolejne kroki w celu rozwiązania problemu.

  • Jeśli problem z opóźnieniem nie znajduje się w żądaniu interfejsu API, możesz sprawdzić wysokie użycie procesora CPU i inne powiązane problemy z narzędziem Użycie procesora CPU. Narzędzie Użycie procesora CPU może pomóc w zidentyfikowaniu wąskich gardeł, dzięki czemu można zawęzić miejsce optymalizacji.

Narzędzie Użycie procesora CPU jest przydatne zarówno w przypadku lokalnych sesji śledzenia, jak i środowiska produkcyjnego. Narzędzie Użycie procesora CPU można również zainicjować za pomocą skrótu klawiaturowego Alt+F2, a następnie wybrania opcji Użycie procesora CPU lub otwierając już zebrane dane śledzenia za pomocą narzędzia, takiego jak dotnet-trace lub dotnet-monitor. (W przypadku kodu produkcyjnego platformy .NET jest to najprawdopodobniej sposób zbierania śladów).

Narzędzie Użycie procesora CPU może działać w otwartym projekcie programu Visual Studio, w zainstalowanej aplikacji ze sklepu Microsoft Store lub dołączone do uruchomionej aplikacji lub procesu. Narzędzie Użycie procesora CPU można uruchomić z debugowaniem lub bez debugowania. Aby uzyskać więcej informacji, zobacz Uruchamianie narzędzi profilowania z debugerem lub bez tego debugera.

Poniższe instrukcje pokazują, jak używać narzędzia Użycie procesora CPU bez debugera przy użyciu profilera wydajności programu Visual Studio. W przykładach użyto kompilacji Wydania na komputerze lokalnym. Kompilacje wersji zapewniają najlepszy widok rzeczywistej wydajności aplikacji. Aby zapoznać się z samouczkiem pokazującym, jak zwiększyć wydajność przy użyciu narzędzia Użycie procesora CPU, zobacz Przewodnik dla początkujących dotyczący optymalizowania kodu.

Zazwyczaj maszyna lokalna najlepiej replikuje zainstalowane wykonanie aplikacji. Aby zebrać dane z urządzenia zdalnego, uruchom aplikację bezpośrednio na urządzeniu, a nie za pośrednictwem Połączenie pulpitu zdalnego.

Zbieranie danych użycia procesora CPU

  1. W projekcie programu Visual Studio ustaw konfigurację rozwiązania na Release (Wydanie ) i wybierz pozycję Local Windows Debugger (lub Local Machine) jako element docelowy wdrożenia.

    Zrzut ekranu przedstawiający wybieranie wersji i komputera lokalnego.

    Zrzut ekranu przedstawiający wybieranie wersji i komputera lokalnego.

  2. Wybierz pozycję Debugowanie>profilera wydajności.

  3. W obszarze Dostępne narzędzia wybierz pozycję Użycie procesora CPU, a następnie wybierz pozycję Uruchom.

    Zrzut ekranu przedstawiający wybieranie użycia procesora CPU.

    Zrzut ekranu przedstawiający wybieranie użycia procesora CPU.

    Jeśli włączysz opcję Rozpocznij od kolekcji wstrzymanej przed uruchomieniem profilera, dane nie będą zbierane do momentu wybrania przycisku Rekord w widoku sesji diagnostycznej.

    Uwaga

    Aby uzyskać więcej informacji na temat zwiększenia wydajności narzędzia, zobacz Optymalizowanie ustawień profilera.

  4. Po uruchomieniu aplikacji rozpoczyna się sesja diagnostyczna i wyświetla dane użycia procesora CPU. Po zakończeniu zbierania danych wybierz pozycję Zatrzymaj zbieranie.

    Zrzut ekranu przedstawiający zatrzymanie zbierania danych użycia procesora CPU.

    Zrzut ekranu przedstawiający zatrzymanie zbierania danych użycia procesora CPU.

    Narzędzie Użycie procesora CPU analizuje dane i wyświetla raport. Jeśli masz problemy ze zbieraniem lub wyświetlaniem danych, zobacz Rozwiązywanie problemów z błędami profilowania i rozwiązywanie problemów.

    Zrzut ekranu przedstawiający raport użycia procesora CPU.

    Zrzut ekranu przedstawiający raport użycia procesora CPU.

    Użyj listy rozwijanej Filtr , aby wybrać lub usunąć zaznaczenie wątków do wyświetlenia, a następnie użyj pola Wyszukiwania , aby wyszukać określony wątek lub węzeł.

Kolumny danych użycia procesora CPU

Nazwa/nazwisko opis
Łączna liczba procesorów CPU [jednostka, %] Równanie całkowitej liczby danych w %

Liczba milisekund i procent użycia procesora PRZEZ wywołania funkcji oraz funkcje wywoływane przez funkcję w wybranym zakresie czasu. Różni się to od wykresu osi czasu wykorzystania procesora CPU, który porównuje łączną aktywność procesora CPU w zakresie czasu z łączną dostępną ilością procesora CPU.
Procesor własny [jednostka, %] Równanie samozwań

Procent użycia milisekund i procesora CPU przez wywołania funkcji w wybranym zakresie czasu, z wyłączeniem funkcji wywoływanych przez funkcję.
Moduł W niektórych widokach zostanie wyświetlona kolumna Moduł, która pokazuje nazwę modułu zawierającego funkcję.

Analizowanie szczegółowych informacji o procesorze CPU

Aby przeanalizować najważniejsze szczegółowe informacje, najważniejsze funkcje i ścieżkę gorącą, zobacz Szczegółowe informacje o procesorze CPU.

Analizowanie wykorzystania procesora CPU

Aby przeanalizować raport Użycie procesora CPU, kliknij pozycję Otwórz szczegóły lub kliknij jedną z najważniejszych funkcji, aby otworzyć widok funkcji .

Raport zawiera różne widoki danych diagnostycznych:

  • Obiekt wywołujący/wywoływany
  • Drzewo wywołań
  • Moduły
  • Funkcje
  • Wykres płomienia

Aby przeanalizować raport, kliknij pozycję Utwórz szczegółowy raport.

Raport zawiera różne widoki danych diagnostycznych:

  • Obiekt wywołujący/wywoływany
  • Drzewo wywołań

We wszystkich widokach z wyjątkiem obiektu wywołującego/wywoływanego raport diagnostyczny jest sortowany według całkowitego procesora CPU, od najwyższego do najniższego. Zmień kolejność sortowania lub kolumnę sortowania, wybierając nagłówki kolumn. Możesz kliknąć dwukrotnie funkcję, którą cię interesuje, i zobaczysz źródło funkcji, a także wyróżnienie, które pokazuje, gdzie jest spędzany czas w tej funkcji. W tabeli przedstawiono kolumny z danymi, takimi jak czas spędzony w funkcji, w tym nazywane funkcjami (łączny procesor CPU), a druga kolumna przedstawiająca czas spędzony w funkcji, z wyłączeniem nazywanych funkcjami (Procesor własny).

Te dane mogą pomóc w ocenie, czy sama funkcja jest wąskim gardłem wydajności. Określ ilość danych wyświetlanych przez metodę, aby sprawdzić, czy biblioteki kodu lub środowiska uruchomieniowego innej firmy są przyczyną spowolnienia punktów końcowych lub dużego zużycia zasobów.

Aby uzyskać więcej informacji na temat używania grafu Płomienia, zobacz Identyfikowanie ścieżek gorących za pomocą grafu płomieni.

Drzewo wywołań użycia procesora CPU

Aby wyświetlić drzewo wywołań, wybierz węzeł nadrzędny w raporcie. Domyślnie strona Użycie procesora CPU zostanie otwarta w widoku Wywołujący/Wywoływany. Na liście rozwijanej Bieżący widok wybierz pozycję Drzewo wywołań.

Możesz kliknąć przyciski Rozwiń ścieżkę gorącą i Pokaż ścieżkę gorącą, aby wyświetlić wywołania funkcji, które używają najwyższego procentu procesora CPU w widoku drzewa wywołań.

Struktura drzewa wywołań

Zrzut ekranu przedstawiający strukturę drzewa wywołań.

Zrzut ekranu przedstawiający strukturę drzewa wywołań.

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

Kod zewnętrzny

Funkcje systemu i struktury, które są wykonywane przez kod, są nazywane kodem zewnętrznym. Funkcje kodu zewnętrznego uruchamiają i zatrzymują aplikację, rysują interfejs użytkownika, kontrolują wątki i udostępniają aplikacjom inne usługi niskiego poziomu. W większości przypadków nie interesuje Cię kod zewnętrzny, więc drzewo wywołań użycia procesora CPU zbiera funkcje zewnętrzne metody użytkownika w jednym węźle [Kod zewnętrzny].

Aby wyświetlić ścieżki wywołań kodu zewnętrznego, przełącz bieżący widok do widoku Drzewa wywołań lub kliknij prawym przyciskiem myszy i wybierz pozycję Widok w drzewie wywołań.

Zrzut ekranu przedstawiający pozycję Pokaż w drzewie wywołań.

Aby wyświetlić ścieżki wywołania kodu zewnętrznego, na głównej stronie raportu diagnostycznego (okienko po prawej stronie) wybierz pozycję Pokaż kod zewnętrzny z listy rozwijanej Filtr , a następnie wybierz pozycję Zastosuj. Widok Drzewo wywołań strony Użycie procesora CPU rozwija wywołania kodu zewnętrznego. (Lista rozwijana filtru jest dostępna na stronie głównej diagnostyki, a nie na szczegółowych widokach).

Zrzut ekranu przedstawiający pokaż kod zewnętrzny.

Wiele łańcuchów wywołań kodu zewnętrznego jest głęboko zagnieżdżonych, więc szerokość łańcucha może przekraczać szerokość wyświetlaną kolumny Nazwa funkcji. Nazwy funkcji zostaną wyświetlone, jak pokazano na poniższej ilustracji.

Zrzut ekranu przedstawiający zagnieżdżony kod zewnętrzny w drzewie wywołań.

Wiele łańcuchów wywołań kodu zewnętrznego jest głęboko zagnieżdżonych, więc szerokość łańcucha może przekraczać szerokość wyświetlaną kolumny Nazwa funkcji. Nazwy funkcji są wyświetlane jako ....

Zrzut ekranu przedstawiający zagnieżdżony kod zewnętrzny w drzewie wywołań.

Aby znaleźć nazwę funkcji, której szukasz, użyj pola wyszukiwania. Umieść kursor na wybranym wierszu lub użyj poziomego paska przewijania, aby wyświetlić dane.

Zrzut ekranu przedstawiający wyszukiwanie zagnieżdżonego kodu zewnętrznego.

Zrzut ekranu przedstawiający wyszukiwanie zagnieżdżonego kodu zewnętrznego.

Funkcje asynchroniczne w drzewie wywołań użycia procesora CPU

Gdy kompilator napotka metodę asynchroniczną, tworzy ukrytą klasę do kontrolowania wykonywania metody. Koncepcyjnie klasa jest maszyną stanu. Klasa ma funkcje generowane przez kompilator, które asynchronicznie nazywają oryginalne metody, a wywołania zwrotne, harmonogram i iteratory potrzebne do ich uruchomienia. Gdy metoda nadrzędna wywołuje oryginalną metodę, kompilator usuwa metodę z kontekstu wykonywania elementu nadrzędnego i uruchamia ukryte metody klasy w kontekście kodu systemu i struktury kontrolującego wykonywanie aplikacji. Metody asynchroniczne są często, ale nie zawsze wykonywane w co najmniej jednym wątku. Ten kod jest wyświetlany w drzewie wywołań użycia procesora CPU jako elementy podrzędne węzła [Kod zewnętrzny] bezpośrednio poniżej górnego węzła drzewa.

W poniższym przykładzie pierwsze dwa węzły w obszarze [Kod zewnętrzny] to metody generowane przez kompilator klasy maszyny stanu. Trzeci węzeł to wywołanie oryginalnej metody.

Zrzut ekranu przedstawiający węzeł asynchroniczny.

Rozwiń wygenerowane metody, aby pokazać, co się dzieje:

Zrzut ekranu przedstawiający rozwinięty węzeł asynchroniczny.

Zrzut ekranu przedstawiający rozwinięty węzeł asynchroniczny.

  • MainPage::GetMaxNumberAsyncButton_Click po prostu zarządza listą wartości zadań, oblicza maksymalną liczbę wyników i wyświetla dane wyjściowe.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext Pokazuje działanie wymagane do zaplanowania i uruchomienia 48 zadań, które opakowują wywołanie do GetNumberAsync.

  • MainPage::<GetNumberAsync>b__b wyświetla działanie zadań, które wywołają GetNumberelement .

Zbieranie liczby wywołań (.NET)

Jeśli chcesz wyświetlić liczby wywołań w widoku funkcje, możesz włączyć to ustawienie przed uruchomieniem profilera. To ustawienie jest obsługiwane w przypadku typów projektów .NET i wymaga uruchomienia procesu w profilerze. Scenariusz dołączania nie jest obsługiwany.

  1. Wybierz ikonę Ustawienia użycia procesora CPU w profilerze wydajności.

    Zrzut ekranu przedstawiający ikonę ustawień użycia procesora CPU.

  2. Włącz opcję Zbieraj liczby wywołań (tylko platforma.NET).

    Zrzut ekranu przedstawiający ustawienia użycia procesora CPU.

  3. Zbieranie danych użycia procesora CPU.

  4. Otwórz widok Funkcje, a następnie upewnij się, że kolumna Liczba wywołań jest widoczna.

    Jeśli kolumna nie jest widoczna, kliknij prawym przyciskiem myszy nagłówek kolumny, aby wybrać widoczne kolumny.

    Zrzut ekranu przedstawiający dane liczby wywołań.