关于Try/Catch 代码块
应当放在Try/Catch 代码块中的常见任务包括连接到一个数据库或与其交互、处理文件、调用Web 服务。
老实说,我这人很少有打破沙锅问到底的精神。
不过昨晚听一技术人员跟他的项目经理说要在程序中使用try...catch...时,只见这项目经理邹邹眉说了句“try...catch...性能多差,尽量不要用。”
这句话不知道触动了我哪条神经,让这突然产生了相当好奇的心里。于是呼我就百度一下,找找相关的文章。
这么一找,才知道,原来网上讨论这个的还挺多的,而且各执一词,各有各的道理。
找到的一个例子中,虽然有把结果较详细的列出来,但貌似贴的源码有问题,会引起争议。
所以决定动手自己写个试试,看看结果究竟如何。
好了,废话多说了,下面直接来看看源码吧。
首先,介绍一下相关的测试方法:
1.使用了VS2008开发环境(我怕编译会有所影响)
2.使用命令行程序,尽量忽略其它一些因素导致的开销
3.使用NetFramework 2.0 / 3.5分别编译程序并测试
4.测试代码是分别用 NoTry / HaveTry / HaveException 三个方法,每个方法执行10次,最后计算平均值
5.为了能拖一拖时间,假装有些损耗,测试的时候,使用的是字符串叠加10000次
其次,介绍一下相关的硬件环境:
1.Acer 4732Z 本本
2.CPU:Intel Pentium T4400
3.内存:3G DDR800
下面主角来了,本次测试的源码:
为了不引起争议,我把try...catch...放在for循环内,这样就相当于每次都是一个新的try...catch。
而且HaveException方法中,是每次for循环都抛一次异常,共计抛了10000将异常。
异常的文本内容我没有添加,是怕因为字符串的相关操作倒置了计算不精准。
OK,相信代码很简单,我就不多介绍了,下面来看看结果吧:
以下是在NF2.0环境下运行的结果:
以下是在NF3.5环境下运行的结果:
结果出来了,在做了10000次字符串的叠加,平均下来,没有try的是304/303,有try的是298/299,有异常的是551/554。
结果貌似挺出乎意料的,有加try的甚至比没加try的还要来得快?(这是神马世道?我本以为会多一点点还说得过去……)
而抛出了10000次异常的HaveException也大概是没有加try的2倍。而且请注意,这是抛了10000次异常,正常我们写程序,异常机率肯定不是100%。
这样的测试结果让人很欣喜,因为我一直是try...catch...的粉丝,在程序中,我是每个用户操作的事件,都会加上try...catch...的。
这样一来,就放心很多了,以前也怀疑过,try...catch...是否真的会引起多大的开销,但经过这么一试,我想,开销还是很小的。
而且我在网上搜索的时候,有一位网友的评论我觉得很对:除了try,还有什么方法能保证程序的稳健性呢?
我想,这也是我,或者说很多人为什么要用try...catch...的最原始理由,我们都希望程序按照我们的想法去跑,但往往很多的异常都是很特殊或者说很难预料的。
1.同样的代码,把for增加到20000次:
看来String随着叠加次数的增加,性能开销会相对的增加,以NoTry的来看1W次是303,2W次是1585,多了几倍的时间。
2.那么StringBuilder性能会怎么样呢?同样的代码小作修改,这次来试下2W次StringBuilder的Append:
2W下8毫秒,我开始还以为我是不是搞错了,仔细检查下代码,确实没错。再提升一个数量级,20W次:
效率真的很不错,而且提升到20W的数量级,开销仍然没有半点增加,保持在1W次8毫秒左右。
看来很多大叔级程序员的话是真的
而且,由2W次、20W次SB的结果来看,貌似可以看出来,catch Exception的效率也不错吧,平均1W次230毫秒,亲,你就真的忽略掉吧。
好了,测试基本都完毕了,不再多说了,当然这样的测试我不知道还有没有什么局限性,或者说别的语言(JAVA之类的)会不会不一样,
但对于这个结果我想说,.net的程序员们,请放心大胆的用try...catch..吧,在没有异常的情况下,有try没try基本一样,
就算偶尔有异常了,也就是几毫秒的开销,何必那么认真呢?而且测试环境只是一台普通得不能再普通的本本,如果换到服务器上,估计开销还更小!
加了try...catch...后,别的不说,至少对于我们的程序的稳健性、debug等,都会有很大的帮助。
关于Try/Catch 代码块的更多相关文章
- “全栈2019”Java异常第四章:catch代码块作用域详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常
在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...
- Java中异常处理之try和catch代码块的使用
转自:https://www.jb51.net/article/72901.htm Java try和catch的使用 尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自 ...
- idea 自动生成try/catch代码块的快捷键
好像每个人的快捷键可能不同:我的是 Alt+Shift+Z 网上查的是 Ctrl+Alt+T 如果都不是可以点选工具栏生成try/catch(并可查看到自己的快捷键是什么):Code->Su ...
- “全栈2019”Java异常第三章:try代码块作用域详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- 【译】StackOverflow——Java 中的 finally 代码块是否总会被执行?
问题 有一个 try/catch 代码块,其中包含一个打印语句.finally代码块总会被调用么? 示例: try { something(); return success; } catch (Ex ...
- 异常依然执行{try..catch语句块..}的后续代码
测试异常依然执行{try..catch语句块..}的后续代码: private static Integer testThrows() throws Exception{ Integer result ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- java-并发-保护代码块
浏览以下内容前,请点击并阅读 声明 线程经常需要协调其动作,最常用的协调方法就是保护代码块,该代码块以一个条件判断开始,当判断为true时才能开始执行. 假设一个方法guradedJoy必须等到变量j ...
随机推荐
- android----Java DES加密算法工具类
DESUtil类 public class DESUtil { private static byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (by ...
- [转]强悍的跨平台开源多媒体中心XBMC介绍
[转]强悍的跨平台开源多媒体中心XBMC介绍 http://www.cnblogs.com/mythou/p/3220898.html 最近都在了解Android下的音视频,因为最近需要做一个多媒体中 ...
- Datawarehouse
- How to check if NSString begins with a certain character
How to check if NSString begins with a certain character How do you check if an NSString begins with ...
- Microsoft Dynamics CRM 2013 安装过程图解及安装序列号
Microsoft Dynamics CRM 2013 安装过程 图解 在安装前,先持一下SQL配置管理,将相关的服务打开.(由于在虚拟机里,许多服务需要时才会打开,像Reporting Serv ...
- Javascript中常用事件的命名
OnClick :单击事件 OnChange:改变事件 OnSelect:选中事件 OnFocus:获得焦点事件 OnBlur:失去焦点事件 Onload:载入文件 OnUnload:卸载文件 anc ...
- POSIX 线程详解 一种支持内存共享的简捷工具
线程是有趣的 了解如何正确运用线程是每一个优秀程序员必备的素质.线程类似于进程.如同进程,线程由内核按时间分片进行管理.在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同.而 ...
- Redis 起步
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介 Redis是一个key-value存储系统.和Memcached类似,但是解决 ...
- poj 1985 Cow Marathon 树的直径
题目链接:http://poj.org/problem?id=1985 After hearing about the epidemic of obesity in the USA, Farmer J ...
- Hibernate中查询数据转成VO对象及注意问题
大家都可能会遇到,在用json传输数据时,很多字段是来自不同的表数据,需要我们进行封装数据. hibernate提供这么一个方法用来直接封装查询属性: query.setResultTransform ...