使用return 和 throw 中断函数执行,性能对比,及优化

Posted xiaodu9499

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用return 和 throw 中断函数执行,性能对比,及优化相关的知识,希望对你有一定的参考价值。

在javaweb开发过程中使用throw 自定义异常,配合全局异常捕获可以大大减少代码量,提升开发效率,在近期项目codereview中,

有小伙伴提出通过throw来中断效率不如直接retrun,之后查阅资料 ( https://stackoverflow.com/questions/36343209/which-part-of-throwing-an-exception-is-expensive ) ,发现主要是  Throwable 类中的  fillInStackTrace() 函数,影响性能,此函数的主要功能是,遍历调用堆栈并手机堆栈的类,方法名称,行号等, 对于实际项目使用中自定义异常往往不需要此类信息,比如参数校验的场景,只需将校验信息抛出即可,

所以在实际使用中,如果不需要堆栈信息可以重写  fillInStackTrace()  函数

 1 public class MyException extends RuntimeException {
 2 
 3     public MyException(String message) {
 4         super(message);
 5     }
 6 
 7     @Override
 8     public synchronized Throwable fillInStackTrace() {
 9         return this;
10     }
11 }

重写之后经过简单测试,发现性大幅所提升,但依旧没有直接retrun高效, 测试代码地址:   https://github.com/xiaodu9499/cnblogs_demo/tree/master/return_or_throw/ 

技术图片

 

以上是关于使用return 和 throw 中断函数执行,性能对比,及优化的主要内容,如果未能解决你的问题,请参考以下文章

C++中,用throw抛出异常后,throw之后的语句是不是继续执行?

return阻止js继续向下执行

举例说明c语言中的中断语句break,continue,return的区别及相同之处

ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用

ES6中Iterator 接口与 Generator 函数以及遍历器对象的 return(),throw()使用

由return联想到的