xunit-performance 是xUnit的一个扩展, 使用它可以对.NET Core项目进行性能测试。

官网:https://github.com/Microsoft/xunit-performance

xUnit大家可能都用过,它是用来做单元测试的,它可以很快给开发人员功能是否OK的反馈。

和xUnit一样,xUnit-Performance可以很快给出性能上的反馈。

准备和安装xUnit-Performance

为了讲解,我们需要准备一个需要被测试的项目和一个测试项目。

我使用Visual Studio 2017建立项目之后总有一些问题,不过后来我是用dotnet cli和VSCode就没有什么问题了。

建立项目的顺序如下:

1. 首先使用dotnet cli建立一个classlib类型的被测试项目,它的目标框架是.NET Standard 2.0:

这个项目里只有一个类,也就是要被测试的类:

这个类有三个方法,分别是使用foreach,for和Linq扩展方法的Sum对集合循环并求和。

2. 使用dotnet cli建立一个console项目(如果使用VS2017的话直接建类库就可以,因为VS2017内置Test Runner),这个是测试项目,它的版本只能是2.0(可能是因为我电脑sdk的版本较老):

另外还需要引用被测试项目。

3.然后,按照官方文档安装两个库。

xUnit-Performance目前还处于Beta阶段,这两个库需要按照官网的指示进行安装:

最新版的xunit.performance.api.dll, 这里用到的是MyGet: https://dotnet.myget.org/feed/dotnet-core/package/nuget/xunit.performance.api#.

然后是最新版的 Microsoft.Diagnostics.Tracing.TraceEvent, 这个使用Nuge: https://www.nuget.org/packages/Microsoft.Diagnostics.Tracing.TraceEvent

OK,现在依赖库都装好了。

编写性能测试

性能测试和单元测试略有不同, 性能测试是跑很多次, 然后取平均值. 同时也要考虑到内存等其它因素的影响.

在性能测试里就不需要测试功能的正确性了, 但是程序在压力下可能会产生不同的结果, 尤其是多线程的情况. 这时你就需要写压力测试了.

而对于性能测试, 我们只考虑速度.

由于我是用的是dotnet cli和VSCode,所以测试项目我选用的是控制台项目,它的Main方法需要这样写:

如果您能成功的使用VS2017建立测试项目,那么就不需要Main方法了,建立一个类库项目即可,直接使用VS2017的Test Runner即可。

性能测试代码

下面我们编写性能测试方法。

首先在测试项目建立一个类,然后做一些准备工作:

这里我准备了一个List<KeyValuePair<int, double>>,它有100000条数据,是随机生成的。

然后是测试方法,在这里我们使用[Benchmark]替代了xUnit单元测试中的[Fact]:

xUnit.Performance的测试会跑很多次,结果是取平均值的

这里我们循环遍历Benchmark.Iterations,它有一个默认值,我这里默认是跑了1000次循环。

再循环里,首先您可以做一些准备工作。然后使用iteration.StartMeasurement()来开始进行测量。

只有iteration.StartMeasurement()后边的部分才会被测量,在大括号里面写被测试相关的代码就可以了。

然后在命令行输入运行测试:

测试结果如下:

提供了控制台输出,xml,csv,md输出(在项目文件夹里)。

从控制台可以看到该测试的循环跑了1000次,平均结果是0.963毫秒

下面是csv结果的截图:

下面是md结果文件的截图:

下面是xml结果文件的截图,它里面有详细数据:

内部循环

xUnit.Performance还可以添加一个内部循环属性 InnerIterationCount。先看代码,添加以下方法:

[Benchmark(InnerIterationCount = 10_000)],这里的InnerIterationCount是内部循环遍历的次数。

在StartMeasurement()之后,进行内部循环。

这样的话,外层循环的次数可能会很少,而且第一次外层循环是热身,不包括在测试结果中

而内部循环适合于运行比较快速的代码(微秒级)。

有时确实需要这样两层循环,做一些热身工作或者需要完成不同级别的准备工作。

然后我们来跑测试

在结果里看到外层循环有2次的记录,但是它实际跑了3次,第一次算作热身,不做统计。

它的时间是内层循环的总和,除以10000之后,和第一个方法的结果差不太多。

我可以在方法中打印输出循环次数:

其结果如下:

可以看到确实是跑了3次,但统计了2次。

然后我再添加另外两个测试方法,分别测试另外两个方法:

运行测试:

可以看到现在这4个测试方法的结果。

看来针对List来说foreach要比linq和for循环快。

注意foreach测试的外层循环跑了2次,而for和linq的测试循环只跑了1次,可能是因为花费时间太久了吧?这个我不太确定

StopWatch

可以看到测试命令的参数 stopwatch,它应该是来自System.Diagnostics命名空间下的StopWatch类。

它有Start()和Stop()方法和一些其它属性用来统计逝去的时间。

StopWatch类是跨平台的,但是在其它系统上,它只能统计时间;而在Windows上,它还可以使用内核ETW events和CPU性能计数来给您更多的数据,具体请查阅相关资料。

结语

该库还有很多功能和命令的参数,具体请参考文档:https://github.com/Microsoft/xunit-performance

但是要注意,它仍然是beta状态,只能在MyGet而不是Nuget获取。

.NET Core 性能分析: xUnit.Performance 简介的更多相关文章

  1. 【性能诊断】五、并发场景的性能分析(windbg简介及dump抓取)

    windbg简介 Windbg是在windows平台下,强大的用户态和内核态调试工具.相比较于Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能 ...

  2. 系统级性能分析工具perf的介绍与使用

    测试环境:Ubuntu16.04(在VMWare虚拟机使用perf top存在无法显示问题) Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance pro ...

  3. 系统级性能分析工具perf的介绍与使用[转]

    测试环境:Ubuntu16.04(在VMWare虚拟机使用perf top存在无法显示问题) Kernel:3.13.0-32 系统级性能优化通常包括两个阶段:性能剖析(performance pro ...

  4. 老李分享:《Java Performance》笔记1——性能分析基础 1

    老李分享:<Java Performance>笔记1——性能分析基础   1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...

  5. Python 性能分析工具简介

    Table of Contents 1. 性能分析和调优工具简介 1.1. Context Manager 1.2. Decorator 1.3. 系统自带的time命令 1.4. python ti ...

  6. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  7. Chrome Performance性能分析面板使用

    最近做的项目都是内嵌egret游戏,想在移动端监测下它的性能,于是就开始了对Performance的探索: 一.使用 打开控制台,一顿操作: 网络选择Fast 3G,模拟手机普通3G环境,虽然现在大家 ...

  8. MiniProfiler性能分析工具— .Net Core中用法

    前言: 在日常开发中,应用程序的性能是我们需要关注的一个重点问题.当然我们有很多工具来分析程序性能:如:Zipkin等:但这些过于复杂,需要单独搭建. MiniProfiler就是一款简单,但功能强大 ...

  9. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

随机推荐

  1. 最短寻道优先算法----SSTF算法

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短 java代码实现如下: import java.ut ...

  2. 关于SELinux

    出现背景以及发展历程 SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secu ...

  3. copy.copy()与copy.deepcopy()的详解

    copy.copy() 元组和列表调用这个方法效果也不一样. 元组的效果: a = [1,2,3] b = [4,5,6] c = (a,b) e = copy.copy(c) 可以看到:e和c是指向 ...

  4. bzoj 2005 能量采集 莫比乌斯反演

    我们要求的是∑ni=1∑mj=1(2×gcd(i,j)−1) 化简得2×∑ni=1∑mj=1gcd(i,j)−n×m 所以我们现在只需要求出∑ni=1∑mj=1gcd(i,j)即可 ∑ni=1∑mj= ...

  5. BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理

    BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程     X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...

  6. BZOJ_4590_[Shoi2015]自动刷题机_二分答案

    BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...

  7. BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元

    BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...

  8. CAN总线的显性电平与隐性电平

    读CAN总线的书时,都会涉及到总线电平的问题,CAN总线的电平分为显性电平与隐性电平,这是CAN总线物理层的核心部分,也是总线仲裁的基础.那何为显性,何为隐性呢? 根据孔丙火(微信公众号:孔丙火)的理 ...

  9. SASS 中变量的默认值

    SASS 中定义的变量,后设置的值会覆盖旧的值. $color: red; $color: blue; .btn { color: $color; } 编译后为: .btn { color: blue ...

  10. pandas和spark的dataframe互转

    pandas的dataframe转spark的dataframe from pyspark.sql import SparkSession # 初始化spark会话 spark = SparkSess ...