技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類(lèi)目錄

贊助商

最新文章

搜索

benchmarkdotnet中文介紹:功能 · 入門(mén) · 文檔

作者:admin    時(shí)間:2023-5-13 8:27:35    瀏覽:

BenchmarkDotNet可幫助你將方法轉(zhuǎn)化為基準(zhǔn)、跟蹤其性能并共享可重現(xiàn)的測(cè)量實(shí)驗(yàn)。這并不比編寫(xiě)單元測(cè)試難!在引擎蓋下,它執(zhí)行了很多保證可靠和精確結(jié)果的技能。BenchmarkDotNet可以保護(hù)你免受常見(jiàn)的基準(zhǔn)測(cè)試錯(cuò)誤的影響,并在你的基準(zhǔn)設(shè)計(jì)或獲得的測(cè)量結(jié)果出現(xiàn)問(wèn)題時(shí)向你發(fā)出警告。結(jié)果以用戶(hù)友好的形式呈現(xiàn),突出顯示有關(guān)實(shí)驗(yàn)的所有重要事實(shí)。該庫(kù)被包括 .NET Runtime 在內(nèi)的14300 多個(gè)項(xiàng)目采用,并得到 .NET Foundation 的支持。

開(kāi)始編寫(xiě)基準(zhǔn)測(cè)試很容易,查看示例:

[SimpleJob(RuntimeMoniker.Net472, baseline: true)]
[SimpleJob(RuntimeMoniker.NetCoreApp30)]
[SimpleJob(RuntimeMoniker.NativeAot70)]
[SimpleJob(RuntimeMoniker.Mono)]
[RPlotExporter]
public class Md5VsSha256
{
    private SHA256 sha256 = SHA256.Create();
    private MD5 md5 = MD5.Create();
    private byte[] data;

    [Params(1000, 10000)]
    public int N;

    [GlobalSetup]
    public void Setup()
    {
        data = new byte[N];
        new Random(42).NextBytes(data);
    }

    [Benchmark]
    public byte[] Sha256() => sha256.ComputeHash(data);

    [Benchmark]
    public byte[] Md5() => md5.ComputeHash(data);
}

BenchmarkDotNet 自動(dòng)在所有運(yùn)行時(shí)運(yùn)行基準(zhǔn)測(cè)試,匯總測(cè)量結(jié)果,并打印包含最重要信息的匯總表:

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
  [Host]       : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
  Net472       : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
  NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
  NativeAot70  : .NET 7.0.0-preview.4.22172.7, X64 NativeAOT
  Mono         : Mono 6.4.0 (Visual Studio), X64


| Method |       Runtime |     N |       Mean |     Error |    StdDev | Ratio |
|------- |-------------- |------ |-----------:|----------:|----------:|------:|
| Sha256 |    .NET 4.7.2 |  1000 |   7.735 us | 0.1913 us | 0.4034 us |  1.00 |
| Sha256 | .NET Core 3.0 |  1000 |   3.989 us | 0.0796 us | 0.0745 us |  0.50 |
| Sha256 | NativeAOT 7.0 |  1000 |   4.091 us | 0.0811 us | 0.1562 us |  0.53 |
| Sha256 |          Mono |  1000 |  13.117 us | 0.2485 us | 0.5019 us |  1.70 |
|        |               |       |            |           |           |       |
|    Md5 |    .NET 4.7.2 |  1000 |   2.872 us | 0.0552 us | 0.0737 us |  1.00 |
|    Md5 | .NET Core 3.0 |  1000 |   1.848 us | 0.0348 us | 0.0326 us |  0.64 |
|    Md5 | NativeAOT 7.0 |  1000 |   1.817 us | 0.0359 us | 0.0427 us |  0.63 |
|    Md5 |          Mono |  1000 |   3.574 us | 0.0678 us | 0.0753 us |  1.24 |
|        |               |       |            |           |           |       |
| Sha256 |    .NET 4.7.2 | 10000 |  74.509 us | 1.5787 us | 4.6052 us |  1.00 |
| Sha256 | .NET Core 3.0 | 10000 |  36.049 us | 0.7151 us | 1.0025 us |  0.49 |
| Sha256 | NativeAOT 7.0 | 10000 |  36.253 us | 0.7076 us | 0.7571 us |  0.49 |
| Sha256 |          Mono | 10000 | 116.350 us | 2.2555 us | 3.0110 us |  1.58 |
|        |               |       |            |           |           |       |
|    Md5 |    .NET 4.7.2 | 10000 |  17.308 us | 0.3361 us | 0.4250 us |  1.00 |
|    Md5 | .NET Core 3.0 | 10000 |  15.726 us | 0.2064 us | 0.1930 us |  0.90 |
|    Md5 | NativeAOT 7.0 | 10000 |  15.627 us | 0.2631 us | 0.2461 us |  0.89 |
|    Md5 |          Mono | 10000 |  30.205 us | 0.5868 us | 0.6522 us |  1.74 |

測(cè)量數(shù)據(jù)可以導(dǎo)出為不同格式(md、html、csv、xml、json 等),包括繪圖:

 
(點(diǎn)擊圖片放大)

支持的運(yùn)行時(shí): .NET 5+、.NET Framework 4.6.1+、.NET Core 2.0+、Mono、NativeAOT
支持的語(yǔ)言: C#、F#、Visual Basic
支持的操作系統(tǒng): Windows、Linux、macOS
支持的架構(gòu): x86、x64、ARM , ARM64, Wasm 和 LoongArch64

特征

BenchmarkDotNet 具有大量在綜合性能調(diào)查中必不可少的功能。四個(gè)方面定義了這些功能的設(shè)計(jì): 簡(jiǎn)單性、自動(dòng)化、可靠性和友好性。

簡(jiǎn)單

如果你想編寫(xiě)基準(zhǔn)測(cè)試,而你不是一位經(jīng)驗(yàn)豐富的性能工程師,你可以使用簡(jiǎn)單的 API 以聲明式的方式設(shè)計(jì)非常復(fù)雜的性能實(shí)驗(yàn)。

例如,如果你想?yún)?shù)化你的基準(zhǔn),標(biāo)記一個(gè)字段或一個(gè)屬性[Params(1, 2, 3)]BenchmarkDotNet 將枚舉所有指定的值并為每個(gè)案例運(yùn)行基準(zhǔn)。如果你想相互比較基準(zhǔn),請(qǐng)通過(guò)[Benchmark(Baseline = true)]將其中一個(gè)基準(zhǔn)標(biāo)記為基準(zhǔn):BenchmarkDotNet 會(huì)將其與所有其他基準(zhǔn)進(jìn)行比較。如果要比較不同環(huán)境中的性能,請(qǐng)使用jobs。例如,你可以通過(guò) [SimpleJob(RuntimeMoniker.NetCoreApp30)][SimpleJob(RuntimeMoniker.Mono)]在 .NET Core 3.0 和 Mono 上運(yùn)行所有基準(zhǔn)測(cè)試。

如果你不喜歡屬性,你可以通過(guò) fluent 風(fēng)格調(diào)用大部分 API,并編寫(xiě)如下代碼:

ManualConfig.CreateEmpty() // A configuration for our benchmarks
    .AddJob(Job.Default // Adding first job
        .WithRuntime(ClrRuntime.Net472) // .NET Framework 4.7.2
        .WithPlatform(Platform.X64) // Run as x64 application
        .WithJit(Jit.LegacyJit) // Use LegacyJIT instead of the default RyuJIT
        .WithGcServer(true) // Use Server GC
    ).AddJob(Job.Default // Adding second job
        .AsBaseline() // It will be marked as baseline
        .WithEnvironmentVariable("Key", "Value") // Setting an environment variable
        .WithWarmupCount(0) // Disable warm-up stage
    );

如果你更喜歡命令行體驗(yàn),則可以通過(guò)任何控制臺(tái)應(yīng)用程序中的控制臺(tái)參數(shù)配置基準(zhǔn)測(cè)試 (不支持其他類(lèi)型的應(yīng)用程序)。

自動(dòng)化

可靠的基準(zhǔn)測(cè)試總是包含大量樣板代碼。

讓我們考慮一下在典型情況下你應(yīng)該做什么。首先,你應(yīng)該執(zhí)行試點(diǎn)實(shí)驗(yàn)并確定最佳的方法調(diào)用次數(shù)。接下來(lái),你應(yīng)該執(zhí)行幾次預(yù)熱迭代并確保你的基準(zhǔn)測(cè)試達(dá)到穩(wěn)定狀態(tài)。之后,你應(yīng)該執(zhí)行主要迭代并計(jì)算一些基本統(tǒng)計(jì)數(shù)據(jù)。如果你在基準(zhǔn)測(cè)試中計(jì)算了一些值,你應(yīng)該以某種方式使用它來(lái)防止死代碼消除。如果你使用循環(huán),你應(yīng)該關(guān)心循環(huán)展開(kāi)對(duì)結(jié)果的影響(這可能取決于處理器架構(gòu))。獲得結(jié)果后,你應(yīng)該檢查所獲得的性能分布的一些特殊屬性,例如多模態(tài)或極高的離群值。你還應(yīng)該評(píng)估基礎(chǔ)設(shè)施的開(kāi)銷(xiāo),并從結(jié)果中扣除。

如果你從頭開(kāi)始編寫(xiě)此代碼,很容易出錯(cuò)并破壞你的測(cè)量結(jié)果。請(qǐng)注意,這是你在基準(zhǔn)測(cè)試期間應(yīng)遵循的完整清單的簡(jiǎn)化版本:還有許多其他隱藏的陷阱需要妥善處理。幸運(yùn)的是,你不必?fù)?dān)心,因?yàn)?BenchmarkDotNet會(huì)為你完成這些無(wú)聊且耗時(shí)的工作。

此外,庫(kù)可以幫助你完成一些你可能希望在調(diào)查期間執(zhí)行的高級(jí)任務(wù)。例如,BenchmarkDotNet 可以測(cè)量托管和本機(jī)內(nèi)存流量并為你的基準(zhǔn)打印反匯編列表。

可靠性

許多手寫(xiě)的基準(zhǔn)測(cè)試會(huì)產(chǎn)生錯(cuò)誤的數(shù)字,從而導(dǎo)致錯(cuò)誤的業(yè)務(wù)決策。BenchmarkDotNet 保護(hù)你免受大多數(shù)基準(zhǔn)測(cè)試陷阱的影響,并允許實(shí)現(xiàn)高測(cè)量精度。

你不應(yīng)該擔(dān)心方法調(diào)用的完美次數(shù)、預(yù)熱次數(shù)和實(shí)際迭代次數(shù):BenchmarkDotNet 嘗試選擇最佳基準(zhǔn)測(cè)試參數(shù),并在測(cè)量預(yù)測(cè)和所有基準(zhǔn)測(cè)試運(yùn)行的總持續(xù)時(shí)間之間取得良好的權(quán)衡. 所以,你不應(yīng)該使用任何幻數(shù)(比如“我們應(yīng)該在這里執(zhí)行 100 次迭代”),庫(kù)會(huì)根據(jù)統(tǒng)計(jì)指標(biāo)的值為你做這件事。

BenchmarkDotNet 還阻止對(duì)使用 DEBUG 模式構(gòu)建的未優(yōu)化程序集進(jìn)行基準(zhǔn)測(cè)試,因?yàn)橄鄳?yīng)的結(jié)果將不可靠。如果你有一個(gè)附加的調(diào)試器,如果你使用管理程序(HyperV,VMware,VirtualBox),或者如果你對(duì)當(dāng)前環(huán)境有任何其他問(wèn)題,它會(huì)打印一條警告。

在 6 年多的開(kāi)發(fā)過(guò)程中,我們遇到了許多可能會(huì)破壞你的測(cè)量結(jié)果的不同問(wèn)題。在 BenchmarkDotNet 內(nèi)部,有很多啟發(fā)式、檢查、技巧和技巧可以幫助你提高結(jié)果的可靠性。

友好

性能數(shù)據(jù)分析是一項(xiàng)耗時(shí)的活動(dòng),需要注意力、知識(shí)和經(jīng)驗(yàn)。BenchmarkDotNet 為你執(zhí)行此分析的主要部分,并以用戶(hù)友好的形式呈現(xiàn)結(jié)果。

實(shí)驗(yàn)結(jié)束后,你會(huì)得到一個(gè)匯總表,其中包含有關(guān)已執(zhí)行基準(zhǔn)測(cè)試的大量有用數(shù)據(jù)。默認(rèn)情況下,它只包含最重要的列,但可以輕松自定義。列集是自適應(yīng)的,取決于基準(zhǔn)定義和測(cè)量值。例如,如果你將其中一個(gè)基準(zhǔn)標(biāo)記為基線,你將獲得額外的列,這些列將幫助你將所有基準(zhǔn)與基線進(jìn)行比較。默認(rèn)情況下,它始終顯示均值列,但如果我們檢測(cè)到均值和中值之間存在巨大差異,則會(huì)顯示兩列。

BenchmarkDotNet 試圖找到性能分布的一些不尋常屬性并打印有關(guān)它的好消息。例如,它會(huì)在多峰分布或高異常值的情況下向你發(fā)出警告。在這種情況下,你可以向上滾動(dòng)結(jié)果并查看每個(gè)分布的 ASCII 樣式直方圖,或使用生成漂亮的 png 圖。

BenchmarkDotNet 不會(huì)讓你超載數(shù)據(jù);它僅根據(jù)你的結(jié)果顯示基本信息:它允許你為原始案例保留小的摘要,并僅為復(fù)雜案例擴(kuò)展它。當(dāng)然,你可以手動(dòng)請(qǐng)求任何其他統(tǒng)計(jì)數(shù)據(jù)和可視化。如果你不自定義摘要視圖,則默認(rèn)演示文稿將盡可能方便用戶(hù)使用。:)

誰(shuí)使用 BenchmarkDotNet?

每個(gè)人!BenchmarkDotNet 已被超過(guò)14300 個(gè)項(xiàng)目采用,包括 dotnet/performance(所有 .NET 運(yùn)行時(shí)的參考基準(zhǔn))、 dotnet/runtime(.NET 運(yùn)行時(shí)和庫(kù))、 Roslyn(C# 和 Visual Basic 編譯器)、 Mono、 ASP.NET Core , ML.NET , Entity Framework Core, PowerShell SignalR , F# , Orleans , Newtonsoft.Json , Elasticsearch.Net , Dapper , Expecto , ImageSharp , RavenDB , NodaTime、 Jint、 NServiceBus、 Serilog 、Autofac、 Npgsql、 Avalonia、 ReactiveUI、 SharpZipLib、 LiteDB 、 GraphQL for .NET、 .NET Docs、 RestSharp、 MediatR、 TensorFlow.NET、 Apache Thrift。 在 GitHub 上,你可以找到 12600 多個(gè)問(wèn)題、5200 多個(gè)提交和 1,600,000 多個(gè) 涉及 BenchmarkDotNet 的文件。

了解有關(guān)基準(zhǔn)測(cè)試的更多信息

BenchmarkDotNet 并不是神奇地使你的所有基準(zhǔn)測(cè)試正確并為你分析測(cè)量結(jié)果的靈丹妙藥。即使你使用這個(gè)庫(kù),你仍然應(yīng)該知道如何設(shè)計(jì)基準(zhǔn)實(shí)驗(yàn)以及如何根據(jù)原始數(shù)據(jù)做出正確的結(jié)論。如果你想了解更多關(guān)于基準(zhǔn)測(cè)試方法和良好實(shí)踐的信息,建議閱讀 Andrey Akinshin(BenchmarkDotNet 項(xiàng)目負(fù)責(zé)人)所著的一本書(shū):“Pro .NET Benchmarking”。使用這個(gè)深入的指南來(lái)正確設(shè)計(jì)基準(zhǔn)、測(cè)量 .NET 應(yīng)用程序的關(guān)鍵性能指標(biāo)并分析結(jié)果。本書(shū)介紹了數(shù)十個(gè)案例研究,可幫助你理解復(fù)雜的基準(zhǔn)測(cè)試主題。你將避免常見(jiàn)的陷阱,控制測(cè)量的準(zhǔn)確性。

 

構(gòu)建狀態(tài)

搭建服務(wù)器 平臺(tái) 構(gòu)建狀態(tài)
Azure Pipelines 視窗
Azure Pipelines Ubuntu
Azure Pipelines 蘋(píng)果系統(tǒng)
AppVeyor 視窗
GitHub 操作 *

歡迎投稿!

BenchmarkDotNet 已經(jīng)是一個(gè)穩(wěn)定的全功能庫(kù),可以在專(zhuān)業(yè)水平上進(jìn)行性能調(diào)查。而且還在不斷進(jìn)化!我們一直在添加新功能,但我們有太多新奇的想法。任何幫助將不勝感激。你可以開(kāi)發(fā)新功能、修復(fù)錯(cuò)誤、改進(jìn)文檔或做一些其他很酷的事情。

如果你想做出貢獻(xiàn),請(qǐng)查看貢獻(xiàn)指南和待售問(wèn)題。如果你有新想法或想抱怨錯(cuò)誤,請(qǐng)隨時(shí)創(chuàng)建一個(gè)新問(wèn)題。讓我們一起構(gòu)建最好的基準(zhǔn)測(cè)試工具!

行為守則

該項(xiàng)目采用了貢獻(xiàn)者公約定義的行為準(zhǔn)則 ,以闡明我們社區(qū)的預(yù)期行為。有關(guān)詳細(xì)信息,請(qǐng)參閱 .NET Foundation 行為準(zhǔn)則。

原文:benchmarkdotnet

x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */