CPU 사용량 분석Analyze CPU usage

앱 성능 문제를 검토해야 하는 경우 앱에서 CPU를 사용하는 방식을 파악하는 것부터 시작하는 것이 좋습니다.When you need to investigate performance issues in your app, a good place to start is understanding how it uses the CPU. CPU 사용량 도구는 CPU에서 Visual C++, Visual C#/Visual Basic 및 JavaScript 코드 실행에 시간을 소모하는 상황을 보여 줍니다.The CPU Usage tool shows you where the CPU is spending time executing Visual C++, Visual C#/Visual Basic, and JavaScript code. Visual Studio 2015 업데이트 1부터 디버거를 종료하지 않고 CPU 사용의 기능별 분석 결과를 볼 수 있습니다.Starting in Visual Studio 2015 Update 1, you can see a per-function breakdown of CPU usage without leaving the debugger. 디버그하는 동안 CPU 프로파일링을 켜고 끌 수 있으며, 실행이 중지되면(예: 중단점에서) 결과를 볼 수 있습니다.You can turn CPU profiling on and off while debugging, and view the results when execution is stopped, for example at a breakpoint.

진단 세션을 실행 및 관리하기 위한 다양한 옵션이 있습니다.You have several options for running and managing your diagnostics session. 예를 들어 로컬이나 원격 컴퓨터에서 또는 시뮬레이터나 에뮬레이터에서 CPU 사용량 도구를 실행할 수 있습니다.For example, you can run the CPU Usage tool on local or remote machines, or on in a simulator or emulator. 실행 중인 앱에 연결되고 Visual Studio에서 열려 있는 프로젝트의 성능을 분석하거나 Microsoft Store에서 설치한 앱을 시작할 수 있습니다.You can analyze the performance of an open project in Visual Studio, attached to a running app, or start an app that is installed from the Microsoft Store. 자세한 내용은 디버거를 사용하거나 사용하지 않고 프로파일링 도구 실행을 참조하세요.For more information, see Run Profiling Tools with or without the debugger.

여기서는 릴리스 빌드를 사용하여 CPU 사용량을 수집 및 분석하는 방법을 보여 줍니다.Here, we show you how to collect and analyze CPU usage with release builds. 디버그하는 동안 CPU 사용량을 분석하려면 초보자를 위한 성능 프로파일링 지침을 참조하세요.To analyze CPU usage while debugging, see Beginner's guide to performance profiling.

참고

.NET Core 및 ASP.NET Core에 대한 CPU 사용량 도구는 현재 휴대용 PBD를 통해 정확한 결과를 제공하지 않습니다.For .NET Core and ASP.NET Core, the CPU Usage tool currently does not provide accurate results with portable PBDs. 대신 전체 PDB를 사용합니다.Use full PDBs instead.

CPU 사용량 데이터 수집Collect CPU usage data

  1. Visual Studio에서 솔루션 구성을 릴리스 으로 설정하고 배포 대상을 선택합니다.In Visual Studio, set the solution configuration to Release and choose the deployment target.

    릴리스 및 로컬 컴퓨터 선택Select Release and Local Machine

    • 릴리스 모드에서 앱을 실행하면 앱의 실제 성능을 더 잘 파악할 수 있습니다.Running the app in Release mode gives you a better view of the actual performance of your app.

    • 로컬 컴퓨터에서 앱을 실행하면 설치된 앱의 실행을 가장 잘 복제합니다.Running the app on the local machine best replicates the execution of the installed app.

    • 원격 장치에서 데이터를 수집하는 경우 원격 데스크톱 연결을 사용하는 것이 아니라 장치에서 직접 앱을 실행합니다.If you are collecting data from a remote device, run the app directly on the device and not by using a Remote Desktop Connection.

    • Windows Phone 앱의 경우 장치 에서 직접 데이터를 수집하면 가장 정확한 데이터가 제공됩니다.For Windows Phone apps, collecting data directly from the Device provides the most accurate data.

  2. 디버그 메뉴에서 성능 프로파일러를 선택합니다.On the Debug menu, choose Performance Profiler.

  3. CPU 사용량 을 선택한 다음 시작을 선택합니다.Choose CPU Usage and then choose Start.

    CPU 사용량 선택Choose CPU Usage

  4. 앱이 시작되면 최대 수 가져오기를 클릭합니다.When the app starts, click Get Max Number. 출력이 표시되면 약 1초간 기다린 다음 Get Max Number Async(비동기적으로 최대 수 가져오기)를 선택합니다.Wait about a second after the output is displayed, then choose Get Max Number Async. 단추를 클릭하는 시간 사이에 대기하면 진단 보고서에서 단추 클릭 루틴을 좀 더 쉽게 격리할 수 있습니다.Waiting between button clicks makes it easier to isolate the button click routines in the diagnostic report.

  5. 두 번째 출력 줄이 나타나면 성능 및 진단 허브에서 수집 중지 를 선택합니다.After the second output line appears, choose Stop Collection in the Performance and Diagnostic hub.

    CpuUsage 데이터 컬렉션 중지Stop CpuUsage data collection

    CPU 사용량 도구에서 데이터를 분석하고 보고서를 표시합니다.The CPU Usage tool analyzes the data and displays the report.

    CpuUsage 보고서CpuUsage report

CPU 사용량 보고서 분석Analyze the CPU usage report

CPU 사용량 호출 트리The CPU Usage call tree

호출 트리 정보 파악을 시작하려면 GetMaxNumberButton_Click 세그먼트를 다시 선택하고 호출 트리 세부 정보를 확인합니다.To get started understanding call tree information, reselect the GetMaxNumberButton_Click segment, and look at the call tree details.

호출 트리 구조Call tree structure

GetMaxNumberButton_Click 호출 트리GetMaxNumberButton_Click call tree

1단계Step 1 CPU 사용량 호출 트리의 최상위 노드는 의사 노드입니다.The top-level node in CPU Usage call trees is a pseudo-node
2단계Step 2 대다수 앱에서 외부 코드 포시 옵션이 사용하지 않도록 설정되어 있는 경우 두 번째 수준 노드는 앱을 시작/중지하고, UI를 그리며, 스레드 일정을 제어하고, 앱에 다른 낮은 수준 서비스를 제공하는 시스템과 프레임워크 코드가 포함된 [External Code] 노드입니다.In most apps, when the Show External Code option is disabled, the second-level node is an [External Code] node that contains the system and framework code that starts and stops the app, draws the UI, controls thread scheduling, and provides other low-level services to the app.
3단계Step 3 두 번째 수준 노드의 자식은 두 번째 수준 시스템과 프레임워크 코드가 호출하거나 만드는 사용자 코드 메서드 및 비동기 루틴입니다.The children of the second-level node are the user-code methods and asynchronous routines that are called or created by the second-level system and framework code.
4단계Step 4 메서드의 자식 노드에는 부모 메서드 호출에 대한 데이터만 포함되어 있습니다.Child nodes of a method contain data only for the calls of the parent method. 외부 코드 표시 가 사용하지 않도록 설정되어 있으면 앱 메서드에 [External Code] 노드를 포함할 수 있습니다.When Show External Code is disabled, app methods can also contain an [External Code] node.

외부 코드External code

외부 코드는 사용자가 작성한 코드에서 실행되는 시스템 및 프레임워크 구성 요소의 함수입니다.External code are functions in system and framework components that are executed by the code you write. 외부 코드에는 앱을 시작 및 중지하고, UI를 그리며, 스레딩을 제어하고, 앱에 다른 낮은 수준 서비스를 제공하는 함수가 포함되어 있습니다.External code include functions that start and stop the app, draw the UI, control threading, and provide other low-level services to the app. 대부분의 경우 외부 코드에 관심이 없으므로 CPU 사용량 호출 트리에서 사용자 메서드의 외부 함수를 하나의 [External Code] 노드로 수집합니다.In most cases, you won't be interested in external code, and so the CPU Usage call tree gathers the external functions of a user method into one [External Code] node.

외부 코드의 호출 경로를 보려면 필터 뷰 목록에서 외부 코드 보기 를 선택한 다음 적용을 선택합니다.When you want to view the call paths of external code, choose Show External Code from the Filter view list and then choose Apply.

필터 뷰 선택 후 외부 코드 표시Choose Filter View, then Show External Code

여러 외부 코드 호출 체인은 깊이 중첩되어 있으므로 함수 이름 열의 너비가 컴퓨터 모니터의 거의 최대 화면 너비를 초과할 수 있습니다.Be aware that many external code call chains are deeply nested, so that the width of the Function Name column can exceed the display width of all but the largest of computer monitors. 이런 경우 함수 이름은 다음과 같이 […] 로 표시됩니다.When this happens, function names are shown as [...]:

호출 트리에 중첩된 외부 코드Nested external code in the call tree

검색 상자를 사용하여 검색 중인 노드를 찾은 다음, 가로 스크롤 막대를 사용하여 데이터를 뷰로 가져옵니다.Use the search box to find a node that you are looking for, then use the horizontal scroll bar to bring the data into view:

중첩된 외부 코드 검색Search for nested external code

호출 트리 데이터 열Call tree data columns

총 CPU(%)Total CPU (%) 총 % 데이터 수식Total % data equation

함수 호출 및 함수가 호출한 함수에 사용된 선택한 시간 범위의 앱 CPU 활동에 대한 백분율입니다.The percentage of the app's CPU activity in the selected time range that was used by calls to the function and the functions called by the function. 이 값은 시간 범위에서 앱의 총 활동을 사용 가능한 총 CPU 용량과 비교하는 CPU 사용률 타임라인 그래프와 다릅니다.Note that this is different from the CPU Utilization timeline graph, which compares the total activity of the app in a time range to the total available CPU capacity.
셀프 CPU(%)Self CPU (%) 자체 % 수식Self % equation

함수 호출에 사용된 선택한 시간 범위의 앱 CPU 활동에 대한 백분율로, 함수가 호출한 함수의 활동은 제외됩니다.The percentage of the app's CPU activity in the selected time range that was used by the calls to the function, excluding the activity of functions called by the function.
총 CPU(밀리초)Total CPU (ms) 선택한 시간 범위에서의 함수 호출과 함수가 호출한 함수에 소요된 시간(밀리초)입니다.The number of milliseconds spent in calls to the function in the selected time range and the functions that were called by the function.
셀프 CPU(밀리초)Self CPU (ms) 선택한 시간 범위에서의 함수 호출과 함수가 호출한 함수에 소요된 시간(밀리초)입니다(함수에서 호출한 함수 활동 제외).The number of milliseconds spent in calls to the function in the selected time range and the functions that were called by the function, excluding the activity of functions called by the function.
모듈Module 함수가 포함된 모듈의 이름 또는 [External Code] 노드에 함수가 포함된 모듈의 수입니다.The name of the module containing the function, or the number of modules containing the functions in an [External Code] node.

CPU 사용량 호출 트리의 비동기 함수Asynchronous functions in the CPU usage call tree

컴파일러에서 비동기 메서드가 발생하면 메서드 실행을 제어하는 숨겨진 클래스를 만듭니다.When the compiler encounters an asynchronous method, it creates a hidden class to control the method's execution. 개념적으로 클래스는 원래 메서드의 연산을 비동기적으로 호출하고, 이러한 연산을 실행하는 데 필요한 콜백, 스케줄러 및 반복기를 올바르게 호출하는 컴파일러 생성 함수 목록을 포함하는 상태 시스템입니다.Conceptually, the class is a state machine that includes a list of compiler-generated functions that call operations of the original method asynchronously, and the callbacks, scheduler, and iterators required to execute them correctly. 부모 메서드가 원래 메서드를 호출하면 런타임에서 부모의 실행 컨텍스트에서 메서드를 제거하고, 앱의 실행을 제어하는 시스템과 프레임워크 코드의 컨텍스트에서 숨겨진 클래스의 메서드를 실행합니다.When the original method is called by a parent method, the runtime removes the method from the execution context of the parent, and runs the methods of the hidden class in the context of the system and framework code that control the app's execution. 비동기 메서드는 일반적으로 하나 이상의 서로 다른 스레드에서 실행되지만 항상 그렇지는 않습니다.The asynchronous methods are often, but not always, executed on one or more different threads. 이 코드는 트리의 상단 노드 바로 아래의 [External Code] 노드의 자식으로 CPU 사용량 호출 트리에 표시됩니다.This code is shown in the CPU Usage call tree as children of the [External Code] node immediately below the top node of the tree.

이 예제에서 이 코드를 보려면 타임라인에서 GetMaxNumberAsyncButton_Click 세그먼트를 다시 선택합니다.To see this in our example, re-select the GetMaxNumberAsyncButton_Click segment in the timeline.

GetMaxNumberAsyncButton_Click 보고서 선택GetMaxNumberAsyncButton_Click report selection

[External Code] 아래에 있는 처음 두 노드는 상태 시스템 클래스의 컴파일러 생성 메서드입니다.The first two nodes under [External Code] are the compiler-generated methods of the state machine class. 세 번째 노드는 원래 메서드에 대한 호출입니다.The third is the call to original method. 생성된 메서드를 확장하면 진행 상황이 표시됩니다.Expanding the generated methods shows you what's going on.

확장된 GetMaxNumberAsyncButton_Click 호출 트리Expanded GetMaxNumberAsyncButton_Click call tree

  • MainPage::GetMaxNumberAsyncButton_Click는 아주 작은 기능만을 수행합니다. 이 메서드는 작업 값 목록을 관리하고, 결과의 최대값을 계산하고, 출력을 표시합니다.MainPage::GetMaxNumberAsyncButton_Click does very little; it manages a list of the task values, computes the maximum of the results, and displays the output.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNextGetNumberAsync에 대한 호출을 래핑하는 48개 작업을 예약 및 시작하는 데 필요한 활동을 보여 줍니다.MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext shows you the activity required to schedule and launch the 48 tasks that wrap the call to GetNumberAsync.

  • MainPage::<GetNumberAsync>b__bGetNumber를 호출하는 작업의 활동을 보여 줍니다.MainPage::<GetNumberAsync>b__b shows you the activity of the tasks that call GetNumber.