C# 标准性能测试

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 本文介绍如何使用 BenchmarkDotNet 工具进行性能测试。通过 GitHub 代码示例展示如何安装并应用此工具,对函数或静态方法进行精确的性能分析。首先需通过 NuGet 安装 BenchmarkDotNet,然后在测试函数上添加 `[Benchmark]` 特性,并使用 `BenchmarkRunner.Run<>();` 进行测试。测试过程中包括 Pilot、Warmup 和 Target 等阶段,并提供 Mean、Error 和 StdDev 等统计信息。

来源:http://www.51testing.com

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

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

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
4月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
66 0
|
11月前
|
测试技术 API C#
C# 软件开发之单元测试
在日常开发中,一般通过启动调试或运行程序来查看功能是否符合预期,如果不符合预期,则需要优化程序,再次运行,如此反复,直到程序的输出符合预期需求为止。随着程序的不断复杂化,某些功能的测试也变得越来越复杂,可能为了验证一个很小的改动项,就需要操作很多步骤,才能验证成功,如果验证不成功,则需要多次重复验证,这对于开发者来说,将大大的拖延了开发进度。如何才能将复杂的功能进行拆分,每一个都可以单独进行验证呢?如果其他的功能没有问题,则只需要验证修改的那部分内容即可,这就是本篇文章需要介绍的单元测试。通过创建和运行单元测试,检查代码是否按预期工作。
320 1
|
1月前
|
测试技术 API C#
C#使用Bogus生成测试数据
C#使用Bogus生成测试数据
35 1
|
3月前
|
数据采集 数据可视化 测试技术
C#生成Selenium测试报告:实用方法与技巧
在C#中使用Selenium进行自动化测试时,结合代理IP和ExtentReports能增强测试安全性和报告质量。安装必备工具如Selenium WebDriver、NUnit和ExtentReports。在测试设置中,配置代理(如亿牛云爬虫代理)以隐藏IP,通过ChromeOptions定制UserAgent,并添加Cookie。测试代码示例展示了如何打开网页、执行搜索并生成详细的测试报告。使用ExtentReports可创建可视化测试结果,便于团队分析。
C#生成Selenium测试报告:实用方法与技巧
|
25天前
|
Linux C#
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
|
3月前
|
测试技术 C# 容器
在C#中进行单元测试 _
前言 时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的。 我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写CRUD就是写CRUD,几乎用不到单元测试。写完一个功能直接上手去测,当然这只是我个人感受,仅供参考。 然后当我还在抱怨测试好烦的时候,大佬跟我说为什么不用单元测试和集成测试,我这也是有苦说不出。要知道光学会理论知识,没有实践作为基础,都是扯淡,入职这么久还真没用过单元测试,吓得我赶紧去找资料学习。 那么也是通过观看B站某位Up主的视频,然后有点想法写下这篇文章,虽然up主的主题是探究接口的作用和意义,但是
|
4月前
|
C# 图形学
【Unity 3D】C#控制语句break、continue及算数运算符和逻辑运算符的讲解(附测试代码)
【Unity 3D】C#控制语句break、continue及算数运算符和逻辑运算符的讲解(附测试代码)
52 1
|
4月前
|
自然语言处理 C# 图形学
【Unity 3D】C#中正则表达式的详解(附测试代码 超详细)
【Unity 3D】C#中正则表达式的详解(附测试代码 超详细)
164 0
|
4月前
|
存储 C#
【Untiy 3D】C#中文件夹与读写文件操作详解(附测试代码 超详细)
【Untiy 3D】C#中文件夹与读写文件操作详解(附测试代码 超详细)
61 0
|
4月前
|
C# 图形学
【Unity 3D】C#中String类的介绍及字符串常用操作详解(附测试代码 超详细)
【Unity 3D】C#中String类的介绍及字符串常用操作详解(附测试代码 超详细)
140 0