一個基于 .NET 開源、功能全面、易于使用的性能基準測試框架
在軟件開發(fā)領域,性能基準測試是確保軟件系統高效、穩(wěn)定運行的重要環(huán)節(jié)。它可以幫助你評估應用程序的性能,了解其在不同條件下的響應時間、吞吐量、資源利用率等。通過基準測試,你可以確定系統在處理特定工作負載時的性能表現。
項目介紹
BenchmarkDotNet是一個基于.NET開源、功能全面、易于使用的性能基準測試框架,它為.NET開發(fā)者提供了強大的性能評估和優(yōu)化能力。通過自動化測試、多平臺支持、高級統計分析和自定義配置等特性,BenchmarkDotNet幫助開發(fā)者更好地理解和優(yōu)化軟件系統的性能表現。
項目特性
- 支持的語言: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。
創(chuàng)建控制臺應用
創(chuàng)建名為:BenchmarkDotNetExercise的.NET 9控制臺應用。
安裝 NuGet 包
在NuGet包管理器中搜索:BenchmarkDotNet 包進行安裝:
進行性能基準測試
接下來我們對.NET中常見的三種加密哈希函數:MD5、SHA256、SHA1進行性能基準測試,來一起分析一下哪一種哈希算法性能更優(yōu)、效率更快。
(1) HashFunctionsBenchmark
[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>();
}
}
注意一定要設置為:Release模式運行,假如為Debug模式會提示下面異常:
// 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) 分析生成的報告
說明:
- Mean: 所有測量值的算術平均值。
- Error: 99.9% 置信區(qū)間的一半。
- StdDev: 所有測量值的標準差。
- Gen0: 第 0 代 GC 每 1000 次操作收集一次。
- Gen1: 第 1 代 GC 每 1000 次操作收集一次。
- Gen2: 第 2 代 GC 每 1000 次操作收集一次。
- Allocated: 每次操作分配的內存(僅托管內存,包含所有內容,1KB = 1024B)。
- 1 ms: 1 毫秒(0.001 秒)。
報告分析:
Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
MD5Hash | 1.952 ms | 0.0169 ms | 0.0158 ms | 197.2656 | 197.2656 | 197.2656 | 976.9 KB |
SHA256Hash | 3.907 ms | 0.0157 ms | 0.0147 ms | 195.3125 | 195.3125 | 195.3125 | 976.93 KB |
SHA1Hash | 1.780 ms | 0.0231 ms | 0.0193 ms | 197.2656 | 197.2656 | 197.2656 | 976.92 KB |
- MD5Hash 的平均耗時稍長于 SHA1Hash,但誤差和標準差較小,性能穩(wěn)定性較好,垃圾回收次數與 SHA1Hash 相同。
- SHA256Hash 的平均耗時最長,但誤差和標準差最小,性能穩(wěn)定性最好,垃圾回收次數略少于 MD5Hash 和 SHA1Hash。
- SHA1Hash 的平均耗時最短,但誤差和標準差較大,表示其性能雖然優(yōu)越但不太穩(wěn)定。
性能測試多種格式輸出
- MarkdownExporter:導出Markdown格式。
- AsciiDocExporter:導出AsciiDoc格式。
- HtmlExporter:導出HTML格式。
- CsvExporter:導出CSV(逗號分隔值)格式。
- RPlotExporter:導出R繪圖文件格式。
[MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter]
public class HashFunctionsBenchmark
{
}
項目源碼地址
更多項目實用功能和特性歡迎前往項目開源地址查看??,別忘了給項目一個Star支持??。
- 開源地址:https://github.com/dotnet/BenchmarkDotNet
- 文章示例:https://github.com/YSGStudyHards/DotNetExercises/tree/master/BenchmarkDotNetExercise