事由:

这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别。

顺带提一下:

啊啊啊啊 等我仔细看文档的时候文档 发现它让我用Release的模式去运行benchmark。 emmm...其实我之前一直在用Debug模式调试。。

所以各位在运行的时候,The best way is build our benchmark in the Release mode and run it from the command line.

过程:

首先 我们需要在Nuget上安装BenchMarkDotNet

(安装当前最新版本,当前我已经安装好了)

但是却安装失败出现两个error。

其中一个是

第二个

ok,第二个错误非常显眼,那我先尝试着按照它的说法解决  我边在Nuget上找到 Microsoft.CodeAnalysis.CSharp 2.8.2 ,Microsoft.CodeAnalysis.Common (= 2.8.2)  我安装的都是2.8.2的版本 但是其实这两个包都有更新的版本。安装完毕后 发现错误消失了,却跳出几个警告。(对后面的测试没有影响就先不搭理)

安装完,上述两个包后 再回去安装 BenchmarkDotNet 终于安装成功了。

Ok此时我们在新建一个Console.App ,命名为BenchMarkDotNetTest

在API层把需要的方法 前加上[Benchmark] 引用BenchmarkDotNet.Attributes;

注意:原来的方法中是有参数的,但是这里不允许有参数,我就把方法的入参和值直接写到方法里面去了。

这2个方法都在UserImpelement 类中所以我们在Main方法中这样写

 static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<UserImpelement>();
      //var summary = BenchmarkRunner.Run(typeof(UserImpelement))//当然也可以这么写
Console.WriteLine("-----------------");
Console.WriteLine(summary);
Console.ReadKey();
}

点击运行,emmm,错误又来了

在百度上搜索了,但是未能找到结果,于是就去Bing上搜索

GitHub上有回复

https://github.com/dotnet/BenchmarkDotNet/issues/579

(当然官方文档也有回答)

Ok 根据解决方案 我们新创建了AllowNonOptimazed类

运行的summary改成

var summary = BenchmarkRunner.Run<UserImpelement>(new AllowNonOptimized());

再次运行,运行开始。 运行需要一点时间

可以看到运行大概花费了1分52秒

总结果如下

我运行了多次每一次的数据都有变化,响应速度上也是有时CheckLogin快 有时AsyncCheckLogin更快些

我们还能在BenchMarkDotNetTest\bin\Debug\netcoreapp2.1\BenchmarkDotNet.Artifacts\results中看到输出结果的XLS ,MD和HTML文件

当前截图是我运行了2次的结果所以有两张XSL表格

点开HTML文件可以看到也是一样就是本次性能测试的Summary

而打开表格的时候则会有更多详细的性能数据显示

可是我对这些性能指标很陌生,至少我们初步的看一下他们代表什么有什么意义

// * Legends *

Mean   : Arithmetic mean of all measurements

Error  : Half of 99.9% confidence interval

StdDev : Standard deviation of all measurements

1 ms   : 1 Millisecond (0.001 sec)

Mean: 可以反映响应时长

StdDev:事务处理响应的偏差,值越大,偏差越大;

Median:中值响应时间

confidence interval:置信区间 (展现这个参数的真实值有一定概率落在测量结果的周围的程度)

补充:

话说,我同样的情况下运行4次,只有1次出现了中值 其他三次都没有。

后来发现其实在类前加上 [MinColumn, MaxColumn, MedianColumn]

返回结果里就会多输出Min, Max, Media。

从每一次的运行测试结果上看也是五五开- - 我想会不会是当前接口逻辑太简单了呢所以很难得出结果,那ok我们再来多测试几个接口

(这次我换了另一个.Net Core API项目)

那我们对三组方法进行测试(同样的方法内容用同步和异步处理)

分别为

login(登录)

ReturnClient(返回管理员用户信息)

loadImg(加载头像信息)

按照同样的步骤进行操作,运行

这个项目进行测试这一次测试耗时非常短(39秒)

上述结果而言 其实同步的响应时间通常快于异步(当然其实我不是特别确信我的判断)

ok进行第二组测试

第三组

第四组

emmm...果然还是有波动的。

所以我测试了很多组数据,但是想去比较个究竟,却感觉自己似乎进入了误区了。

我现在刚刚大四,技术不是非常好,还是希望各位大牛提提意见。

这些性能指标具体代表些什么,又如何去反应代码的性能优劣呢?

还有我这样去比较同步和异步的方法性能是否正确呢 ,为什么我看不出个所以然呢?

补充:

BenchmarkDotNet官方文档 https://benchmarkdotnet.org/articles/guides/getting-started.html

利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能的更多相关文章

  1. 【从零开始搭建自己的.NET Core Api框架】(一)创建项目并集成swagger:1.1 创建

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  2. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  3. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  4. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  5. 小范笔记:ASP.NET Core API 基础知识与Axios前端提交数据

    跟同事合作前后端分离项目,自己对 WebApi 的很多知识不够全,虽说不必要学全栈,可是也要了解基础知识,才能合理设计接口.API,方便与前端交接. 晚上回到宿舍后,对 WebApi 的知识查漏补缺, ...

  6. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  7. 【测试】Gunicorn , uWSGI同步异步测试以及应用场景总结

    最近使用uwsgi出了一些问题,于是测试下Gunicorn测试对比下 环境 一颗cpu 1g内存 Centos系统 Django作为后端应用,Gunicorn默认模式和异步模式,响应基本是无阻塞类型 ...

  8. .net core api +swagger(一个简单的入门demo 使用codefirst+mysql)

    前言: 自从.net core问世之后,就一直想了解.但是由于比较懒惰只是断断续续了解一点.近段时间工作不是太忙碌,所以偷闲写下自己学习过程.慢慢了解.net core 等这些基础方面学会之后再用.n ...

  9. 详解ASP.NET Core API 的Get和Post请求使用方式

    上一篇文章帮助大家解决问题不彻底导致博友使用的时候还是遇到一些问题,欢迎一起讨论.所以下面重点详细讲解我们常用的Get和Post请求( 以.net core2.2的Http[Verb]为方向 ,推荐该 ...

随机推荐

  1. LDA与最小二乘法的关系及其变种详解

    1 LDA与最小二乘法的关联 对于二值分类问题,令人惊奇的是最小二乘法和LDA分析是一致的.回顾之前的线性回归,给定N个d维特征的训练样例(i从1到N),每个对应一个类标签.我们之前令y=0表示一类, ...

  2. Spring 3.x 企业引用开发实战(陈雄华/林开雄)

    目录 ... 第一章:Spring概述 IoC:BeanFactory.Context.El(SpringEL表达式) AOP:允许JVM虚拟机启动时使用代理类在运行时期修改指定类的字节码,改变一个类 ...

  3. assert.strictEqual()

    assert.strictEqual(actual, expected[, message]) 使用全等运算符(===)测试 actual 参数与 expected 参数是否全等. // 格式 ass ...

  4. Luogu 2668 [NOIP2015]斗地主

    打牌技术不精,没有把$A$放在顺子里面搜,WA了好长时间. 盗用大佬的一张图: 当时自己搜的时候没有把四张牌拆成三带一等情况. 然后还有一点就是四张三张都出完之后直接数一数剩下的一张两张牌还要多少次出 ...

  5. [转]hadoop运行mapreduce作业无法连接0.0.0.0/0.0.0.0:10020

    14/04/04 17:15:12 INFO mapreduce.Job:  map 0% reduce 0% 14/04/04 17:19:42 INFO mapreduce.Job:  map 4 ...

  6. 哪个U盘启动工具能安装红帽系统,

    安装红帽子,不要使用windows系统下的PE启动盘,两者引导方式不一样,不通用的.正确的方法是网上下载红帽子的ISO镜像文件后,用UltraISO这个工具写入优盘或者光盘,得到的系统盘才可以启动电脑 ...

  7. 谈谈Java异常处理这件事儿

    此文已由作者谢蕾授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 我们对于"异常处理"这个词并不陌生,众多框架和库在异常处理方面都提供了便利,但是对于 ...

  8. 递归实现从n个数中选r个数的组合数

    #include <stdio.h> #include <stdlib.h> ], count; void comb(int m, int k) { int i, j; for ...

  9. Mysql:主从集群配置

    我这里是去网易蜂巢取得镜像:https://c.163yun.com/hub#/m/home/ 命令:docker pull hub.c.163.com/library/mysql:latest 拉取 ...

  10. java 提取(解压)zip文件中特定后缀的文件并保存到指定目录

    内容简介 本文主要介绍使用ZipFile来提取zip压缩文件中特定后缀(如:png,jpg)的文件并保存到指定目录下. 导入包:import java.util.zip.ZipFile; 如需添加对r ...