登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
博客
发1篇日志+1圆
记录
发1条记录+2圆币
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
VIP网盘
VIP申请
网盘
联系我们
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
再次探讨企业级开发中的Try......Catch性能问题 ...
再次探讨企业级开发中的Try......Catch性能问题
[ 复制链接 ]
唐嘉懿
2025-5-29 15:03:14
引言
之前写过一篇文章《在企业级开发中使用Try...Catch...会影响效率吗?》一文,得到了不少朋友的关注,自己也与大家私下交流了一些东西。
为了最快的让大家明白本文的内容,我先把本文的内容列个提纲,提纲如下:
Try...Catch中大家普遍认为的结论
尽可能的考虑真实环境的再次做测试并进行分析
之前文章中有错误的几点内容
总结
正文部分
第一部分
对于之前的文章,大家的主要意见有如下:
Try...Catch不会有性能问题
Try...Catch会对性能有一定的影响
对我的测试结果有争议
测试没有考虑所有环境,如预热、网络异常等等
不应该用异常处理来作为逻辑处理
还是主观上感觉try...catch还是会有性能影响,但是到底会有多大,不好说。
置疑“企业级开发”这个概念
第二部分
针对以上的一些问题,本着没有困难,创造困难也要上的精神,笔者又做了一些测试,但是考虑到真实环境,及可能出现的问题,代码或多或少有所改动。考虑到的因素有:
throw new Exception("Kevin让我异常了");这个异常抛出方法是抛出普通的异常方法,而实际开发中,可能出现的异常类的数量都非常的庞大,笔者粗略的估计了一下,可能至少得有上千种,而且还可以自定义异常类,如果按照这个来算的话,异常类的数量应该是无穷的。
异常类有的处理起来时间会长,有的处理起来时间会短,有朋友认为网络处理方面的异常处理起来可能时间会稍长一些,一旦用try...catch的话,处理起来时间可能会长。
如果说一个函数的Try...Catch的性能损耗时间比较短,那么1000个函数的性能损耗会不会很长?比如,系统中有1000个函数,每个函数中都有一个try...catch,然后又一个方法调用了这1000个函数。 针对这一点,就可以把try...catch...放在for循环里喜欢1000次来进行测试。
测试中的预热问题,尽可能的多考虑真实环境。
针对以上问题,笔者尽可能的换些异常类进行测试,然后将try...catch...放到for循环中进行测试。测试得到如下结论:
没有使用try...catch不出现异常跟使用了try...catch不出现异常 时间相当。
try...catch...的时间=从执行函数开始到出现异常的时间+异常捕获的时间+异常处理的时间。而异常捕获的时间通常微乎其微,如果是单次的话,可以忽略不计,也不会造成性能瓶颈。
如果只做异常捕获,但是不做异常处理的话,循环1000次出现异常的时间约是使用了try...catch不出现异常的391.9倍。
因为异常处理的时间由多个部分组成,因为不同异常捕获到的时间可能不同,异常处理的时间也不尽相同,就会导致最后时间加起来结果跟我测试的会有差别。
在进行以下的分析之前,笔者也请大家认真的思考两个问题:
什么问题算性能问题?
什么是性能瓶颈?
第三部分
纠正之前文章中的几点错误:
try...catch...会造成一定的性能损失,但并不是比不用try...catch...性能要高。
数据库操作使用事务比不使用事务要速度快的问题。
关于数据库操作使用事务比不使用事务快的问题,得分两个方面来考虑:
如果是一个人操作的话,使用事务会比不使用事务要快。
如果是多个人操作,使用事务就不一定快了,道理很简单,使用事务的话,是利用锁来进行并发控制的,如果盲目的认为使用事务快,而滥用事务,那么就可能导致很严重的性能问题,多个用户进行并发操作的时候,全部被一个人锁住了,得一个一个的来,可想而知,极有可能会因为滥用事务而造成性能瓶颈。笔者之前没有考虑到第二点,不过值得庆幸的是,我也从来没有滥用过事务。
第四部分
总结
:
Try...Catch...会损耗一定的性能,但不会造成性能瓶颈。
建议使用try...catch。
尽可能的考虑到可能存在的异常并进行处理,尽可能的少出现异常或不出现异常。
不要滥用数据库事务提高性能,这样可能会造成并发访问的性能问题或性能瓶颈。
不要使用try...catch进行流程处理。
如果可能的话,尽量要把循环写在try...catch内部,而不要把try...catch放到循环内部。
如果是try...catch中套着try...catch,异常处理机制是从内部的try...catch...往外部抛的,最先是在内部进行捕获、处理。
关于测试。虽然测试还是不能完全的达到真实环境,实际上真实的环境也是错综复杂的,很难完全兼顾,但至少目前的测试来说,笔者认为,还是达到了我想要的目的。
关于什么是企业级开发?笔者也只是有个模糊的概念,从Google上搜索到了一下一段,与大家分享下吧:
企业级开发主要是针对企业级应用的开发。
那么什么是企业级应用呢?
企业级应用是指那些为商业组织、大型企业而创建并部署的解决方案及应用。这些大型企业级应用的结构复杂,涉及的外部资源众多、事务密集、数据量大、用户数多,有较强的安全性考虑。
当代的企业级应用决不可能是一个个相互独立的系统。在企业中,一般都会部署多个彼此连接的、相互通过不同集成层次进行交互的企业级应用,同时这些应用又都 有可能与其它企业的相关应用连接,从而构成一个结构复杂的、跨越Intranet和Internet的分布式企业应用群集。
此外,作为企业级应用,其不但要有强大的功能,还要能够满足未来业务需求的变化,易于升级和维护。
实际上看到这里,大家可能对企业级开发有一个粗略的认识了,虽然概念已经给出,可是对于理解什么是企业级开发,还是有一些困难。可能有的人也会问,概念都给你了,为什么还这么难理解?实际上笔者认为,看待某个问题,得从多个方面来看,才理解的深刻,如当你问什么是唯心主义,实际上唯心主义是针对唯物主义来进行定义的,当你不明白唯心主义的时候,恐怕也是很难区分清楚唯物主义的。
就像企业级应用是按照什么分类的?难道还有个人级开发......?
最近博客园流行几个新词:”吉日风格“、”吉日风格的水贴“,可是究竟什么是吉日风格,满足什么条件才算吉日风格?满足什么条件又算是水贴?
其实这些都是非常主观的的概念,既然很主观,就没必要去深究了。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
程序
安全
签约作者
程序园优秀签约作者
发帖
唐嘉懿
2025-5-29 15:03:14
关注
0
粉丝关注
21
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
凶契帽
9990
处匈跑
9990
4
黎瑞芝
9990
5
杭环
9988
6
猷咎
9988
7
鲫疹
9988
8
接快背
9988
9
里豳朝
9988
10
氛疵
9988
查看更多