Java上的try catch并不影响性能(转)

转自:http://blog.csdn.net/tao_zi7890/article/details/17584813

最近因为担心自己开发的库不稳定,会影响到接入产品的正常运行,在代码的不少地方都加了一层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绝对不是在什么地方都可以乱加的!怎么用,很多地方都有说,就不在这累赘了。

时间: 2025-01-01 13:45:36

Java上的try catch并不影响性能(转)的相关文章

Java中不同的并发实现的性能比较

原文链接   作者:Alex Zhitnitsky   译者:有孚 Fork/Join框架在不同配置下的表现如何? 正如即将上映的星球大战那样,Java 8的并行流也是毁誉参半.并行流(Parallel Stream)的语法糖就像预告片里的新型光剑一样令人兴奋不已.现在Java中实现并发编程存在多种方式,我们希望了解这么做所带来的性能提升及风险是什么.从经过260多次测试之后拿到的数据来看,还是增加了不少新的见解的,这里我们想和大家分享一下. ExecutorService vs. Fork/J

JAVA 上加密算法的实现用例

 JAVA 上加密算法的实现用例    1.1. 单钥密码体制 单钥密码体制是一种传统的加密算法,是指信息的发送方和接收方共同使用同一把密钥进行加解密. 通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.但是加密的安全性依靠密钥保管的安全性 , 在公开的计算机网络上安全地传送和保管密钥是一个严峻的问题,并且如果在多用户的情况下密钥的保管安全性也是一个问题. 单钥密码体制的代表是美国的 DES 1.2. 消息摘要 一个消息摘要就是一个数据块的数字指纹.即对一个任意长

java上传视频截图

1,到CSDN下载: ffmpeg和mencoder命令使用的总结(超级全面) 2,两个程序: package national; import java.util.ArrayList; import java.util.List; public class VideoProcess { public static boolean processTransToImg2(String oldfilepath,String newfilename,String newimg){ System.out

ftp服务器-Java上传到fth时提示Connection closed without indication.

问题描述 Java上传到fth时提示Connection closed without indication. 如题,自己在系统中直接上传的话是可以的,但用代码上传就不行了,代码是这样的 package cn.com.sensetech.ftp; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import org.apache

PHP __autoload()方法真的影响性能吗?_php技巧

介绍 对于php性能问题,议论最多的就是__autoload()方法,很多人提到这个方法非常影响性能.还有人说opcode也能影响到__autoload()方法,所以针对这两点我做了个测试. 最终发现__autoload方法在性能方面的影响不是很大的. 环境 PHP:5.3.9 --以fastcgi模式启动 Nginx:1.1.12 eaccelerator:0.9.6.1 .   最终发现__autoload方法在性能方面的影响不是很大的.  环境    PHP:5.3.9 --以fastcg

用jep在java上运行python报错

问题描述 用jep在java上运行python报错 显示错误 ImportError: No module named site 代码是这样的 String SCRIPT_PATH = "D:\codes\Python\StockDataAnalysis\MatGraph.py"; try { Jep jep = new Jep(); jep.runScript(SCRIPT_PATH); } catch (Exception ex) { ex.printStackTrace(); }

mysql Copying to tmp table on disk 影响性能

经过查资料发现mysql可以通过变量tmp_table_size和max_heap_table_size来控制内存表大小上限,如果超过上限会将数据写到磁盘上,从而会有物理磁盘的读写操作,导致影响性能. 我们可以通过调整这两个变量的值来提升性能(当然前提条件是mysql所在服务器有足够的内存). 首先可以通过下面语句查看当前的变量值: SHOW VARIABLES LIKE 'max_heap_table_size%'; 然后通过SET GLOBAL max_heap_table_size=522

开源-java上传下载文件服务器选择

问题描述 java上传下载文件服务器选择 目前在做一个ssh的项目,项目中的图片文件比较多, 寻思着再搭建一个文件服务器,可以通过api进行文件上传下载就可以了. 对着方面不太了解,不知道可以采用哪个. 最好是流行,开源的,稍微了解了一下seafile,FASTDfs. 希望熟悉的人能给我推荐一个啊. 解决方案 直接用aws,提供了现成的blob file server

Java换行会对效率有影响吗?

问题描述 Java换行会对效率有影响吗? 换行 对效率有影响吗,写程序会对一个模块进行换行,今天有人告诉我这会对程序有影响. 解决方案 理论上会对编译的速度有影响,好比人站直了比躺下理论上在中午会离太阳近一些. 解决方案二: 如果你考虑这个影响,就相当于你每天呼吸空气都要考虑新不新鲜~ 与其考虑这个效率 不如 改变代码的效率! 解决方案三: 代码是给人看的! 你可以试试写两个helloworld,一个写的非常紧密,一个{}里非常多空格和换行,看下编译后的.class文件大小 解决方案四: 换行既