C# 标准性能测试

简介: 本文介绍如何使用 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

目录
相关文章
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
573 0
|
数据采集 数据可视化 测试技术
C#生成Selenium测试报告:实用方法与技巧
在C#中使用Selenium进行自动化测试时,结合代理IP和ExtentReports能增强测试安全性和报告质量。安装必备工具如Selenium WebDriver、NUnit和ExtentReports。在测试设置中,配置代理(如亿牛云爬虫代理)以隐藏IP,通过ChromeOptions定制UserAgent,并添加Cookie。测试代码示例展示了如何打开网页、执行搜索并生成详细的测试报告。使用ExtentReports可创建可视化测试结果,便于团队分析。
277 5
C#生成Selenium测试报告:实用方法与技巧
|
测试技术 API C#
C#使用Bogus生成测试数据
C#使用Bogus生成测试数据
162 1
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
774 64
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
206 11
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
240 10
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
823 13
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
353 7
|
Kubernetes 测试技术 持续交付
C# 一分钟浅谈:集成测试与系统测试
【10月更文挑战第19天】本文详细介绍了集成测试和系统测试的概念、目的及其在软件开发中的重要性。通过分析常见问题和易错点,结合代码示例,探讨了如何通过代码规范、自动化测试和持续集成等方法提高测试效果,确保软件质量和可靠性。
727 1
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
308 1