.net core 抛异常对性能影响的求证之路

一、前言

在.net 社区中曾经听到过很多关于大量抛异常会影响性能这样的结论,心中一直就存在各种疑问。项目中使用自定义异常来处理业务很爽,但是又担心大量抛业务异常存在性能问题。查阅了各种文档,微软官方对性能优化这一块也不建议使用过多的异常,故我心中冒出疑问。

  • 疑问一:项目中大量抛出业务异常对性能是否会受到影响?

二、求证

2.1 使用.net 6 建立了一个简单的web api 项目 新增两个压测接口

  • api接口代码如下

/// <summary>/// 正常返回数据接口1/// </summary>/// <returns></returns        [HttpGet("Test1")]public async Task<IActionResult> Test(){return Content("1");}/// <summary>/// 抛异常返回接口2 ,同时存在全局过滤器/// </summary>/// <returns></returns        [HttpGet("Test2")]public async Task<IActionResult> Test2(string open){throw new BusinessException(Model.EnumApiCode.SignWrong);}
  • 全局过滤器代码如下

/// <summary>/// 全局异常日志/// </summary>public class ExceptionFilter : IExceptionFilter{/// <summary>/// /// </summary>/// <param name="context"></param>public void OnException(ExceptionContext context){//不做任何处理,直接返回1context.Result = new JsonResult("1");}}这里注入过滤器代码就不贴上来
  • 现在对test1 接口并发200的情况下进行压测,持续15分钟的压测结果如下:d6656d54b45fac78117563f7c457e7d2.png

  • 对通过全局过滤器捕获异常并大量抛出异常 在相同压测条件情况下的压测结果如下:18c165e571e68a30a6492bb8bbe3c522.png

  • 对test1 和test2 同等条件下压测结果对比

接口tpscpu压测条件
test110300左右cpu消耗90%左右并发200,持续压测
test14300左右cpu消耗100%左右并发200,持续压测

目前得到的结论是抛异常确实影响性能,并且对性能下降了60% 左右,上面主要是异常流程走了全局过滤器方式,故参考意义不大,下面再进一步修改代码进行压测

  • 对test2 代码进行修改如下

/// <summary>/// 抛异常返回接口2 ,直接try catch 不走全局过滤器/// </summary>/// <returns></returns        [HttpGet("Test2")]public async Task<IActionResult> Test2(){try{throw new BusinessException(Model.EnumApiCode.SignWrong);}catch (Exception ex){return Content("1");}}
  • 再对修改后的test2 接口进行压测,压测结果如下:

3140fe44256e194e2319348a895713f0.png
接口tpscpu占用压测条件
test110300左右90% 左右并发200,持续压测
test19200左右91% 左右并发200,持续压测

进一步得到的结论是try catch 后性能有所提高,跟正常相比还有点点差距,全局过滤器对性能影响比较大,相当于走了管道,但是观察代码test1 和test2代码还存在差距,怀疑test2 代码中new 了新异常导致性能差异,故再进一步进行代码修改求证

  • 对test1 代码进行修改,修改后的代码如下:

/// <summary>/// 正常返回数据接口1,但是先new 异常出来,保持跟上面test2 代码一致/// </summary>/// <returns></returns        [HttpGet("Test2")]public async Task<IActionResult> Test2(string open){var ex= new BusinessException(Model.EnumApiCode.SignWrong);return Content("1");}
  • 对修改后的test1 代码进行压测结果如下:2178e6fe6ac7a1f6ddeafac3dda6c168.png忘记截图,大概和修改后的test2 代码压测结果相差不大,大概tps 9300左右,故还是拿的上一个图贴出来,谅解

接口tpscpu占用压测条件
test19300左右90%左右并发200,持续压测
test29200左右90%左右并发200,持续压测

进一步得到的结论是try catch 后性能和正常返回代码性能相当,相差无几,可以忽略不计

2.2 最终结论

  • 异常和正常代码性能旗鼓相当,但是全局过滤器对性能影响比较大,大概降低了60%左右,全局过滤器走了管道,但是这跟微软官方的性能优化又有冲突,想必微软官方也是出于对全局过滤器异常处理的考虑吧。

  • 不使用全局过滤器进行业务自定义异常捕获,最外层try catch 掉

  • 对于非自定义异常,尽量按照微软官方建议

    • 使用 “测试者-执行者”模式

    • “尝试-分析”模式

最后抛出一个待求证的问题

  • 疑问一:大量抛出非自定义异常,性能和正常返回性能对比会如何?比如字符串转换int 不使用TryParse 去转换,官方是建议少点这样的异常,使用tryxxx 等操作

以上结论个人压测结果,如有不对,欢迎交流纠正

  • 参考文献

  • https://docs.microsoft.com/zh-cn/dotnet/standard/design-guidelines/exceptions-and-performance

  • https://docs.microsoft.com/zh-cn/aspnet/core/performance/performance-best-practices?view=aspnetcore-6.0#understand-hot-code-paths

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

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

相关文章

Android Bootloader LittleKernel的两篇文章 【转】

转自&#xff1a;http://blog.csdn.net/loongembedded/article/details/41747523 2014-12-05 14:37 3599人阅读 评论(2) 收藏 举报分类&#xff1a;Android Bootloader&#xff08;68&#xff09; Android 开发之 ---- bootloader &#xff08;LK&#xff09; LK是什么 LK 是 L…

Android Fragment 监听返回键

直接给代码*-* Fragment&#xff1a; public boolean onKeyDown(int keyCode, KeyEvent event){if ((keyCode KeyEvent.KEYCODE_BACK)){//执行操作((MainActivity) Objects.requireNonNull(getActivity())).viewPager.setCurrentItem(3); }return true;} MainActivity&#…

C语言试题三十三之比较两个字符串的长度,(不得调用c语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写函数…

一、首页第一个首页栏制作【仿淘票票系统前后端完全制作(除支付外)】

首页一共分为3个页面&#xff0c;分别是首页&#xff1a; 影院&#xff1a; 我的&#xff1a; 一、标题头制作 首先我们新建一个 web 相对应用&#xff0c;随后点击前台&#xff0c;在前台新建一个页面&#xff1a; 接着给予这个页面一个背景色&#xff1a; 为了使页面…

【CASS精品教程】Win 10操作系统CAD 2006+CASS 7.1安装图文经典教程(附安装包下载)

目前大多数机器的操作系统是Win10,然而Win10系统下安装软件就不如Win XP或Win 7下那么顺畅。作为一个GISer,软件的熟练安装是基本功,因此本文就以Win0系统为例,演示CAD 2006+CASS 7.1的安装过程,文末附CAD 2006+CASS 7.1安装包下载。 目录 一、软件准备: 1. CAD 2006 2…

teamviewer 过期解决办法

teamviewer 过期解决办法 参考资料&#xff1a; http://blog.csdn.net/z249683156/article/details/41842271posted on 2015-12-21 13:32 雪山看雪 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/zker/p/5063164.html

静态 非静态代码块和构造器的执行顺序测试方法

public class Test { static{ System.out.println("静态区"); } { System.out.println("非静态&#xff01;"); } private int i; public Test(int i) { super(); this.i i; } public Test() { System.out.println("构造器&#xff01;&#xff01;&…

C# 11 更加实用的 nameof

C# 11 更加实用的 nameofIntro从 C# 6.0 开始&#xff0c;我们可以开始使用 nameof 来引用参数名称&#xff0c;在可能使用 nameof 的地方&#xff0c;一般都推荐使用以便于重构时的自动更新&#xff0c;在之前的 C# 版本中&#xff0c;如果想要在方法参数中或者方法 attribute…

【玩转SQLite系列】目录收藏

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/u010785585/article/details/53326323 转载请注明出处&#xff1a;http://blog.csdn.net/linglongxin24/article/details/53326323 本文出自【DylanAndroid的博客】 【玩转S…

二、首页影院/我的 栏制作《仿淘票票系统前后端完全制作(除支付外)》

页面效果&#xff0c;影院内容&#xff1a; 我的页分为登录、注册、我的&#xff0c;如果登录了那么就显示我的页面否则显示登录页。 登录页&#xff1a; 我的页&#xff1a; 一、标题头部制作 接着我们点击影院&#xff0c;发现当前页内容为空&#xff1a; 我们的影院页…

C语言试题三十四之求除1到m之内(含m)能北7或11整除的所有整数放在数组a中,通过n返回这些数的个数。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

【数据库系统经典案例】销售系统数据库分析及完整实现过程

文章目录 一、产品表以及产品添加更新二、顾客管理三、销售记帐四、统计问题一、产品表以及产品添加更新 GOODLUCK的产品表:PRODUCTS(PNO,PNAME,PR,QTY) 从该表可以知: PNO->PNAME、PR、QTY 所以这个表只能按产品编号增加行,也就是说:有新产品了,可以在这个表中…

------shell学习

dd #!/bin/bash echo Hello World!array(a b 3 "ch") for i in array;doecho ${array[i]} doneecho ${array[*]} echo ${#array[]} #--------------------------------------- vers$(uname -r) #括号表示括号里面的内容先执行 等同于反引号 echo ${vers} read -p &qu…

PPT如何让多对象排列整齐

在某幻灯片上插入了多个对象&#xff0c;如果希望快速让它们排列整齐&#xff0c;按住Ctrl键&#xff0c;依次单击需要排列的对象&#xff0c;再选择“绘图-对齐或分布”&#xff0c;最后在排列方式列表中任选一种合适的排列方式就可实现多个对象间隔均匀的整齐排列。 本文转自…

聊聊 C# 方法重载的底层玩法

最近在看 C 的方法重载&#xff0c;我就在想 C# 中的重载底层是怎么玩的&#xff0c;很多朋友应该知道 C 是不支持重载的&#xff0c;比如下面的代码就会报错。#include <stdio.h>int say() {return 1; } int say(int i) {return i; }int main() {say(10);return 0; }从错…

Nginx图片剪裁模块探究 http_image_filter_module

#yum install -y gd-devel Install add http_image_filter_module Module #./configure --prefix/usr/local/nginx_image_filter/ --with-http_image_filter_module #make && make install use: off:关闭模块处理 test:确保图片是jpeg gif png否则返415错误 size:输出有…

Android WebView 图片超出宽度自适应,点击查看大图

webView 配置 WebSettings webSettings webView.getSettings(); webSettings.setJavaScriptCanOpenWindowsAutomatically(true);webSettings.setDomStorageEnabled(true);webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//自适应屏幕 ☆…

C语言试题三十五之找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。主函数中x是数组名,n 是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

三、我的/登录 栏制作《仿淘票票系统前后端完全制作(除支付外)》

我的页分为登录、注册、我的&#xff0c;如果登录了那么就显示我的页面否则显示登录页。 登录页&#xff1a; 我的页&#xff1a; 一、登录页制作 1.1 登录头制作 首先我们创建一个行&#xff0c;命名为登录块&#xff0c;设置高度为包裹&#xff1a; 之后将会在这个行中…

ASP.NET站点配置以及VS2008下C#、JavaScript联合调试(Ajax) ----以最短路径Dijstra最短路问题为例

实验任务描述: 用VS2008构造ASP.NET站点开发环境;用ASP.NET完成JavaScript开发调试;用Ext3.0.0完成一个简单的树显示站;WebService程序设计,Dijstra最短路Web 服务;JavaScript通过Ajax技术调用WebService;一、Windows下WEB共享设置 打开你的WINDOWS,鼠标点开“我的电脑”…