C# 标准性能测试

2 篇文章 0 订阅

转载主要为了方便查找,复制的格式有点问题,建议直接看原文,原文链接:https://blog.csdn.net/lindexi_gd/article/details/80733217

知识共享许可协议
本作品采用Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)进行许可。原文作者:林德熙(链接:http://blog.csdn.net/lindexi_gd )。

经常我写一个类,作为一个工具类,小伙伴会问我这个类的性能,这时我就需要一个标准的工具进行测试。

本文告诉大家如何使用 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
Method Mean Error StdDev
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(seenoserBojemchay, 10, 100);
foreach (var temp in sowrornarLeedeLeetall)
{

    }
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
2
1
注意需要引用using BenchmarkDotNet.Running,并且在 Release 运行

运行的时候就可以看到显示很多测试,而且从输入的文件夹还可以找到这样的文件,这个文件放在 $(bin)Release\$(TargetFramework)\BenchmarkDotNet.Artifacts\ 文件夹,直接打开就可以找到

这时看到的就是标准的测试,可以把这个测试告诉小伙伴

那么这个输出表格是什么意思,例如测试了 Csdn 方法,这时的输出表格请看下面

Method Mean Error StdDev
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()
{
var seenoserBojemchay = new Foo[1000];
var sowrornarLeedeLeetall = new Span(seenoserBojemchay, 10, 100);
foreach (var temp in sowrornarLeedeLeetall)
{

    }
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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#程序做性能测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值