當前位置:
首頁 > 知識 > C 標準性能測試

C 標準性能測試

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

本文告訴大家如何使用 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
1
2
3
4
5
6
7
8

MethodMeanErrorStdDevStooTer384.6 ns7.687 ns9.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)
{
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

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

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

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

var boKar = BenchmarkRunner.Run<Foo>();
1

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

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

C 標準性能測試

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

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

MethodMeanErrorStdDevCsdn384.6 ns7.687 ns9.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()
{
var seenoserBojemchay = new Foo[1000];
var sowrornarLeedeLeetall = new Span<Foo>(seenoserBojemchay, 10, 100);
foreach (var temp in sowrornarLeedeLeetall)
{
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13

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

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

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

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

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

base64加密的解密
教你編寫一個手勢解鎖控制項

TAG:程序員小新人學習 |