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 Update 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 ストアからインストールされたアプリを開始したりできます。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. 詳しくは、「Run Profiling Tools with or without the Debugger」(デバッガーを使用して、または使用せずにプロファイリング ツールを実行する) を参照してください。For more information, see Run Profiling Tools with or without the Debugger. UWP アプリのパフォーマンス分析に関するチュートリアルについては、「ユニバーサル Windows アプリ (UWP) での CPU 使用率を分析します」をご覧ください。For a walkthrough that analyzes the performance of a UWP app, see Analyze CPU Usage in a Universal Windows App (UWP).

ここでは、リリース ビルドで 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.

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 秒待ってから、[非同期の最大数の取得] を選択します。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. 2 番目の出力行が表示された後、パフォーマンスと診断ハブで [コレクションの停止] をクリックします。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

手順 1Step 1 CPU 使用率コール ツリーのトップ レベルのノードは擬似ノードです。The top-level node in CPU Usage call trees is a pseudo-node
手順 2Step 2 ほとんどのアプリでは、 [外部コードの表示] オプションをオフにすると、セカンド レベルのノードは [外部コード] ノードとなります。このノードに含まれるシステムおよびフレームワーク コードは、アプリの開始と停止、UI の描画、スレッド スケジュールの制御、およびアプリへの他の低レベル サービスの提供を行います。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.
手順 3Step 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.
手順 4Step 4 メソッドの子ノードには、親メソッドの呼び出しのみのデータが含まれます。Child nodes of a method contain data only for the calls of the parent method. [外部コードの表示] がオフのとき、アプリ メソッドには [外部コード] ノードが含まれる場合もあります。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 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 使用率コール ツリーはユーザー メソッドの外部関数を 1 つの [外部コード] ノードにまとめます。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.
モジュールModule 関数が含まれるモジュールの名前です。あるいは、[外部コード] ノード内の関数が含まれるモジュールの数です。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. 非同期のメソッドは、多くの場合、1 つ以上の異なるスレッドで実行されます (必ずそうなるわけではありません)。The asynchronous methods are often, but not always, executed on one or more different threads. このコードは、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

[外部コード] の下にある最初の 2 つのノードは、ステート マシン クラスのコンパイラ生成メソッドです。The first two nodes under [External Code] are the compiler-generated methods of the state machine class. 3 つ目は、元のメソッドへの呼び出しです。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::MoveNext は、 GetNumberAsyncの呼び出しをラップする 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.