请详细分析或者发个有详细分析的链接。
嫌我问题短。。。把代码也发一下吧。
double b = 0; String s = ""; long ii = System.currentTimeMillis(); for(int i = 0; i<20000;i++) { try { b = StrictMath.pow(b+i, 1.0/3); s = s + b+";"; }catch(Exception e){ e.printStackTrace(); }finally { } } //System.out.println("b = "+b + "\ns = "+ s); System.out.println(System.currentTimeMillis()-ii); double c = 0; String ss = ""; long iii = System.currentTimeMillis(); for(int i = 0; i<20000;i++) { c = StrictMath.pow(c+i, 1.0/3); ss = ss + c+";"; } //System.out.println("b = "+c + "\nss = "+ ss); System.out.println(System.currentTimeMillis()-iii);
这是我的测试代码,输出如下
17114
16397
你可以把
for(int i = 0; i<20000;i++) {
try {
b = StrictMath.pow(b+i, 1.0/3);
s = s + b+";";
}catch(Exception e){
e.printStackTrace();
}finally {
}
}
修改为:
try {
for(int i = 0; i<20000;i++) {
b = StrictMath.pow(b+i, 1.0/3);
s = s + b+";";
}
}catch(Exception e){
e.printStackTrace();
}finally {
}
这样会好很多(依据你的循环次数而定).但是仍然比没有 try catch 的代码执行要慢.加了 try catch 后,除了会增加代码体积,还会消耗额外的资源.
因为发生了异常后,程序的执行路线需要从 try 保护体中跳转到 catch 过滤表达式中,那么编译器在编译期间必须产生必要的代码和数据结构与系统的异常分发函数密切配合,大体来讲就是分析异常处理代码的结构,封装和标记每部分,注册异常处理器函数.
从这个过程来看,在没有异常产生时,代码体积增大了,执行的语句增多了,自然程序执行效率就低;发生异常后,需要分发异常到指定的异常处理函数,析构局部变量,没有匹配的异常处理函数时,还要展开当前调用栈,向上寻找匹配的异常处理函数.
再问一下大神,2楼 贪心狸猫 说的对吗?
@剑握在手: 准确来说,不对.因为最终执行的是机器码,CPU在执行指令时会检测预先定义的某个或多个条件是否产生.所以,无论你的代码是否用 try catch 包裹,CPU在执行指令时都会检测.
很正常嘛,try异常本来就是耗系统资源的。
听说try里面的代码,每执行一句,系统要检查一下异常列表,看是否有异常,即便是int 这些声明变量的语句。
你多运行几次试试,结果肯定不一样,运行时间还跟你程序分配到的cpu时间有关,如果在运行第一个的时候电脑还在运行其他程序时间自然会比较慢。
我个人认为常说的try...catch耗资源是因为产生异常后,对系统的资源消耗比较大,不产生异常影响是不大的。