この記事は、インテル® デベロッパー・ゾーンに公開されている『Intel® VTune™ Profiler Performance Analysis Cookbook』の「Profiling a .NET* Core Application」日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
このレシピは、インテル® VTune™ Amplifier を使用して .NET Core ダイナミックコードをプロファイルし、マネージドコードの hotspot を特定してパフォーマンスが向上するようにアプリケーションを最適化します。
コンテンツ・エキスパート: Denis Pravdin (英語)
使用するもの
以下は、パフォーマンス解析シナリオで使用するハードウェアとソフトウェアのリストです。
- アプリケーション: 整数リストのすべての要素を加算するサンプル C# アプリケーション。このアプリケーションはデモ用であり、ダウンロードすることはできません。
- ツール:
- インテル® VTune™Amplifier 2018
注
- インテル® VTune™ プロファイラー評価版のダウンロードと製品サポートについては、https://www.isus.jp/intel-vtune-amplifier-xe/ を参照してください。
- このクックブックのレシピはすべてスケーラブルであり、インテル® VTune™ Amplifier 2018 以降に適用できます。バージョンにより設定がわずかに異なることがあります。
- ベータ版インテル® oneAPI ベース・ツールキット向けのバージョンから、インテル® VTune™ Amplifier の名称がインテル® VTune™ プロファイラーに変わりました。引き続き、インテル® Parallel Studio XE またはインテル® System Studio のコンポーネントとして、あるいはスタンドアロン版のインテル® VTune™ プロファイラーをご利用いただけます。
- .NET Core 2.0 SDK (英語)
- インテル® VTune™Amplifier 2018
- オペレーティング・システム: Microsoft* Windows* 10
- CPU: インテル® プロセッサー (開発コード名 Skylake)
アプリケーションを準備する
- .NET 環境変数が設定された新しいコマンドウィンドウを開き、.NET Core 2.0 が正しくインストールされていることを確認します。
dotnet --version
- アプリケーションの新しい listadd ディレクトリーを作成します。
mkdir C:\listadd > cd C:\listadd
- dotnet new console と入力して、次の構造の新しいスケルトン・プロジェクトを作成します。
- listadd フォルダーの Program.cs の内容を、整数リストの要素を加算する C# コードに変更します。
using System; using System.Linq; using System.Collections.Generic; namespace listadd { class Program { static void Main(string[] args) { Console.WriteLine("Starting calculation..."); List<int> numbers = Enumerable.Range(1,10000).ToList(); for (int i =0; i < 100000; i ++) { ListAdd(numbers); } Console.WriteLine("Calculation complete"); } static int ListAdd(List<int> candidateList) { int result = 0; foreach (int item in candidateList) { result += item; } return result; } } }
- listadd.csproj ファイルの PropertyGroup セクションに <DebugType>pdbonly</DebugType> フラグを追加してインテル® VTune™ Amplifier のソースコード解析を有効にします。
- C:\listadd\bin\Release\netcoreapp2.0 フォルダーに listadd.dll を作成します。
dotnet build -c Release
- サンプル・アプリケーションを実行します。
dotnet C:\listadd\bin\Release\netcoreapp2.0\listadd.dll
高度な hotspot 解析を実行する
- 管理者権限でインテル® VTune™ Amplifier を起動します。
- ツールバーの [New Project (新規プロジェクト)] ボタンをクリックして、新規プロジェクトの名前 (例: dotnet) を指定します。
- [Analysis Target (解析ターゲット)] ウィンドウで、左ペインから [local host (ローカルホスト)] および [Launch Application (アプリケーションを起動)] ターゲットタイプを選択します。
- [Launch Application (アプリケーションを起動)] ペインで、解析するアプリケーションを指定します。
- アプリケーション: C:\Program Files\dotnet\dotnet.exe
- アプリケーションのパラメーター: C:\listadd\bin\Release\netcoreapp2.0\listadd.dll
注
dotnet.exe の場所は環境変数に依存します。where dotnet コマンドを使用して確認できます。 - 右の [Choose Analysis (解析の選択)] ボタンをクリックして、左ペインから [Advanced Hotspots (高度な hotspot)] 解析を選択します。
注
高度な hotspot 解析は、インテル® VTune™ Amplifier 2019 で汎用の hotspot 解析に統合されました。ハードウェア・イベントベース・サンプリング収集モードで利用できます。 - [Start (開始)] をクリックして解析を開始します。
マネージドコードの hotspot を特定する
収集した解析結果が表示されたら、[Bottom-up (ボトムアップ)] タブに切り替えて [Process/Module/
Function/Thread/Call Stack (プロセス/モジュール/関数/スレッド/コールスタック)] グループを選択します。
dotnet.exe > listadd.dll を展開して、最も CPU 時間がかかっているマネージド listadd::Program::ListAdd 関数を見つけます。
この hotspot 関数をダブルクリックして [Source (ソース)] ビューを開きます。ソースと逆アセンブルしたコードを並べて表示するには、ツールバーの [Assembly (アセンブリー)] ボタンをクリックします。
ソース行/アセンブリー命令ごとの統計を使用して、最も時間を費やしているコード部分 (上記の例では行 24) を特定します。
ループ交換を使用してコードを最適化する
インテル® VTune™ Amplifier は、次のコード行をパフォーマンス・クリティカルとしてハイライトします。
foreach (int item in candidateList)
for ループ文を使用してコードを最適化します。Program.cs の内容を次のように変更します。
using System; using System.Linq; using System.Collections.Generic; namespace listadd { class Program { static void Main(string[] args) { Console.WriteLine("Starting calculation..."); List<int> numbers = Enumerable.Range(1,10000).ToList(); for (int i =0; i < 100000; i ++) { ListAdd(numbers); } Console.WriteLine("Calculation complete"); } static int ListAdd(List<int> candidateList) { int result = 0; for (int i = 0; i < candidateList.Count; i++) { result += candidateList[i]; } return result; } } }
最適化を確認する
更新したコードの最適化を確認するため、高度な hotspot 解析を再度実行します。
最適化前は、サンプル・アプリケーションの CPU 時間は 2.636 秒でした。
最適化後は、サンプル・アプリケーションの CPU 時間が 0.945 秒になり、オリジナルから約 64% パフォーマンスが向上しました。
注
このレシピの情報は、https://software.intel.com/en-us/forums/intel-vtune-amplifier-xe/topic/747599 を参照してください。
関連情報
- .NET コード解析 (英語)