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

本文告诉大家如何使用 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.

课件:https://r302.cc/5W9GVK

参见:.NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono - LineZero - 博客园

用BenchmarkDotNet给C#程序做性能测试

使用 BenchmarkDotnet 测试代码性能 - h82258652 - 博客园

C# 标准性能测试高级用法

我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

C# 标准性能测试的更多相关文章

  1. 2019-11-29-C#-标准性能测试高级用法

    title author date CreateTime categories C# 标准性能测试高级用法 lindexi 2019-11-29 10:13:16 +0800 2018-07-08 0 ...

  2. 2019-8-31-C#-标准性能测试高级用法

    title author date CreateTime categories C# 标准性能测试高级用法 lindexi 2019-08-31 16:55:58 +0800 2018-07-08 0 ...

  3. C# 标准性能测试高级用法

    本文告诉大家如何在项目使用性能测试测试自己写的方法 在 C# 标准性能测试 已经告诉大家如何使用 BenchmarkDotNet 测试性能,本文会告诉大家高级的用法. 建议是创建一个控制台项目用来做性 ...

  4. .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)——转载

    原文链接:https://blog.walterlv.com/post/dotnet-high-performance-reflection-suggestions.html ***** 大家都说反射 ...

  5. 这一年多来,阿里Blink测试体系如何从0走向成熟?

    引言 Apache Flink是面向数据流处理和批处理的分布式开源计算框架,2016年阿里巴巴引入Flink框架,改造为Blink.2017年,阿里整合了所有流计算产品,决定以Blink引擎为基础,打 ...

  6. .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)

    我们有很多种方法评估一个方法的执行耗时,比如使用性能分析工具,使用基准性能测试.不过传统的在代码中编写计时的方式依然有效,因为它可以生产环境或用户端得到真实环境下的执行耗时. 如果你希望在 .NET/ ...

  7. 原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

    大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以 ...

  8. C# 直接创建多个类和使用反射创建类的性能

    原文:C# 直接创建多个类和使用反射创建类的性能 本文告诉大家我对比的使用直接创建多个类和使用反射创建多个类的性能 在上一篇 C# 程序内的类数量对程序启动的影响 的基础上,继续做实验 现在创建 10 ...

  9. 2019-11-29-C#-性能分析-反射-VS-配置文件-VS-预编译

    原文:2019-11-29-C#-性能分析-反射-VS-配置文件-VS-预编译 title author date CreateTime categories C# 性能分析 反射 VS 配置文件 V ...

随机推荐

  1. Nginx 对访问量的控制

    目的 了解 Nginx 的 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,对请求访问量进行控制. Nginx 模块化 nginx ...

  2. CNCF 旗下首个为中国开发者量身打造的云原生课程,《CNCF x Alibaba 云原生技术公开课》即将上线

    伴随着以 Kubernetes 为代表的云原生技术体系的日益成熟以及 CNCF 生态的逐渐壮大,“云原生”已然成为了未来云计算时代里一个当仁不让的关键词.但是,到底什么是“云原生”?云原生与 CNCF ...

  3. JQuery--基础动画、滑动动画、淡入淡出动画、自定义动画

    /** * [JQ基础动画] * show() 显示 * hide() 隐藏 * toggle() 切换 * 默认无动画,如果要产生动画 * 在括号内,添加毫秒数,可产生动画和控制动画的快慢 * * ...

  4. 【JZOJ4761】【NOIP2016提高A组模拟9.7】鼎纹

    题目描述 输入 输出 样例输入 2 3 4 4 2 1100 0110 1100 10 01 10 00 2 2 2 2 11 11 01 10 样例输出 YES NO 数据范围 解法 由于鼎纹中的第 ...

  5. 软件测试 → 第二章 基础-> 软件缺陷与缺陷管理

    一.缺陷定义与分类 1.1.软件缺陷 定义:在软件工程整个生命周期中任何背离需求.无法正确完成用户所要求的功能的问题,包括存在于组件.设备.或系统软件中因异常条件不支持而导致系统失败等都属于缺陷. 从 ...

  6. jQuery动态加载动画spin.js

    在线演示 本地下载

  7. Objectarx之分批存储相连实体

    void CCommonFuntion::BatchStorageEnt(AcDbObjectIdArray& inputId, std::vector<std::vector<A ...

  8. Launch configuration JUnitCore references non-existing project XXX.

  9. Java练习 SDUT-1211_英文金曲大赛

    英文金曲大赛 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 我们在"渊子数"的题目中已经了解了渊子 ...

  10. QT自定义窗口

    qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ...