java基础 – 异常性能分析
异常使用频率较高,不再赘述基础使用部分,主要分析一下异常与性能的关系
以下是几段代码分析一下,性能与异常的关系
正常代码
public void test1(){
long start=System.currentTimeMillis();
for (int i=0;i<2000000000;i++){
i=(i*i-i+i)*i/2+7*33+4055-45+7;
}
long end=System.currentTimeMillis();
System.out.println("time1:"+(end-start));
}
正常代码嵌套try catch
public void test2(){
long start=System.currentTimeMillis();
try{
for (int i = 0; i < 2000000000; i++){
i=(i*i-i+i)*i/2+7*33+4055-45+7;
}
}catch (Exception e){
System.out.println(e.getMessage());
}
long end = System.currentTimeMillis();
System.out.println("time2:"+(end-start));
}
正常代码for循环内嵌套try catch
public void test3(){
long start=System.currentTimeMillis();
for (int i = 0; i < 2000000000; i++){
try{
i=(i*i-i+i)*i/2+7*33+4055-45+7;
}catch (Exception e){
System.out.println(e.getMessage());
}
}
long end = System.currentTimeMillis();
System.out.println("time3:"+(end-start));
}
异常代码
public void test4(){
long start=System.currentTimeMillis();
for (int i = 0; i < 2000000000; i++)
{
try
{
i=(i*i-i+i)*i/2+7*33+4055-45+7;
throw new RuntimeException("声明异常");
}catch (Exception e){
}
}
long end = System.currentTimeMillis();
System.out.println("time4:"+(end-start));
}
执行运行后
test1->time1:511
test2->time2:546
test3->time3:706
test4->挂掉
经过多次执行大体趋势与上面结果基本相似,略有差异
性能高到低排序
test1->test2->test3->test4
发生异常消耗性能的原因
下图是《深入理解虚拟机 第三版》中的资料
1.方法的同步是隐式,通过锁控制,以保证线程安全
2.异常性能主要影响在于形成在用户态->内核态->用户态,状态转化时性能产生的消耗。内核态主要是对于发生异常代码进行的栈的追踪过程。
3.构造异常实例的时候需要生成该异常的栈轨迹,这个操作会逐一访问当前线程的栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常等信息,这就是使用异常捕获耗时的主要原因了。