詳解如何使用BenchmarkDotNet對.NET代碼進(jìn)行性能基準(zhǔn)測試
前言
在軟件開發(fā)領(lǐng)域,性能基準(zhǔn)測試是確保軟件系統(tǒng)高效、穩(wěn)定運(yùn)行的重要環(huán)節(jié)。它可以幫助你評估應(yīng)用程序的性能,了解其在不同條件下的響應(yīng)時間、吞吐量、資源利用率等。通過基準(zhǔn)測試,你可以確定系統(tǒng)在處理特定工作負(fù)載時的性能表現(xiàn)。
項(xiàng)目介紹
BenchmarkDotNet是一個基于.NET開源、功能全面、易于使用的性能基準(zhǔn)測試框架,它為.NET開發(fā)者提供了強(qiáng)大的性能評估和優(yōu)化能力。通過自動化測試、多平臺支持、高級統(tǒng)計(jì)分析和自定義配置等特性,BenchmarkDotNet幫助開發(fā)者更好地理解和優(yōu)化軟件系統(tǒng)的性能表現(xiàn)。
項(xiàng)目特性
- 支持的語言:C#、F#、Visual Basic。
- 支持的操作系統(tǒng):Windows、Linux、macOS。
- 支持的架構(gòu):x86、x64、ARM、ARM64、Wasm 和 LoongArch64。
- 支持的運(yùn)行時:.NET 5+、.NET Framework 4.6.1+、.NET Core 3.1+、Mono、NativeAOT。
創(chuàng)建控制臺應(yīng)用
創(chuàng)建名為:BenchmarkDotNetExercise
的.NET 9控制臺應(yīng)用。
安裝 NuGet 包
在NuGet包管理器中搜索:BenchmarkDotNet
包進(jìn)行安裝:
進(jìn)行性能基準(zhǔn)測試
接下來我們對.NET中常見的三種加密哈希函數(shù):MD5
、SHA256
、SHA1
進(jìn)行性能基準(zhǔn)測試,來一起分析一下哪一種哈希算法性能更優(yōu)、效率更快。
HashFunctionsBenchmark
[MemoryDiagnoser]//記錄內(nèi)存分配情況 public class HashFunctionsBenchmark { private readonly string _inputData; public HashFunctionsBenchmark() { // 使用一個較長的字符串作為輸入,以更好地反映哈希函數(shù)的性能 _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)); } } }
運(yùn)行基準(zhǔn)測試
internal class Program { static void Main(string[] args) { var summary = BenchmarkRunner.Run<HashFunctionsBenchmark>(); } }
注意一定要設(shè)置為:Release
模式運(yùn)行,假如為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.
分析生成的報(bào)告
說明
- Mean: 所有測量值的算術(shù)平均值。
- Error: 99.9% 置信區(qū)間的一半。
- StdDev: 所有測量值的標(biāo)準(zhǔn)差。
- Gen0: 第 0 代 GC 每 1000 次操作收集一次。
- Gen1: 第 1 代 GC 每 1000 次操作收集一次。
- Gen2: 第 2 代 GC 每 1000 次操作收集一次。
- Allocated: 每次操作分配的內(nèi)存(僅托管內(nèi)存,包含所有內(nèi)容,1KB = 1024B)。
- 1 ms: 1 毫秒(0.001 秒)。
報(bào)告分析
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,但誤差和標(biāo)準(zhǔn)差較小,性能穩(wěn)定性較好,垃圾回收次數(shù)與 SHA1Hash 相同。
SHA256Hash 的平均耗時最長,但誤差和標(biāo)準(zhǔn)差最小,性能穩(wěn)定性最好,垃圾回收次數(shù)略少于 MD5Hash 和 SHA1Hash。
SHA1Hash 的平均耗時最短,但誤差和標(biāo)準(zhǔn)差較大,表示其性能雖然優(yōu)越但不太穩(wěn)定。
性能測試多種格式輸出
MarkdownExporter:導(dǎo)出Markdown格式。
AsciiDocExporter:導(dǎo)出AsciiDoc格式。
HtmlExporter:導(dǎo)出HTML格式。
CsvExporter:導(dǎo)出CSV(逗號分隔值)格式。
RPlotExporter:導(dǎo)出R繪圖文件格式。
[MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter] public class HashFunctionsBenchmark { }
到此這篇關(guān)于詳解如何使用BenchmarkDotNet對.NET代碼進(jìn)行性能基準(zhǔn)測試的文章就介紹到這了,更多相關(guān)BenchmarkDotNet .NET代碼性能基準(zhǔn)測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C#設(shè)置Excel數(shù)據(jù)自適應(yīng)行高、列寬的2種情況
這篇文章主要介紹了C#設(shè)置Excel數(shù)據(jù)自適應(yīng)行高、列寬的2種情況,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04解決C# 截取當(dāng)前程序窗口指定位置截圖的實(shí)現(xiàn)方法
本篇文章是對C#中截取當(dāng)前程序窗口指定位置截圖的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05