1. 程式人生 > >本文告訴大家如何使用 benchmarkdotnet 做測試

本文告訴大家如何使用 benchmarkdotnet 做測試

成熟 std which define runner AI optimize attach logic

經常我寫一個類,作為一個工具類,小夥伴會問我這個類的性能,這時我就需要一個標準的工具進行測試。

本文告訴大家如何使用 benchmarkdotnet 做測試

現在在 github 提交代碼,如果有小夥伴想要知道某個函數的性能,就會用 BenchmarkDotNet 進行測試。

例如我有一個函數 StooTer ,我定義這個函數的性能是非常高,我需要告訴大家在什麽的設備運行,但是因為每個人的寫法不一樣,所以就比較難看。而且誰也不知道你是如何測試,也許使用 StopWatch 或 DateTime 來測試。

但是在 github 經常可以看到下面的測試


BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
Intel Core i7-6700 CPU 3.40GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=2.1.201
  [Host]     : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT  [AttachedDebugger]
  DefaultJob : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT

MethodMeanErrorStdDev
StooTer 384.6 ns 7.687 ns 9.721 ns

這就是使用工具 BenchmarkDotNet 進行測試。

下面讓我告訴大家如何入門 BenchmarkDotNet 進行測試。

首先通過 Nuget 安裝 BenchmarkDotNet ,推薦使用命令行安裝的方法,因為VisualStudio的速度太慢

Install-Package BenchmarkDotNet
  • 1

先來寫一個被測試的函數

    public class Foo
    {
        [Benchmark]
        public void StooTer()
        {
            var seenoserBojemchay = new Foo[1000];
            var sowrornarLeedeLeetall = new Span<Foo>(seenoserBojemchay, 10, 100);
            foreach (var temp in sowrornarLeedeLeetall)
        

在被測試的函數上面加上特性 Benchmark ,註意引用using BenchmarkDotNet.Attributes才可以這樣寫

函數用了 Span ,請看C# Span 入門

現在可以在 Main 函數使用下面代碼進行測試

            var boKar = BenchmarkRunner.Run<Foo>(www.yongshiyule178.com);
  • 1

註意需要引用using BenchmarkDotNet.Running,並且在 Release 運行

運行的時候就可以看到顯示很多測試,而且從輸入的文件夾還可以找到這樣的文件,這個文件放在 $(bin)Release\$(TargetFramework)\BenchmarkDotNet.Artifacts\

文件夾,直接打開就可以找到

技術分享圖片

這時看到的就是標準的測試,可以把這個測試告訴小夥伴

那麽這個輸出表格是什麽意思,例如測試了 Csdn 方法,這時的輸出表格請看下面

MethodMeanErrorStdDev
Csdn 384.6 ns 7.687 ns 9.721 ns

Mean 的意思是 Arithmetic mean of all measurements 所有測量的算術平均值

Error 的意思是 Half of 99.9% confidence interval 99.9% 一半的置信度區間

StdDev 是所有測量的標準偏差

在測試過程包括

Pilot: 決定運行幾次。

IdleWarmup, IdleTarget:評估BenchmarkDotNet這個工具帶來的額外開銷。

MainWarmup:測試熱身。

MainTarget:測試。

Result:測試結果減去BenchmarkDotNet帶來的額外開銷。

除了方法可以測試,靜態方法也可以測試,使用方法和上面一樣

    public class Foo
    {
        [Benchmark]
        public static void StooTer(www.huachengj1980.com/)
        {
            var seenoserBojemchay = new www.huarenyl.cn Foo[1000];
            var sowrornarLeedeLeetall = new Span<Foo>(seenoserBojemchay, 10, 100);
            foreach (var temp in sowrornarLeedeLeetall)
   

如果在運行出現下面輸出,那麽請檢查是否在 Release 運行,右擊項目屬性看是否開啟優化代碼

Validating benchmarks:
Assembly MerRear which defines benchmarks is non-optimized
Benchmark was built without optimization enabled (most www.cmeidi.cn probably a DEBUG configuration).www.078881.cn Please, build it in RELEASE

參見:.NET Core性能測試組件BenchmarkDotNet 支持.NET Framework Mono - LineZero - 博客園

用BenchmarkDotNet給C#程序做性能測試

我搭建了自己的博客 https://lindexi.gitee.io/ 歡迎大家訪問,裏面有很多新的博客。只有在我看到博客寫成熟之後才會放在csdn或博客園,但是一旦發布了就不再更新

本文告訴大家如何使用 benchmarkdotnet 做測試