应当放在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 代码块的更多相关文章

  1. “全栈2019”Java异常第四章:catch代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  2. JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常

    在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...

  3. Java中异常处理之try和catch代码块的使用

    转自:https://www.jb51.net/article/72901.htm Java try和catch的使用 尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自 ...

  4. idea 自动生成try/catch代码块的快捷键

    好像每个人的快捷键可能不同:我的是  Alt+Shift+Z 网上查的是  Ctrl+Alt+T 如果都不是可以点选工具栏生成try/catch(并可查看到自己的快捷键是什么):Code->Su ...

  5. “全栈2019”Java异常第三章:try代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. 【译】StackOverflow——Java 中的 finally 代码块是否总会被执行?

    问题 有一个 try/catch 代码块,其中包含一个打印语句.finally代码块总会被调用么? 示例: try { something(); return success; } catch (Ex ...

  7. 异常依然执行{try..catch语句块..}的后续代码

    测试异常依然执行{try..catch语句块..}的后续代码: private static Integer testThrows() throws Exception{ Integer result ...

  8. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  9. java-并发-保护代码块

    浏览以下内容前,请点击并阅读 声明 线程经常需要协调其动作,最常用的协调方法就是保护代码块,该代码块以一个条件判断开始,当判断为true时才能开始执行. 假设一个方法guradedJoy必须等到变量j ...

随机推荐

  1. [原创]使用benchmarksql和pgbench对PostgreSQL Plus Advanced Server进行性能测试

    一.测试环境 benchmarksql version:4.0.8 rhel 6.3 vmware esxi 二.理解benchmarksql性能测试原理TPC-C 1.理解TPC-C TPC-C模拟 ...

  2. hdu 5224 Tom and paper

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5224 Tom and paper Description There is a piece of pa ...

  3. Word2013死机的问题

    Word2013用公式编辑器经常死机,网上介绍方法.试试看https://zhidao.baidu.com/question/937023473910649252.html1.启动word2013 2 ...

  4. Tutorial: Analyzing sales data from Excel and an OData feed

    With Power BI Desktop, you can connect to all sorts of different data sources, then combine and shap ...

  5. Timer Design in StatusBar

    Timer in StatusBar we need to show local time in StatusBar. solution: 1. add textblock control 2. bi ...

  6. 【转】MATLAB在一幅图上添加多个纵坐标轴

    来源:http://wenku.baidu.com/link?url=m_eEkzbjnT9ccgAnlPVDqHCVyrZOD2EplXxxIiQc69DI0lHAWzwpZXfdDy_7DPbwI ...

  7. 一个Option请求引发的深度解析

    在当前项目中,前端通过POST方式访问后端的REST接口时,发现两条请求记录,一条请求的Request Method为Options,另一条请求的Reuest Method为Post.想要解决这个疑惑 ...

  8. ScrollView图片分页显示-简单

    用到的控件: 1>UIScrollView:宽度和图片的宽度一样,因为分页的代码就一句 // 设置分页,这个分页的原理实际上是按照ScrollView的宽进行分页的,这里的图片的宽由于和Scro ...

  9. Node.js 学习(七)Node项目部署工具之forever

    平常无论是使用命令行还是终端通过node app.js启动项目时,当命令行或终端关闭时项目也就随之关闭了;forever则可以在cmd或ssh连接断开时,让项目一直运行,而且可以在项目崩溃时自动重启 ...

  10. Careercup - Google面试题 - 5661939564806144

    2014-05-06 01:40 题目链接 原题: Give a N*N matrix, print it out diagonally. Follow up, if it is a M*N matr ...