在一次处理系统上的性能问题上,发现去掉trycatch块之后,性能提示巨大,所以写了一个demo进行测试
测试环境中分别设置
1.只有循环不捕获异常,
private void trycatchtest1(int num){ for (int i = 0; i < num; i++) { int a = 1==0?1:0; } }
2.循环中trycatch并输出日志(有异常),
private void trycatchtest2(int num){ for (int i = 0; i < num; i++) { try { int a = 1/0; } catch (Exception e) { e.printStackTrace(); } } }
3.不循环的trycatch(有异常),
private void trycatchtest3(int num){ try { for (int i = 0; i < num; i++) { int a = 1/0; } } catch (Exception e) { e.printStackTrace(); } }
4.循环中trycatch不输出日志,
private void trycatchtest4(int num){ for (int i = 0; i < num; i++) { try { int a = 1/0; } catch (Exception e) { // e.printStackTrace(); } } }
5.循环trycatch并输出日志(无异常)
private void trycatchtest5(int num){ for (int i = 0; i < num; i++) { try { int a = 1; } catch (Exception e) { e.printStackTrace(); } } }
设置不同的循环次数
1.设置1000次循环的结果
1000简单的循环:0 1000循环trycatch捕获并抛出异常:78 1000trycatch捕获并抛出异常:0 1000循环trycatch捕获不抛出异常:5 1000循环trycatch捕获不到异常:1
2.设置100000次循环
100000简单的循环:1 100000循环trycatch捕获并输出日志:3040 100000trycatch捕获并输出日志:0 100000循环trycatch捕获不输出日志:208 100000循环trycatch捕获不到异常:1
3.设置10000000次循环
10000000简单的循环:4 10000000循环trycatch捕获并输出日志:140000 10000000trycatch捕获并输出日志:0 10000000循环trycatch捕获不输出日志:340 10000000循环trycatch捕获不到异常:3
总结
从测试结果可以看出来,简单的循环、一次的trycatch、循环中trycatch但是无异常的情况下耗时影响不大
但是在循环中trycatch并捕获到异常时,耗时较长,其中不输出日志的相对少一点,输出日志的耗时特别长
如果不抛异常的话,其实性能是没多少影响的,或者说性能的影响微乎其微,几乎可以忽略不计。
但是,如果抛异常了,这就会造成很大的性能影响。当抛异常的时候,需要去生成一个栈跟踪(stack track),
这个主要是描述异常的相关信息,比如会对当时栈进行快照,记录栈帧所指向的类名,方法名,
以及在哪一行代码上抛出的异常信息等等,这就是用异常捕获耗时的地方了。
因此,在实际开发过程中,要适当捕获异常,而且仅捕获有必要的代码段。
建议
1.在能预知到会出现的异常,尽量不使用trycatch
2.不用在循环很多次的方法里使用trycatch并输出日志
原理还没时间寻找,后续继续更新吧
标签:记录,int,性能,循环,trycatch,日志,异常,捕获 From: https://www.cnblogs.com/charleyyxc/p/16832955.html