<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
異常和正常程式碼效能旗鼓相當,但是全域性過濾器對效能影響比較大,大概降低了60%左右,全域性過濾器走了管道,但是這跟微軟官方的效能優化又有衝突,想必微軟官方也是出於對全域性過濾器例外處理的考慮吧。同時對於新增了業務的情況下,這個降低會被稀釋,沒去做壓測對比哈,正常使用者體量還不至於被這個給影響到穩定性。所以怎麼取捨看自己
在.net 相關技術群、網路上及身邊技術討論中看到過關於大量拋異常會影響效能這樣的結論,心中一直就存在各種疑問。專案中使用自定義異常來處理業務很爽,但是又擔心大量拋業務異常存在效能問題。
查閱了各種檔案,微軟官方對效能優化這一塊也不建議使用過多的異常,故我心中冒出疑問。
/// <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) { //不做任何處理,直接返回1 context.Result = new JsonResult("1"); } } //全域性過濾器注入 services.AddControllers() .AddMvcOptions(option => { option.Filters.Add<ExceptionFilter>(); });
現在對test1 介面並行200的情況下進行壓測,持續15分鐘的壓測結果如下:
對通過全域性過濾器捕獲異常並大量丟擲異常 在相同壓測條件情況下的壓測結果如下:
對test1 和test2 同等條件下壓測結果對比
介面 | tps | cpu | 壓測條件 |
---|---|---|---|
test1 | 10300左右 | cpu消耗90%左右 | 並行200,持續壓測 |
test2 | 4300左右 | 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 介面進行壓測,壓測結果如下:
介面 | tps | cpu佔用 | 壓測條件 |
---|---|---|---|
test1 | 10300左右 | 90% 左右 | 並行200,持續壓測 |
test2 | 9200左右 | 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 程式碼進行壓測結果如下:
忘記截圖,大概和修改後的test2 程式碼壓測結果相差不大,大概tps 9300左右,故還是拿的上一個圖貼出來,諒解
介面 | tps | cpu佔用 | 壓測條件 |
---|---|---|---|
test1 | 9300左右 | 90%左右 | 並行200,持續壓測 |
test2 | 9200左右 | 90%左右 | 並行200,持續壓測 |
進一步得到的結論是try catch 後效能和正常返回程式碼效能相當,相差無幾,可以忽略不計
最後丟擲一個待求證的問題
以上結論個人壓測結果,如有不對,歡迎交流糾正
https://docs.microsoft.com/zh-cn/dotnet/standard/design-guidelines/exceptions-and-performance
到此這篇關於.net core 拋異常對效能影響的求證之路的文章就介紹到這了,更多相關.net core 拋異常效能影響內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45