应当放在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. [原创] PostgreSQL Plus Advanced Server在Windows中配置双机热备流复制

    一.系统环境 操作系统:Windows Server 2003/2008 两个节点分别为master与slave. 主节点master:172.27.19.28 备机点slave:172.27.19. ...

  2. Windows 10 IoT Core Samples

    Windows 10 IoT Core Samples Welcome to the Windows 10 IoT Core Samples These samples have been valid ...

  3. IOS内存管理「1」- 引用计数

  4. linux CentOS 系统下如何将php和mysql命令加入到环境变量中

    在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行“php -v”命令查看当前php版本信息时时, ...

  5. java数据结构和算法------冒泡排序

    package iYou.neugle.sort; public class Bubble_sort { public static void BubbleSort(double[] array) { ...

  6. xml数据读 swift

    // // ViewController.swift // xml读写 // // Created by mac on 15/7/14. // Copyright (c) 2015年 fangyuha ...

  7. 如何把bootstrap用webpack打包

    今天下载了一个anguarl2写后台,一直没有找到是如何使用bootstrap样式的,然后就全文做了搜索,发现有一段代码 import 'bootstrap-loader'; 这段代码很可疑,所以就查 ...

  8. 团队开发——Alpha版总结会议

    本组目前存在的问题: 1.在选题的时候,题目选的比较有难度,造成后期工作量较大,实现有难度(未能正确估计项目的难度). 2.最初规划时,设计的功能较多,但是技术水平达不到,导致目前完成功能较少. 3. ...

  9. git简单入门

    git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...

  10. Java 字符编码归纳总结

    String newStr = new String(oldStr.getBytes(), "UTF-8");       java中的String类是按照unicode进行编码的 ...