DUICUO

.NET ベースでオープン ソース、機能豊富、使いやすいパフォーマンス ベンチマーク フレームワークです。

ソフトウェア開発の分野において、パフォーマンスベンチマークは、ソフトウェアシステムの効率的かつ安定した運用を確保するための重要なステップです。これは、アプリケーションのパフォーマンスを評価し、様々な条件下での応答時間、スループット、リソース使用率などの指標を理解するのに役立ちます。ベンチマークを通じて、特定のワークロードを処理する際のシステムパフォーマンスを判断できます。

プロジェクト紹介

BenchmarkDotNetは、.NETベースのオープンソースで包括的、かつ使いやすいパフォーマンスベンチマークフレームワークです。.NET開発者に強力なパフォーマンス評価および最適化機能を提供します。自動テスト、マルチプラットフォームサポート、高度な統計分析、カスタマイズ可能な設定などの機能を通じて、BenchmarkDotNetは開発者がソフトウェアシステムのパフォーマンスをより深く理解し、最適化できるよう支援します。

プロジェクトの特徴

  • サポートされている言語: C#、F#、Visual Basic。
  • サポートされているオペレーティング システム: Windows、Linux、macOS。
  • サポートされているアーキテクチャ: x86、x64、ARM、ARM64、Wasm、LoongArch64。
  • サポートされているランタイム: .NET 5+、.NET Framework 4.6.1+、.NET Core 3.1+、Mono、NativeAOT。

コンソールアプリケーションを作成する

BenchmarkDotNetExercise という名前の .NET 9 コンソール アプリケーションを作成します。

NuGet パッケージをインストールする

NuGet パッケージ マネージャーで BenchmarkDotNet パッケージを検索してインストールします。

パフォーマンスベンチマークテストを実施する

次に、.NET の一般的な 3 つの暗号化ハッシュ関数 (MD5、SHA256、SHA1) のパフォーマンス ベンチマーク テストを実施し、どのハッシュ アルゴリズムのパフォーマンスと効率が優れているかを分析します。

(1) ハッシュ関数ベンチマーク

 [MemoryDiagnoser]//记录内存分配情况public class HashFunctionsBenchmark { private readonly string _inputData; public HashFunctionsBenchmark() { // 使用一个较长的字符串作为输入,以更好地反映哈希函数的性能_inputData = new string('y', 1000000); } [Benchmark] public byte[] MD5Hash() { using (MD5 md5 = MD5.Create()) { return md5.ComputeHash(Encoding.UTF8.GetBytes(_inputData)); } } [Benchmark] public byte[] SHA256Hash() { using (SHA256 sha256 = SHA256.Create()) { return sha256.ComputeHash(Encoding.UTF8.GetBytes(_inputData)); } } [Benchmark] public byte[] SHA1Hash() { using (SHA1 sha1 = SHA1.Create()) { return sha1.ComputeHash(Encoding.UTF8.GetBytes(_inputData)); } } }

(2)ベンチマークテストを実行する

 internal class Program { static void Main(string[] args) { var summary = BenchmarkRunner.Run<HashFunctionsBenchmark>(); } }

ゲームはリリースモードで実行する必要があります。デバッグモードで実行すると、以下のエラーが発生します。

 // Validating benchmarks: // * Assembly BenchmarkDotNetExercise which defines benchmarks is non-optimized Benchmark was built without optimization enabled (most probably a DEBUG configuration). Please, build it in RELEASE. If you want to debug the benchmarks, please see https://benchmarkdotnet.org/articles/guides/troubleshooting.html#debugging-benchmarks.

(3)生成されたレポートを分析する

例:

  • 平均: すべての測定値の算術平均。
  • エラー: 99.9% 信頼区間の半分。
  • StdDev: すべての測定値の標準偏差。
  • Gen0: 世代 0 の GC は 1000 回の操作ごとに 1 回実行されます。
  • Gen1: 第 1 世代の GC は 1000 回の操作ごとに 1 回実行されます。
  • Gen2: 第 2 世代 GC は、1000 回の操作ごとにデータを収集します。
  • 割り当て済み: 各操作に割り当てられたメモリ (管理対象メモリのみ、すべてのコンテンツを含む、1 KB = 1024 B)。
  • 1 ms: 1 ミリ秒 (0.001 秒)。

レポート分析:

方法

平均

エラー

標準偏差

世代0

第1世代

第2世代

割り当てられた

MD5ハッシュ

1.952ミリ秒

0.0169ミリ秒

0.0158ミリ秒

197.2656

197.2656

197.2656

976.9 KB

SHA256ハッシュ

3.907ミリ秒

0.0157ミリ秒

0.0147ミリ秒

195.3125

195.3125

195.3125

976.93 KB

SHA1ハッシュ

1.780ミリ秒

0.0231ミリ秒

0.0193ミリ秒

197.2656

197.2656

197.2656

976.92 KB

  • MD5Hash は平均すると SHA1Hash よりもわずかに時間がかかりますが、エラーと標準偏差が小さく、パフォーマンスの安定性が高く、ガベージ コレクションの回数は SHA1Hash と同じです。
  • SHA256Hash は平均実行時間が最も長いですが、エラーと標準偏差が最も小さく、パフォーマンスの安定性が最も高く、MD5Hash や SHA1Hash よりもガベージ コレクションがわずかに少なくなります。
  • SHA1Hash は平均実行時間が最も短いですが、誤差と標準偏差が比較的大きく、パフォーマンスは優れているもののあまり安定していないことがわかります。

複数の形式でのパフォーマンステスト出力

  • MarkdownExporter: Markdown 形式でエクスポートします。
  • AsciiDocExporter: AsciiDoc 形式にエクスポートします。
  • HtmlExporter: HTML 形式でエクスポートします。
  • CsvExporter: CSV (カンマ区切り値) 形式でエクスポートします。
  • RPlotExporter: R プロット ファイル形式をエクスポートします。
 [MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter] public class HashFunctionsBenchmark { } 

プロジェクトのソースコードアドレス

プロジェクトのより便利な機能や機能については、プロジェクトのオープンソース アドレス 👀 にアクセスしてください。また、プロジェクトにスターを付けてサポートを示すこともお忘れなく 💖 ください。

  • オープンソースアドレス: https://github.com/dotnet/BenchmarkDotNet
  • サンプル記事: https://github.com/YSGStudyHards/DotNetExercises/tree/master/BenchmarkDotNetExercise