java 异常的效率_Java Exception性能问题

Feedback

# re: Java Exception性能问题[未登录]

2010-07-09 16:50

Jacky

值得借鉴 3Q  回复  更多评论

# re: Java Exception性能问题

2010-07-09 16:54

去改变

# re: Java Exception性能问题

2010-07-09 18:45

rox

一直知道异常过多,会有问题,但不知道为什么?

谢谢了!  回复  更多评论

# re: Java Exception性能问题

2010-08-12 17:58

啊宝

我们的系统也是用异常做的控制业务流程的,提到异常就烦  回复  更多评论

# re: Java Exception性能问题

2010-08-13 09:08

stone2083

@啊宝

控制流程用Exception(try..catch)也好,还是ResultModel(if..else)也罢.只是不同的设计理念而已.

都可以,都对

至于提到异常烦,如果是为性能问题.我以为大可不必.

1.异常的性能没那么差.在上面的测试中,一个异常的产生,0.02ms而已

2.大多数的应用,对性能要求并非很高

3.引起性能瓶颈的,往往是不合理的设计,错误的使用同步等业务代码产生的.

4.实在不行,就是用改进后的异常

如果再不行,那么只好抛弃业务异常吧

如果再不行,那么只好抛弃java改用c等语言吧.

选择一种语言也好,选择一种设计也罢,只是为了更好的处理需求而已.

至于上文,只是为了描述异常的本质.在了解原理的基础上,让业务异常的使用不出现性能的浪费而已.

绝不是表明,异常性能真得对系统产生了影响 :)

回复  更多评论

# re: Java Exception性能问题

2012-09-20 12:18

alswl

感谢分析,知道为什么异常引起瓶颈了  回复  更多评论

# re: Java Exception性能问题

2012-11-27 17:07

fillInStackTrace的 synchronized 无影响

测试 new Exception() 时,我多测试一个自定义异常,在其中覆写,fillInStackTrace,但是,带着 synchronized 修饰符。运行结果显示:是否带有 synchronized 修饰符 对耗时没有任何影响

win7

java version "1.6.0_37"

Java(TM) SE Runtime Environment (build 1.6.0_37-b06)

Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01, mixed mode)  回复  更多评论

# re: Java Exception性能问题

2012-11-27 17:10

fillInStackTrace的 synchronized 无影响

# re: Java Exception性能问题

2012-11-28 11:27

stone2083

@fillInStackTrace的 synchronized 无影响

throw对于jvm来说,只是一条athrow指令,将异常压栈出栈而已。所以开销非常小。

至于synchronized测试,能否将你的测试代码贴一下(是在多线程条件下测试的吗?)

我之前的数据没有了,这次新做了测试,差异还是很大的。

20个线程下:

Opt Take Time: 1372

Gen Take Time: 36510

50个线程下:

Opt Take Time: 3906

Gen Take Time: 88240

mac jdk 1.6 64bit  回复  更多评论

# re: Java Exception性能问题

2013-01-20 01:17

weipeng

@stone2083

我这边单线程测试,不使用同步的已经比使用同步的快了约3倍。所以同步还是有影响的,毕竟有monitor的进入和退出。

ps:

业务异常我也比较喜欢,但是就是有篡改失败的结果的可能,比如偷懒catch了Exception。

try {

// member 不存在

throw new BusinessException(Xxx);

// offer不存在

throw new BusinessException(Yyy);

// 调用一些业务接口,如 xxx.create(param); 但是它throws 自定义异常

} catch (Exception) { // 对捕获到业务接口的异常,想返回系统错误

throw new BusinessException("SystemError...");

}

这样就造成了,如果member不存在,那么就返回系统错误了,而不是原来想的member不存在的业务编码了。

所以,我觉得如果使用业务异常来做控制,那么调用端,在调用时可以避免对错误的判空,而且层次感通过catch来的比较养眼。但是有点劣势的就是要求在实现内部对于异常的处理要求非常统一。  回复  更多评论

# re: Java Exception性能问题

2013-01-21 11:03

stone2083

@weipeng

确实,存在如你所说的问题。

但是问题的本质还在于使用者,忽视业务分支逻辑导致的。

即便使用If Else,也存在类似的问题(只是发生普遍性相对会小),如:

if(result.isMemberNotFound || result.isOfferNotFound) {

System.out.println("Sys Error.");

}

我现在到不纠结使用哪种形式,唯一要求是:同个项目内部要保持风格统一,并且规范使用。  回复  更多评论

# re: Java Exception性能问题[未登录]

2013-12-17 16:07

呵呵

异常不应该被用来做业务,即使通过改写也一样,同样需要创建一个实例,new一个实例同样是不小的开销,虚拟机还要对他进行回收。如果异常情况反复出现,同样会大量消耗系统资源。异常当然是用来做异常的,异常字面意思就是系统运行正常的时候不应该出现的,如果出现了才被认为是异常。所以异常应该是很少出现的,由于使用try-catch减少了if判断,提升了性能。所以异常是为了提升性能的,不是用来消耗性能的。  回复  更多评论

# re: Java Exception性能问题

2014-08-15 16:08

wyc

classloader不是就是用异常来处理业务的么,自己定义的类肯定要通过异常截获来加载  回复  更多评论

# re: Java Exception性能问题

2014-11-24 17:50

zuidaima

# re: Java Exception性能问题[未登录]

2015-12-16 14:48

小明

没有并发,测试准么?  回复  更多评论

# re: Java Exception性能问题

2015-12-16 19:18

stone2083

@小明

private static final ExecutorService POOL = Executors.newFixedThreadPool(30);  回复  更多评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值