Java上的try catch并不影响性能
2014-01-15 04:06
162 查看
转自:
http://devspirit.blog.163.com/blog/static/164255315201214114218742/
最近因为担心自己开发的库不稳定,会影响到接入产品的正常运行,在代码的不少地方都加了一层try catch,主要是为了避免自己的一些异常抛出导致,应用crash,捕获的异常也并没有做什么特别的处理,只是在log中输出该异常的信息。try catch多了后,就开始担心会不会影响性能,以前学C或C++的时候好像曾经被警告过要尽量少使用try catch,好像是在压栈的时候会更消耗神马的,其实说真的并没有认真的研究过try和不try具体运行起来,区别在哪。反正就是一顿心慌,想想还是查一下吧。
强大的google还是告诉我,跟我一样有疑惑的人不少,终于再一个询问帖中找到了答案及解答。
问题:A 和B在性能上的区别在哪?
A:
B:
其实在功能上明显有区别,一个for循环中出现一个异常就终止,另一个则是会很负责任的把它全部跑完,但问题不是问功能,而是问性能上的区别。
性能无非就是看 空间消耗,时间消耗 ,想当然就觉得try catch重复执行了这么多次肯定比只执行了一次跑得肯定慢,空间消耗肯定更大。好吧,哥承认完全不了解其中的工作原理。
讨论的结果是:在没有抛出异常的情况下,性能完全没区别。
讨论帖地址:http://stackoverflow.com/questions/141560/should-try-catch-go-inside-or-outside-a-loop
答案在贴子里就有了,try catch的工作原理解析地址也顺带指了出来(老外在论坛回答问题,真是非常的厚道啊,不像国内的一般都是一两句话直接带过了)。
异常处理帖地址:http://www.javaworld.com/javaworld/jw-01-1997/jw-01-hood.html?page=1
全英文的,写得非常详细,哥不在这细说了,把我自己理解的核心给大家分享一下:
1、类会跟随一张 异常表(exception table),每一个try catch都会在这个表里添加行记录,每一个记录都有4个信息(try catch的开始地址,结束地址,异常的处理起始位,异常类名称)。
2、当代码在运行时抛出了异常时,首先拿着抛出位置到异常表中查找是否可以被catch(例如看位置是不是处于任何一栏中的开始和结束位置之间),如果可以则跑到异常处理的起始位置开始处理,如果没有找到则原地return,并且copy异常的引用给父调用方,接着看父调用的异常表。。。以此类推。
综合上面来看可以得出结论:
1、异常如果没发生,也就不会去查表,也就是说你写不写try catch 也就是有没有这个异常表的问题,如果没有发生异常,写try catch对性能是木有消耗的,所以不会让程序跑得更慢。
2、try 的范围大小其实就是异常表中两个值(开始地址和结束地址)的差异而已,也是不会影响性能的。
当然try catch绝对不是在什么地方都可以乱加的!怎么用,很多地方都有说,就不在这累赘了。
讨论的结果是:在没有抛出异常的情况下,性能完全没区别。
讨论帖地址:http://stackoverflow.com/questions/141560/should-try-catch-go-inside-or-outside-a-loop
答案在贴子里就有了,try catch的工作原理解析地址也顺带指了出来(老外在论坛回答问题,真是非常的厚道啊,不像国内的一般都是一两句话直接带过了)。
异常处理帖地址:http://www.javaworld.com/javaworld/jw-01-1997/jw-01-hood.html?page=1
全英文的,写得非常详细,哥不在这细说了,把我自己理解的核心给大家分享一下:
1、类会跟随一张 异常表(exception table),每一个try catch都会在这个表里添加行记录,每一个记录都有4个信息(try catch的开始地址,结束地址,异常的处理起始位,异常类名称)。
2、当代码在运行时抛出了异常时,首先拿着抛出位置到异常表中查找是否可以被catch(例如看位置是不是处于任何一栏中的开始和结束位置之间),如果可以则跑到异常处理的起始位置开始处理,如果没有找到则原地return,并且copy异常的引用给父调用方,接着看父调用的异常表。。。以此类推。
综合上面来看可以得出结论:
1、异常如果没发生,也就不会去查表,也就是说你写不写try catch 也就是有没有这个异常表的问题,如果没有发生异常,写try catch对性能是木有消耗的,所以不会让程序跑得更慢。
2、try 的范围大小其实就是异常表中两个值(开始地址和结束地址)的差异而已,也是不会影响性能的。
当然try catch绝对不是在什么地方都可以乱加的!怎么用,很多地方都有说,就不在这累赘了。
http://devspirit.blog.163.com/blog/static/164255315201214114218742/
最近因为担心自己开发的库不稳定,会影响到接入产品的正常运行,在代码的不少地方都加了一层try catch,主要是为了避免自己的一些异常抛出导致,应用crash,捕获的异常也并没有做什么特别的处理,只是在log中输出该异常的信息。try catch多了后,就开始担心会不会影响性能,以前学C或C++的时候好像曾经被警告过要尽量少使用try catch,好像是在压栈的时候会更消耗神马的,其实说真的并没有认真的研究过try和不try具体运行起来,区别在哪。反正就是一顿心慌,想想还是查一下吧。
强大的google还是告诉我,跟我一样有疑惑的人不少,终于再一个询问帖中找到了答案及解答。
问题:A 和B在性能上的区别在哪?
A:
try { for(int i = 0; i < max; i++) { String myString = ...; float myNum = Float.parseFloat(myString); myFloats[i] = myNum; } } catch (NumberFormatException ex) { return null; }
B:
for(int i = 0; i < max; i++) { String myString = ...; try { float myNum = Float.parseFloat(myString); } catch (NumberFormatException ex) { return null; } myFloats[i] = myNum; }
其实在功能上明显有区别,一个for循环中出现一个异常就终止,另一个则是会很负责任的把它全部跑完,但问题不是问功能,而是问性能上的区别。
性能无非就是看 空间消耗,时间消耗 ,想当然就觉得try catch重复执行了这么多次肯定比只执行了一次跑得肯定慢,空间消耗肯定更大。好吧,哥承认完全不了解其中的工作原理。
讨论的结果是:在没有抛出异常的情况下,性能完全没区别。
讨论帖地址:http://stackoverflow.com/questions/141560/should-try-catch-go-inside-or-outside-a-loop
答案在贴子里就有了,try catch的工作原理解析地址也顺带指了出来(老外在论坛回答问题,真是非常的厚道啊,不像国内的一般都是一两句话直接带过了)。
异常处理帖地址:http://www.javaworld.com/javaworld/jw-01-1997/jw-01-hood.html?page=1
全英文的,写得非常详细,哥不在这细说了,把我自己理解的核心给大家分享一下:
1、类会跟随一张 异常表(exception table),每一个try catch都会在这个表里添加行记录,每一个记录都有4个信息(try catch的开始地址,结束地址,异常的处理起始位,异常类名称)。
2、当代码在运行时抛出了异常时,首先拿着抛出位置到异常表中查找是否可以被catch(例如看位置是不是处于任何一栏中的开始和结束位置之间),如果可以则跑到异常处理的起始位置开始处理,如果没有找到则原地return,并且copy异常的引用给父调用方,接着看父调用的异常表。。。以此类推。
综合上面来看可以得出结论:
1、异常如果没发生,也就不会去查表,也就是说你写不写try catch 也就是有没有这个异常表的问题,如果没有发生异常,写try catch对性能是木有消耗的,所以不会让程序跑得更慢。
2、try 的范围大小其实就是异常表中两个值(开始地址和结束地址)的差异而已,也是不会影响性能的。
当然try catch绝对不是在什么地方都可以乱加的!怎么用,很多地方都有说,就不在这累赘了。
讨论的结果是:在没有抛出异常的情况下,性能完全没区别。
讨论帖地址:http://stackoverflow.com/questions/141560/should-try-catch-go-inside-or-outside-a-loop
答案在贴子里就有了,try catch的工作原理解析地址也顺带指了出来(老外在论坛回答问题,真是非常的厚道啊,不像国内的一般都是一两句话直接带过了)。
异常处理帖地址:http://www.javaworld.com/javaworld/jw-01-1997/jw-01-hood.html?page=1
全英文的,写得非常详细,哥不在这细说了,把我自己理解的核心给大家分享一下:
1、类会跟随一张 异常表(exception table),每一个try catch都会在这个表里添加行记录,每一个记录都有4个信息(try catch的开始地址,结束地址,异常的处理起始位,异常类名称)。
2、当代码在运行时抛出了异常时,首先拿着抛出位置到异常表中查找是否可以被catch(例如看位置是不是处于任何一栏中的开始和结束位置之间),如果可以则跑到异常处理的起始位置开始处理,如果没有找到则原地return,并且copy异常的引用给父调用方,接着看父调用的异常表。。。以此类推。
综合上面来看可以得出结论:
1、异常如果没发生,也就不会去查表,也就是说你写不写try catch 也就是有没有这个异常表的问题,如果没有发生异常,写try catch对性能是木有消耗的,所以不会让程序跑得更慢。
2、try 的范围大小其实就是异常表中两个值(开始地址和结束地址)的差异而已,也是不会影响性能的。
当然try catch绝对不是在什么地方都可以乱加的!怎么用,很多地方都有说,就不在这累赘了。
相关文章推荐
- Java上的try catch并不影响性能(转)
- Java上的try catch并不影响性能(转)
- (2.3.14)Java上的try catch并不影响性能(转)
- Java上的try catch并不影响性能(转)
- Java上的try catch并不影响性能
- android try catch并不影响性能
- Java 中的 try catch 影响性能吗?
- 论JAVA 在项目中使用system.out打印调试信息的性能影响
- java中try catch放循环体内外对程序性能的区别
- 影响java性能的主要因素及调优
- C#中使用try catch对系统性能的影响和处理机制的学习总结和疑问!
- Java :异常影响性能吗
- JS中用try catch对代码运行的性能影响分析
- JAVA 异常对于性能的影响
- try catch 对性能影响
- 论 try catch是否影响性能
- Java编程中影响性能的一些特点
- Mongo Java Driver中连接数对性能的影响
- java(android)编程中存在性能影响的主要方面