プロファイリング ツールを使用して、Visual Studio で BenchmarkDotNet データを収集して表示できます。 BenchmarkDotNet は、パフォーマンス ベンチマーク用に設計されたオープンソースの .NET ライブラリです。 .NET コードの実行時間、メモリ使用量、その他のパフォーマンス メトリックを、信頼性の高い反復可能な方法で測定および比較するプロセスを自動化します。
BenchmarkDotNet を使用するには、プロジェクトに必要な NuGet パッケージをインストールし、関心のあるパフォーマンス情報の種類に一致する属性をコードに追加します。
[前提条件]
Visual Studio 2022 バージョン 17.9 以降
ベンチマーク プロジェクトには、次の 2 つの NuGet パッケージを含める必要があります。
Benchmark プロジェクト テンプレートを使用する場合は、プロジェクトの作成時にこれらの NuGet パッケージが存在します。
プロジェクトの設定
ベンチマーク属性は、.NET コンソール アプリケーションに追加する必要があります。 属性は、他のプロジェクトの種類を参照するラッパー関数に追加できます。
BenchmarkDotNet サポート用にプロジェクトを準備するには、次のいずれかの方法を使用します。
既存のコンソール プロジェクトを開くか、新しいコンソール プロジェクトを作成します。 このシナリオでは、BenchmarkDotNet のサポートを手動で追加します。
ベンチマーク プロジェクト テンプレートを使用します。 この記事で説明する手順の一部は、BenchmarkDotNet サポートを手動で追加する場合にのみ必要です。
Benchmark Project テンプレートは、CPU 使用率プロファイルと Copilot 分析情報の組み込みサポートを備えた完全に統合された BenchmarkDotNet プロジェクトを生成します。 テンプレートを使用するには、新しいプロジェクトを作成するときにプロジェクトの種類の一覧から [プロファイル ] を選択し、[ ベンチマーク プロジェクト] を選択します。 属性の詳細については、「コードの 属性」を参照してください。
コンソール プロジェクトを作成するか、既存のコンソール プロジェクトを使用します。
ベンチマーク属性は、.NET コンソール アプリケーションに追加する必要があります。 属性は、他のプロジェクトの種類を参照するラッパー関数に追加できます。
コードの属性を設定する
BenchmarkDotNet 診断ツールを属性としてベンチマーク クラスに追加する場合は、ベンチマークの実行後に .diagsession ファイルを生成するようにアプリを構成します。 その後、Visual Studio で .diagsession ファイルを開き、ベンチマークのプロファイル データを表示できます。
次の診断機能がサポートされています。
- CPUUsageDiagnoser
- データベース診断ツール
- DotNetCountersDiagnoser
- EventsDiagnoser
- FileIODiagnoser
各診断ツールは、その診断に関連するパフォーマンス データを生成します。 たとえば、CPUUsageDiagnoser は CPU データを含む .diagsession ファイルを生成し、DatabaseDiagnoser はデータベース操作のデータを含む .diagsession ファイルを生成します。 制限は、関連付けられているプロファイリング ツールに対応します。 たとえば、プロファイラーのデータベース ツールは 、ADO.NET または Entity Framework Core で動作します。
診断とベンチマークのコードを属性化するには:
診断者名を属性として、データを生成するベンチマークを含むクラスに追加します。
Benchmark属性を、パフォーマンスをテストするメソッドに追加します。たとえば、CPUUsageDiagnoser には次のコードを使用できます。
ベンチマーク プロジェクト テンプレートを使用している場合は、テンプレートにサンプル コードが既に用意されています。 BenchmarkDotNet サポートを手動で追加する場合は、次のコード例を使用できます。
using System; using System.Security.Cryptography; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using Microsoft.VSDiagnostics; namespace MyBenchmarks { [CPUUsageDiagnoser] public class Md5VsSha256 { private const int N = 10000; private readonly byte[] data; private readonly SHA256 sha256 = SHA256.Create(); private readonly MD5 md5 = MD5.Create(); public Md5VsSha256() { data = new byte[N]; new Random(42).NextBytes(data); } [Benchmark] public byte[] Sha256() => sha256.ComputeHash(data); [Benchmark] public byte[] Md5() => md5.ComputeHash(data); } public class Program { public static void Main(string[] args) { var summary = BenchmarkRunner.Run(typeof(Program).Assembly); } } }
Benchmark.NET データを収集して表示する
ビルドをデバッグ ビルドではなくリリース ビルドに設定します。
アプリケーションを実行して .diagsession ファイルを 生成します。
コンソール出力を確認して、ファイルの場所を取得します。 例えば次が挙げられます。
// * Diagnostic Output - VSDiagnosticsDiagnoser * Collection result moved to 'BenchmarkDotNet_Md5VsSha256_20231218_123326.diagsession'. Session : {7f38bcc2-c692-4266-aa24-b12bc5325ea4} Stopped Exported diagsession file: *.diagsessionVisual Studio で、[ ファイル] > [ファイル > 開く ] を選択し、 .diagsession ファイルの場所に移動して、ファイルを選択して開きます。
BenchmarkDotNet ベンチマークのデータを表示するには、[ベンチマーク] タブを選択します。
[ ベンチマーク ] タブの結果の詳細については、 BenchmarkDotNet のドキュメントを参照してください。
結果の行を右クリックし、[ 時間範囲の選択 ] を選択してタイムライン グラフをベンチマークと同期します。
[CPU 使用率] や [割り当て] など、使用可能なタブのいずれかを選択します。
データの収集に使用した診断ツールに応じて、メモリの割り当て、CPU 使用率、カウンター、その他のパフォーマンス データに関連する分析情報を得ることができます。 メモリ割り当てを分析するには、[ MemoryDiagnoser ] 属性を追加して、組み込みの MemoryDiagnoser を使用します。 詳細については、 診断を参照してください。
注
プロファイラーでは、この記事で前述した [MemoryDiagnoser] と診断ツールのみがサポートされています。
プロファイラーを使用してメモリの割り当てを分析する例については、 Visual Studio Profiler でのベンチマークに関するブログ記事を参照してください。
CPU 使用率などの他のタブに関連するデータを分析するには、プロファイリング ドキュメントの対応する記事を参照してください。
Copilot を使用して最適化する
CodeLens を使用して、エディターから直接 BenchmarkDotNet ベンチマークの CPU とメモリ割り当ての最適化をトリガーできます。 これにより、パフォーマンス チューニングのアクセシビリティが向上し、シームレスになり、コードを記述する場所で CPU とメモリの割り当ての問題を見つけて修正できます。
ベンチマークの上にある CodeLens インジケーターを選択し、 Copilot で割り当てを最適化するオプションを選択します。