.NET Core アプリケーションのプロファイル

インテル® VTune™ プロファイラー

この記事は、インテル® デベロッパー・ゾーンに公開されている『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 (英語)
  • オペレーティング・システム: Microsoft* Windows* 10
  • CPU: インテル® プロセッサー (開発コード名 Skylake)

アプリケーションを準備する

  1. .NET 環境変数が設定された新しいコマンドウィンドウを開き、.NET Core 2.0 が正しくインストールされていることを確認します。
    dotnet --version
  2. アプリケーションの新しい listadd ディレクトリーを作成します。
    mkdir C:\listadd
    > cd C:\listadd
  3. dotnet new console と入力して、次の構造の新しいスケルトン・プロジェクトを作成します。

  4. 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;
            }
        }
    }
  5. listadd.csproj ファイルの PropertyGroup セクションに <DebugType>pdbonly</DebugType> フラグを追加してインテル® VTune™ Amplifier のソースコード解析を有効にします。
  6. C:\listadd\bin\Release\netcoreapp2.0 フォルダーに listadd.dll を作成します。
    dotnet build -c Release
  7. サンプル・アプリケーションを実行します。
    dotnet C:\listadd\bin\Release\netcoreapp2.0\listadd.dll

高度な hotspot 解析を実行する

  1. 管理者権限でインテル® VTune™ Amplifier を起動します。
  2. ツールバーの [New Project (新規プロジェクト)] ボタンをクリックして、新規プロジェクトの名前 (例: dotnet) を指定します。
  3. [Analysis Target (解析ターゲット)] ウィンドウで、左ペインから [local host (ローカルホスト)] および [Launch Application (アプリケーションを起動)] ターゲットタイプを選択します。
  4. [Launch Application (アプリケーションを起動)] ペインで、解析するアプリケーションを指定します。
    • アプリケーション: C:\Program Files\dotnet\dotnet.exe
    • アプリケーションのパラメーター: C:\listadd\bin\Release\netcoreapp2.0\listadd.dll


    dotnet.exe の場所は環境変数に依存します。where dotnet コマンドを使用して確認できます。

  5. 右の [Choose Analysis (解析の選択)] ボタンをクリックして、左ペインから [Advanced Hotspots (高度な hotspot)] 解析を選択します。


    高度な hotspot 解析は、インテル® VTune™ Amplifier 2019 で汎用の hotspot 解析に統合されました。ハードウェア・イベントベース・サンプリング収集モードで利用できます。

  6. [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 を参照してください。

関連情報

インテル® VTune™ プロファイラー・パフォーマンス解析クックブックのトップに戻る

タイトルとURLをコピーしました