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
| Method | Mean | Error | StdDev |
|---|---|---|---|
| StooTer | 384.6 ns | 7.687 ns | 9.721 ns |
这就是使用工具 BenchmarkDotNet 进行测试。
下面让我告诉大家如何入门 BenchmarkDotNet 进行测试。
首先通过 Nuget 安装 BenchmarkDotNet ,推荐使用命令行安装的方法,因为VisualStudio的速度太慢
Install-Package BenchmarkDotNet
先来写一个被测试的函数
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>();
注意需要引用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<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 probably a DEBUG configuration). Please, build it in RELEASE
单元测试
我写了一个有趣的代码,我需要在单元测试知道这个方法的性能
public class RijutorserMikede
{
public void CuserXewafeze()
{
Console.WriteLine("德熙逗比");
}
}
这时我右击解决方案新建了一个项目,注意新建的是 XUnit 项目
在控制台输入下面的命令安装 xunit.performance.api
Install-Package xunit.performance.api -Version 1.0.0-beta-build0019 -Source https://dotnet.myget.org/F/dotnet-core/api/v3/index.json
如果找不到nuget控制台,那么设置 Nuget 添加源 https://dotnet.myget.org/F/dotnet-core/api/v3/index.json
搜索 xunit performance 然后安装,如果搜索不到,点击程序包源,选择全部
安装 Microsoft.Diagnostics.Tracing.TraceEvent 在 Nuget.org 就可以找到
创建一个默认的单元测试方法
public class JeltrooWezair
{
[Fact]
public void RojallCalja()
{
}
}
这时需要把 Fact 修改为 Benchmark ,然后在函数里写代码
using JacearcairpoPunaimesowstel;
using Microsoft.Xunit.Performance;
using Xunit;
// 省略代码
[Benchmark]
public void RojallCalja()
{
foreach (var iteration in Benchmark.Iterations)
{
// Any per-iteration setup can go here.
using (iteration.StartMeasurement())
{
var nepudeSesair = new RijutorserMikede();
nepudeSesair.CuserXewafeze();
}
// ...per-iteration cleanup
}
}
现在就可以尝试使用 VisualStudio 运行,但是不要使用 Resharper 运行,因为没支持
更多请看Microsoft/xunit-performance: Provides extensions over xUnit to author performance tests.
参见:.NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono - LineZero - 博客园
使用 BenchmarkDotnet 测试代码性能 - h82258652 - 博客园
我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
C# 标准性能测试的更多相关文章
- 2019-11-29-C#-标准性能测试高级用法
title author date CreateTime categories C# 标准性能测试高级用法 lindexi 2019-11-29 10:13:16 +0800 2018-07-08 0 ...
- 2019-8-31-C#-标准性能测试高级用法
title author date CreateTime categories C# 标准性能测试高级用法 lindexi 2019-08-31 16:55:58 +0800 2018-07-08 0 ...
- C# 标准性能测试高级用法
本文告诉大家如何在项目使用性能测试测试自己写的方法 在 C# 标准性能测试 已经告诉大家如何使用 BenchmarkDotNet 测试性能,本文会告诉大家高级的用法. 建议是创建一个控制台项目用来做性 ...
- .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)——转载
原文链接:https://blog.walterlv.com/post/dotnet-high-performance-reflection-suggestions.html ***** 大家都说反射 ...
- 这一年多来,阿里Blink测试体系如何从0走向成熟?
引言 Apache Flink是面向数据流处理和批处理的分布式开源计算框架,2016年阿里巴巴引入Flink框架,改造为Blink.2017年,阿里整合了所有流计算产品,决定以Blink引擎为基础,打 ...
- .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
我们有很多种方法评估一个方法的执行耗时,比如使用性能分析工具,使用基准性能测试.不过传统的在代码中编写计时的方式依然有效,因为它可以生产环境或用户端得到真实环境下的执行耗时. 如果你希望在 .NET/ ...
- 原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...
- C# 直接创建多个类和使用反射创建类的性能
原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 10 ...
- 2019-11-29-C#-性能分析-反射-VS-配置文件-VS-预编译
原文:2019-11-29-C#-性能分析-反射-VS-配置文件-VS-预编译 title author date CreateTime categories C# 性能分析 反射 VS 配置文件 V ...
随机推荐
- 机器学习之决策树(ID3)算法与Python实现
机器学习之决策树(ID3)算法与Python实现 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...
- vue中 表头 th 合并单元格,且表格列数不定的动态渲染方法
吐槽 今天,在vue中遇到 复杂表格的渲染 ,需要合并表头th的单元格,且合并单元格的那列的表头数据是动态数据,也就是不知道会有多少个表头列,而这几个表头列还分了好几个子表头. 这个需求在js里用Ju ...
- IUAP--单点登录
登录组件: 提供统一的登录组件 身份.证明验证身份 支持多种身份标识,用户名.邮箱.手机号 支持多个域,从与得到用户响应的角色,权限进行验证用户时候能进行操作. 支持会话管理和安全管理 支持多种验证策 ...
- spark-ML之朴素贝叶斯
训练语料格式 自定义五个类别及其标签:0 运费.1 寄件.2 人工.3 改单.4 催单.5 其他业务类. 从原数据中挑选一部分作为训练语料和测试语料 建立模型测试并保存 import org.apa ...
- JQuery--动画队列以及清空队列.stop()方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 深入浅出Cocoa 之动态创建类【转】
在前文<深入浅出Cocoa之类与对象>一文中,我已经详细介绍了ObjC中的 Class 与 Object 的概念,今天我们来如何在运行 时动态创建类.下面这个函数就是应用前面讲到的Clas ...
- Directx11教程36 纹理映射(6)
原文:Directx11教程36 纹理映射(6) 本章主要是整理代码,做以下两件事情: 1.把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是 ...
- 四.使用JDBC进行批处理操作
1 create table testbatch 2 ( 3 id int primary key, 4 name varchar(20) 5 ); 在实际的项目开发中,有时候需要向数据库发送一批SQ ...
- Go语言开发教程
Go语言简述 兴起:2009年Gogle发布的第二款开源编程语言 特征: 语法简单:语法标准比较严格,适合开发人员短时间高效的服务端开发. 并发模型:Goroutine是Go最显著的特征,使用类协程的 ...
- jQuery,javascript获得网页的高度和宽度$(document).height / $(window).height
一.javascript 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: documen ...