使用BenchmarkDotNet对C#代码进行基准测试

news2024/12/26 20:54:31

一、基准测试

基准测试(benchmarking)是一种测量和评估软件性能指标的活动。你可以在某个时候通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定那些变化对性能的影响。这是基准测试最常见的用途。其他用途包括测定某种负载水平下的性能极限、管理系统或环境的变化、发现可能导致性能问题的条件,等等。

基准测试和压力测试是性能测试两大组成部分。

二、NuGet安装BenchmarkDotNet

我们可以通过NuGet命令来安装BenchmarkDotNet。

Install-Package BenchmarkDotNet

也可以通过图形化NuGet界面安装:

三、编写基准测试代码

创建一个BenchmarkDotNet类,并在需要测试的方法中标记Benchmark特性。以我自己的一个自定义程序集中主要方法的性能测试为例:

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Humbunklung.SpreadSheetCalculator.Core;
using Humbunklung.SpreadSheetCalculator.Data;
using Humbunklung.SpreadSheetCalculator.Position;

BenchmarkRunner.Run<SpreadSheetCalculatorBenchmark>();

[MemoryDiagnoser, RankColumn]
public class SpreadSheetCalculatorBenchmark
{
    private static readonly string WorkbookPath = $@"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}workbook.xlsx";

    [Benchmark]
    public void CalculateAll()
    {
        using (var cal = new WorkbookCalculator(WorkbookPath))
        {
            var inputData = new Dictionary<CellPositionInfo, CellValueData>();
            var outputData = new Dictionary<CellPositionInfo, CellValueType>();

            inputData.Add(new CellPositionInfo { SheetName = "管道计算 (混凝土管道简化指标)", ColIndex = 1, RowIndex = 2 }, new CellValueData { ValueType = CellValueType.NumericCellValue, Value = 250 });
            outputData.Add(new CellPositionInfo { SheetName = "管道计算 (混凝土管道简化指标)", ColIndex = 25, RowIndex = 2 }, CellValueType.NumericCellValue);
            outputData.Add(new CellAddressInfo { SheetName = "管道计算 (混凝土管道简化指标)", CellAddress = "AJ3" }.ToCellPositionInfo(), CellValueType.NumericCellValue);

            cal.Compute(inputData, outputData);
        }
    }

    [Benchmark]
    public void CalculateSpecified()
    {
        using (var cal = new WorkbookCalculator(WorkbookPath))
        {
            var inputData = new Dictionary<CellPositionInfo, CellValueData>();
            var outputData = new Dictionary<CellPositionInfo, CellValueType>();

            inputData.Add(new CellPositionInfo { SheetName = "管道计算 (混凝土管道简化指标)", ColIndex = 1, RowIndex = 2 }, new CellValueData { ValueType = CellValueType.NumericCellValue, Value = 250 });
            outputData.Add(new CellPositionInfo { SheetName = "管道计算 (混凝土管道简化指标)", ColIndex = 25, RowIndex = 2 }, CellValueType.NumericCellValue);
            outputData.Add(new CellAddressInfo { SheetName = "管道计算 (混凝土管道简化指标)", CellAddress = "AJ3" }.ToCellPositionInfo(), CellValueType.NumericCellValue);

            cal.Evaluate(inputData, outputData);
        }
    }

    [Benchmark]
    public void CalculateFormulas()
    {
        using (var cal = new WorkbookCalculator(WorkbookPath))
        {
            var inputData = new Dictionary<CellPositionInfo, CellValueData>();
            var outputData = new Dictionary<CellPositionInfo, CellValueType>();

            inputData.Add(new CellPositionInfo { SheetName = "管道计算 (混凝土管道简化指标)", ColIndex = 1, RowIndex = 2 }, new CellValueData { ValueType = CellValueType.NumericCellValue, Value = 250 });
            outputData.Add(new CellPositionInfo { SheetName = "管道计算 (混凝土管道简化指标)", ColIndex = 25, RowIndex = 2 }, CellValueType.NumericCellValue);
            outputData.Add(new CellAddressInfo { SheetName = "管道计算 (混凝土管道简化指标)", CellAddress = "AJ3" }.ToCellPositionInfo(), CellValueType.NumericCellValue);

            cal.EvaluateFormulas(inputData, outputData);
        }
    }
}

四、运行Benchmark

作为一种性能测试,需要在Release模式下运行,在Debug模式下会报错。几个主要方法的测试结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1945372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手持气象站:掌中的天气预报员

在科技日新月异的今天&#xff0c;手持气象站作为一种便携、智能的气象监测设备&#xff0c;逐渐成为了户外探险、农业生产、环境监测等领域的得力助手。它以其小巧的体积、丰富的功能和精准的数据&#xff0c;赢得了广大用户的青睐。 一、手持气象站的概述 手持气象站是一种集…

Springboot 多数据源事务

起因 在一个service方法上使用的事务,其中有方法是调用的多数据源orderDB 但是多数据源没有生效,而是使用的primaryDB 原因 spring 事务实现的方式 以 Transactional 注解为例 (也可以看 TransactionTemplate&#xff0c; 这个流程更简单一点)。 入口&#xff1a;ProxyTransa…

算法通关:006_1二分查找

查找一个数组里面是否存在num import java.util.Arrays;/*** Author: ggdpzhk* CreateTime: 2024-07-23*/ public class _006 {//二分查找//保证数组有序才能用二分查找&#xff0c;不然无意义public static boolean exist(int[] arr,int num){if(arr null || arr.length 0)…

VUE3学习第二篇:报错记录

1、在我整理好前端代码框架后&#xff0c;而且也启动好了对应的后台服务&#xff0c;访问页面&#xff0c;正常。 2、报错ReferenceError: defineModel is not defined 学到这里报错了 在vue网站的演练场&#xff0c;使用没问题 但是在我自己的代码里就出问题了 3、watchEffec…

2024-07-23 Unity插件 Odin Inspector11 —— 使用 Odin 自定义编辑窗口

文章目录 1 OdinEditorWindow1.1 运作方式1.2 使用特性绘制 OdinEditorWindow1.3 在 OdinEditorWindow 中渲染对象 2 OdinMenuEditorWindow2.1 添加菜单导航栏2.2 添加导航栏示例 ​ Odin Window 可以完整地访问 Odin 绘图系统&#xff0c;不再需要操心 Window 的绘制 方式&am…

MySQL的主从复制以及读写分离

主从复制 主从复制的原理&#xff1b; 读写分离&#xff0c;MHA&#xff08;高可用&#xff09;的前提是得要有主从复制 主从复制的模式&#xff1a; 1、MySQL的默认模式&#xff1a; 异步模式 住主库在更新完事务之后会立即把结果返回给从服务器&#xff0c;并不关心从库…

Github 2024-07-17 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目3Python项目3Rust项目2TypeScript项目2MDX项目1项目化学习 创建周期:2538 天协议类型:MIT LicenseStar数量:161973 个Fork数量…

Unity UGUI 之 Slider

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.Slider是什么 滑块&#xff0c;由三部分组成&#xff1a;背景 填充条 手柄 填充条就是…

提升网站性能:ThinkPHP6中如何实现Mysql分页查询

随着互联网的快速发展&#xff0c;web应用程序的开发也越来越复杂。而分页查询是web应用程序中常见的功能之一。thinkphp6是一个web框架&#xff0c;可以帮助开发人员快速开发应用程序。在本文中&#xff0c;我们将讨论如何在thinkphp6中使用mysql进行分页查询。 首先&#xf…

【java计算机毕设】医用物理学实验考核系统java MySQL ssm JSP maven项目设计源码+文档 寒暑假作业

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】医用物理学实验考核系统java MySQL ssm JSP maven项目设计源码文档 寒暑假作业 2项目介绍 系统功能&#xff1a; 医用物理学实验考核系统包括管理员、学生、教师三种角色。 管理员功能包括个人中心模块用于…

Google Cloud Platform数据工程简介

Google Cloud Platform数据工程简介 前言 云计算的出现为数据驱动型组织提供了采用成本效益高且可扩展的数据工程解决方案的机会。在云服务提供商中&#xff0c;Google Cloud Platform (GCP) 是近年来表现优异的领导者之一。GCP的增长被归因于其在企业和初创公司中的日益普及…

【Leetcode】十八、动态规划:不同路径 + 最大正方形

文章目录 1、动态规划2、leetcode509&#xff1a;斐波那契数列3、leetcode62&#xff1a;不同路径4、leetcode121&#xff1a;买卖股票的最佳时机5、leetcode70&#xff1a;爬楼梯6、leetcode279&#xff1a;完全平方数7、leetcode221&#xff1a;最大正方形 1、动态规划 只能…

SAP库龄计算报表(源码)

一个简单的库龄计算报表&#xff0c;根据移动类型来判断最后移动日期&#xff0c;包含批次和非批次库存。 *&---------------------------------------------------------------------* *& Report ZMMR_016 *&---------------------------------------------------…

数据代理实践

1&#xff0c;什么事数据代理机制&#xff1f; 通过访问 代理对象的属性 来向该访问 目标对象的属性 数据代理机制的视线需要依靠&#xff0c;Object.defineProperty()方法 2&#xff0c; ES6新特性&#xff1a; 在对象中的函数/方法 &#xff1a;function是可以省略的 &l…

P2-AI产品经理-九五小庞

项目要怎么做 需求&#xff0c;技术&#xff0c;构建流程&#xff0c;算法 要懂&#xff0c;懂什么&#xff1f; 懂产品方案&#xff0c;包含&#xff1a; 不懂&#xff0c;会遇到哪些问题&#xff1f; 跟算法供应商沟通的专业度不足&#xff0c;容易被边缘化&#xff0c;…

手写数字识别(机器学习)

一&#xff1a;一对多分类方法(one-vs-all) 这里先上的代码&#xff0c;想看原理可以到代码下面。 在数据集中&#xff0c;y的取值为1~10&#xff0c;y10表示当前数字为0 首先读取数据,并对数据进行切分。 import pandas as pd import numpy as np import matplotlibmatplo…

美摄科技企业级视频拍摄与编辑SDK解决方案

在数字化浪潮汹涌的今天&#xff0c;视频已成为企业传递信息、塑造品牌、连接用户不可或缺的强大媒介。为了帮助企业轻松驾驭这一视觉盛宴的制作过程&#xff0c;美摄科技凭借其在影视级非编技术领域的深厚积累&#xff0c;推出了面向企业的专业视频拍摄与编辑SDK解决方案&…

Linux磁盘扩容lvm

目录 Linux磁盘管理基础知识介绍 1.确认分区类型 2.添加新硬盘 3.给新硬盘添加分区 &#xff08;2&#xff09;指定分区类型 4.创建物理卷 5.创建卷组 6.扩展逻辑卷 7.刷新文件系统 &#xff08;1&#xff09;查看文件系统 xfs文件系统使用&#xff08;centos&#…

RocketMQ集群搭建,看完这篇文章你就懂了(基于2m-2s-async模式)

前言 上一篇初步认识了RocketMQ&#xff0c;这一篇文章我们简单来搭建一个RocketMQ集群。RocketMQ支持多种集群部署模式&#xff0c;其中最常用的是多主多从的异步复制模式&#xff08;2m代表两个master&#xff0c;2s代表两个slave&#xff0c;async代表异步刷盘的机制&#…

数据结构 - AVL树

文章目录 一、AVL树的介绍二、AVL树的实现1、基本框架2、查找3、插入4、删除5、测试6、总代码 三、AVL树的性能 一、AVL树的介绍 1、概念 AVL树&#xff08;Adelson-Velsky and Landis Tree&#xff09;是一种自平衡的二叉搜索树。它得名于其发明者G. M. Adelson-Velsky和E. M…