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进行规格选择与性能压测。
目录
相关文章
|
6月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
82 0
|
测试技术 API C#
C# 软件开发之单元测试
在日常开发中,一般通过启动调试或运行程序来查看功能是否符合预期,如果不符合预期,则需要优化程序,再次运行,如此反复,直到程序的输出符合预期需求为止。随着程序的不断复杂化,某些功能的测试也变得越来越复杂,可能为了验证一个很小的改动项,就需要操作很多步骤,才能验证成功,如果验证不成功,则需要多次重复验证,这对于开发者来说,将大大的拖延了开发进度。如何才能将复杂的功能进行拆分,每一个都可以单独进行验证呢?如果其他的功能没有问题,则只需要验证修改的那部分内容即可,这就是本篇文章需要介绍的单元测试。通过创建和运行单元测试,检查代码是否按预期工作。
331 1
|
22天前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
132 64
|
3月前
|
测试技术 API C#
C#使用Bogus生成测试数据
C#使用Bogus生成测试数据
54 1
|
5月前
|
数据采集 数据可视化 测试技术
C#生成Selenium测试报告:实用方法与技巧
在C#中使用Selenium进行自动化测试时,结合代理IP和ExtentReports能增强测试安全性和报告质量。安装必备工具如Selenium WebDriver、NUnit和ExtentReports。在测试设置中,配置代理(如亿牛云爬虫代理)以隐藏IP,通过ChromeOptions定制UserAgent,并添加Cookie。测试代码示例展示了如何打开网页、执行搜索并生成详细的测试报告。使用ExtentReports可创建可视化测试结果,便于团队分析。
C#生成Selenium测试报告:实用方法与技巧
|
19天前
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
42 7
|
20天前
|
Kubernetes 测试技术 持续交付
C# 一分钟浅谈:集成测试与系统测试
【10月更文挑战第19天】本文详细介绍了集成测试和系统测试的概念、目的及其在软件开发中的重要性。通过分析常见问题和易错点,结合代码示例,探讨了如何通过代码规范、自动化测试和持续集成等方法提高测试效果,确保软件质量和可靠性。
43 1
|
21天前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
32 1
|
3月前
|
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
|
5月前
|
测试技术 C# 容器
在C#中进行单元测试 _
前言 时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的。 我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写CRUD就是写CRUD,几乎用不到单元测试。写完一个功能直接上手去测,当然这只是我个人感受,仅供参考。 然后当我还在抱怨测试好烦的时候,大佬跟我说为什么不用单元测试和集成测试,我这也是有苦说不出。要知道光学会理论知识,没有实践作为基础,都是扯淡,入职这么久还真没用过单元测试,吓得我赶紧去找资料学习。 那么也是通过观看B站某位Up主的视频,然后有点想法写下这篇文章,虽然up主的主题是探究接口的作用和意义,但是