在.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"); } } 这里注入过滤器代码就不贴上来现在对test1 接口并发200的情况下进行压测,持续15分钟的压测结果如下:
对通过全局过滤器捕获异常并大量抛出异常 在相同压测条件情况下的压测结果如下:
| 接口 | tps | cpu | 压测条件 |
|---|---|---|---|
| test1 | 10300左右 | cpu消耗90%左右 | 并发200,持续压测 |
| test1 | 4300左右 | cpu消耗100%左右 | 并发200,持续压测 |
目前得到的结论是抛异常确实影响性能,并且对性能下降了60% 左右,上面主要是异常流程走了全局过滤器方式,故参考意义不大,下面再进一步修改代码进行压测
/// <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"); } }
| 接口 | tps | cpu占用 | 压测条件 |
|---|---|---|---|
| test1 | 10300左右 | 90% 左右 | 并发200,持续压测 |
| test1 | 9200左右 | 91% 左右 | 并发200,持续压测 |
进一步得到的结论是try catch 后性能有所提高,跟正常相比还有点点差距,全局过滤器对性能影响比较大,相当于走了管道,但是观察代码test1 和test2代码还存在差距,怀疑test2 代码中new 了新异常导致性能差异,故再进一步进行代码修改求证
/// <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"); }
| 接口 | tps | cpu占用 | 压测条件 |
|---|---|---|---|
| test1 | 9300左右 | 90%左右 | 并发200,持续压测 |
| test2 | 9200左右 | 90%左右 | 并发200,持续压测 |
进一步得到的结论是try catch 后性能和正常返回代码性能相当,相差无几,可以忽略不计
最后抛出一个待求证的问题
以上结论个人压测结果,如有不对,欢迎交流纠正?
如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!
