Udostępnij za pośrednictwem


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 do użycia CPU w programie Visual Studio pokazuje aktywny czas obliczeniowy CPU i procent czasu spędzony na wykonywaniu kodu w językach C++, C#, Visual Basic.

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

  • Zdiagnozuj spowolnienie lub zawieszanie się procesów w repozytorium kodu zespołu. Narzędzie może pomóc zdiagnozować problem z kodem produkcyjnym zespołu. Zapewnia ona automatyczne szczegółowe informacje i różne widoki danych, dzięki czemu można analizować i diagnozować problemy z wydajnością.

  • Identyfikowanie problemów z wydajnością w scenariuszach devOps Na przykład narzędzie może pomóc, gdy klient zgłasza, że niektóre żądania lub zamówienia nie przechodzą do witryny internetowej 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.

  • Sprawdź wysokie użycie procesora CPU 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 może pomóc w zidentyfikowaniu wąskich gardeł, dzięki czemu można zawęzić obszary do optymalizacji.

Narzędzie użycie procesora jest przydatne zarówno dla lokalnych sesji śledzenia, jak i produkcji. Narzędzie Użycie CPU można uruchomić za pomocą skrótu klawiaturowego, Alt+F2, a następnie wybrać Użycie CPUlub otwierając już zebraną trasę 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żna uruchomić w otwartym projekcie programu Visual Studio, w zainstalowanej aplikacji ze sklepu Microsoft Store lub dołączyć do uruchomionej aplikacji lub procesu. Narzędzie do monitorowania użycia procesora można uruchomić w kompilacjach wersji końcowej lub w trybie debugowania. Aby uzyskać więcej informacji, zobacz Uruchom narzędzia profilowania na kompilacjach wersji lub debugowania.

Poniższe instrukcje pokazują, jak używać narzędzia Użycie procesora CPU bez debugera przy użyciu profilera wydajności programu Visual Studio. Przykłady używają kompilacji w wersji Release na lokalnym komputerze. Kompilacje produkcyjne zapewniają najbardziej wierny widok rzeczywistej wydajności aplikacji. Aby zobaczyć samouczek pokazujący, jak zwiększyć wydajność, korzystając z narzędzia Użycie CPU, zobacz Analiza przypadku: 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łączenia pulpitu zdalnego.

Zbieranie danych użycia procesora CPU

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

    Zrzut ekranu przedstawiający Wybierz Release i Local Machine.

    Zrzut ekranu przedstawiający wybór opcji Release i maszyny lokalnej.

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

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

    Zrzut ekranu przedstawiający wybór użycia procesora.

    Zrzut ekranu przedstawiający wybór użycia procesora.

    Jeśli przed uruchomieniem profilera włączysz opcję Rozpocznij od wstrzymania zbierania, dane nie będą zbierane, dopóki nie wybierzesz przycisku Nagrywaj w widoku sesji diagnostycznej.

    Notatka

    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 o użyciu procesora.

    Zrzut ekranu przedstawiający zatrzymanie zbierania danych o użyciu procesora.

    Narzędzie użycia procesora 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. raport użycia procesora CPU

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

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

Kolumny danych użycia procesora CPU

Nazwa Opis
łączny procesor [jednostka, %] równanie danych łącznych %

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

Liczba milisekund czasu obliczeniowego procesora i procent użycia 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ę.

Analiza danych CPU

Jeśli jakiekolwiek szczegółowe informacje są wyświetlane w sekcji Top Insights, użyj podanego linku, aby uzyskać więcej informacji na temat zidentyfikowanego problemu. Ponadto, jeśli używasz Copilot, przycisk Ask Copilot otworzy okno czatu Copilot, a Copilot udostępni sugestie na podstawie kodu i zidentyfikowanych problemów.

Aby uzyskać więcej informacji, zobacz szczegółowe informacje dotyczące CPU.

Analizowanie wykorzystania procesora

Aby przeanalizować raport użycia procesora, kliknij Otwórz szczegółylub kliknij jedną z najważniejszych funkcji, aby otworzyć widok Funkcje.

Raport zawiera różne widoki danych diagnostycznych:

Widok Opis
Dzwoniący/odbierający Szczegółowy widok czasu CPU dla określonej funkcji, funkcji, które ją wywołały, oraz funkcji, które ona wywołuje. Dane wydajności są agregowane dla okresu zbierania danych. Możesz wybierać wywołujące i wybrane funkcje, aby przejść przez ścieżkę wywołania.
Drzewo wywołań Hierarchiczny widok ścieżki wywołania funkcji. Służy do identyfikowania ścieżek wywołań, które zajmują najwięcej czasu procesora CPU (ścieżka gorąca).
Moduły Widok czasu procesora CPU spędzonego w poszczególnych modułach zagregowanych w okresie zbierania danych. Służy do identyfikowania modułów, które mogą być wąskimi gardłami wydajności z powodu kombinacji wysokich liczby wywołań i/lub problemów z wydajnością.
Funkcje Widok czasu procesora spędzonego w poszczególnych funkcjach, który został zsumowany w okresie zbierania danych. Służy do identyfikowania funkcji, które mogą być wąskimi gardłami wydajności z powodu kombinacji wysokich liczby wywołań i/lub problemów z wydajnością.
Wykres płomienia Hierarchiczny widok ścieżki wywołania funkcji w wizualizacji grafu płomienia. Służy do identyfikowania ścieżek wywołań, które zajmują najwięcej czasu procesora CPU (ścieżka gorąca).

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

Raport zawiera różne widoki danych diagnostycznych:

  • Dzwoniący/odbierający
  • Drzewo wywołań

We wszystkich widokach z wyjątkiem Wywołujący/odbierający raport diagnostyczny jest sortowany według Całkowita wartość CPU, od najwyższej do najniższej. 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, takie jak czas spędzony w funkcji, wraz z wywołanymi funkcjami (całkowity czas CPU), oraz drugą kolumnę przedstawiającą czas spędzony w funkcji, z wyłączeniem wywołanych funkcji (czas własny CPU).

Dane te mogą pomóc w ocenie, czy sama funkcja może stać się 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ą programu Flame Graph.

Drzewo wywołań użycia procesora

Aby wyświetlić drzewo wywołań, wybierz węzeł nadrzędny w raporcie. Domyślnie strona użycie procesora otwiera się w widoku wywołujący/wywoływany. W liście rozwijanej bieżącego widoku, wybierz pozycję Drzewo Wywołań .

Możesz kliknąć przyciski Rozwiń najczęstszą ścieżkę i Pokaż najczęstszą ścieżkę, aby wyświetlić wywołania funkcji, które wykorzystują największy procent mocy 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 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 jest węzłem [Kod zewnętrzny]. Węzeł zawiera kod systemu i frameworka, który uruchamia i zatrzymuje aplikację, rysuje interfejs użytkownika, kontroluje planowanie wątków i udostępnia aplikacji inne usługi niskiego poziomu.
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. Po wyłączeniu Pokaż kod zewnętrzny, metody aplikacji mogą również zawierać węzeł [kod zewnętrzny].

Kod zewnętrzny

Funkcje systemowe i ramowe, które są wykonywane przez twój 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 CPU zbiera funkcje zewnętrzne metody użytkownika w jednym węźle [Wywołanie zewnętrzne].

Aby wyświetlić ścieżki wywołania kodu zewnętrznego, na głównej stronie podsumowania raportu (okienko po prawej stronie), usuń zaznaczenie Pokaż tylko mój kod z listy rozwijanej Ustawienia , a następnie wybierz Zastosuj. (Lista rozwijana ustawienia jest dostępna na stronie podsumowania głównego raportu, a nie na widokach szczegółowych).

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

Funkcje systemowe i ramowe, które są wykonywane przez twój 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łania użycie procesora CPU zbiera funkcje zewnętrzne metody użytkownika w jednym [kod zewnętrzny] węźle.

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

Zrzut ekranu przedstawiający wyświetlanie Kod Zewnętrznego.

Po wyłączeniu Pokaż tylko mój kod, widok Drzewo wywołań na stronie Użycie CPU rozszerza zewnętrzne wywołania kodu.

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świetlacza kolumny nazwa funkcji. Nazwy funkcji zostaną wyświetlone, jak pokazano na poniższej ilustracji.

Zrzut ekranu przedstawiający kod zewnętrzny zagnieżdżony 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świetlacza kolumny nazwa funkcji. Nazwy funkcji są następnie wyświetlane jako ....

Zrzut ekranu przedstawiający kod zewnętrzny zagnieżdżony 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 CPU

Gdy kompilator napotka metodę asynchroniczną, tworzy ukrytą klasę do kontrolowania wykonywania metody. Koncepcyjnie klasa jest maszyną stanu. Klasa posiada funkcje wygenerowane przez kompilator, które asynchronicznie wywołują oryginalne metody oraz zawiera 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 na jednym lub więcej różnych wątkach. Ten kod pojawia się w drzewie wywołań użycia procesora jako elementy podrzędne [Kod zewnętrzny] węzła bezpośrednio poniżej górnego węzła drzewa.

W poniższym przykładzie pierwsze dwa węzły w [Kod zewnętrzny] to metody generowane przez kompilator klasy maszyny stanu. Trzeci węzeł to odwołanie do pierwotnej 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 zarządza tylko 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 pokazuje działanie zadań wywołujących GetNumber.

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 dla użycia procesora CPU w profilerze wydajności.

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

  2. Włącz opcję Zbieranie liczników wywołań (tylko dla platformy .NET).

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

  3. Zbieraj dane dotyczące użycia procesora.

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