感谢神啊、上帝及老天爷让我失眠,才能够有了本篇文章。

记得不久之前,公司一同事曾经说过:“如果是Winform开发,由于程序是在本地,使用try。。。catch不会有太大性能问题,可是如果是在web服务器上的话,不推荐使用try。。。catch。。。,因为这对于web服务器的性能会有很大影响”。当时我对此一直心存疑问,由于我没有做过测试,不知道到底是不是这样?所以当时我没有表态。首先我通过Google进行了搜索,有同样想法或同样疑问的人不在少数,表达个人观点的人什么样的都有。但是从我个人主观上推断,主观推断的结论是:try...catch在没有抛出异常时不影响程序性能,而且即便影响性能,也不见得会成为性能瓶颈。

究竟结果怎样?还是动手写代码做下测试吧。

测试时用到的类

using System;
using System.Diagnostics;
namespace WebApplication3
{
    public static class Test
    {
        public static void NoTry()
        {
            for (int i = 0; i < 10000; i++)
            {
                System.Web.HttpContext.Current.Response.Write(i.ToString());       
            }
        }         public static void HaveTry()
        {
            try
            {
                for (int i = 0; i < 10000; i++)
                {
                    System.Web.HttpContext.Current.Response.Write(i.ToString());
                }
            }
            catch(Exception err)
            {
                System.Web.HttpContext.Current.Response.Write(err.ToString());
            }
            
        }         public static long HaveException()
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            try
            {
                for (int i = 0; i < 10000; i++)
                {
                    System.Web.HttpContext.Current.Response.Write(i.ToString());
                }
                throw new Exception("Kevin让我异常了");
            }
            catch (Exception err)
            {
                System.Web.HttpContext.Current.Response.Write(err.ToString());
            }
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }
    }
}
测试页的代码

using System;
using System.Diagnostics; namespace WebApplication3
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {         }         protected void Button1_Click(object sender, EventArgs e)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Test.NoTry();
            sw.Stop();
            lblMessage.Text = "测量实例得出的总运行时间(毫秒为单位):" + sw.ElapsedMilliseconds;
        }         protected void Button2_Click(object sender, EventArgs e)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Test.NoTry();
            sw.Stop();
            lblMessage.Text = "测量实例得出的总运行时间(毫秒为单位):" + sw.ElapsedMilliseconds;
        }         protected void Button3_Click(object sender, EventArgs e)
        {
            lblMessage.Text = Test.HaveException().ToString();
        }
    }
}

测试结果如下表所示:

组次

没有使用Try…Catch…的时间(毫秒)

使用Try…Catch…但不出现异常所用的时间(毫秒)

使用Try…Catch…出现异常所用的时间(毫秒)

1

6

3

4

2

11

5

6

3

4

3

6

4

8

10

4

5

6

3

6

6

8

6

4

7

9

5

9

8

5

5

5

9

7

6

10

10

5

4

8

平均时间

6.9

5

6.2

通过观察测试结果,意料之中又参杂着些意外。

意外的是,使用try。。。catch不出现异常跟使用try。。。catch。。。出现异常的平均执行时间比没有使用try。。。catch。。。的平均执行时间要短。这不禁让我想起了很久之前发生的一幕类似的场景:

我一直以为操作SQLServer时使用事务会比没有使用事务要慢很多,可是经过测试,使用事务比没有使用事务要快很多,而且居然不是一个数量级的。因此,使用事务就成为了提升数据库访问性能的一种手段了。

结论:

  1. 不论是使用c#进行什么开发,使用try。。。catch都不会影响性能,反倒会略微提升性能。
  2. try。。。catch不仅要在开发中使用,而且在进行公共类的公共方法时必须使用,否则出现了异常,就会影响共同调用此方法的所有用户。
  3. 如果为了所谓的性能,而不去处理程序中的异常的话,原则上就不能通过(讲原则)。

我使用Vs2008+sp1开发环境简单做了个Demo,有兴趣的朋友可以下载代码自己测试一下。

Try...Catch性能测试代码

事件反思:

    1. 如果能够再做一个不使用try。。。catch出现异常的测试,应该对这次的结论会更加的有帮助。可是转一想,自己真是糊涂了,如果出现异常而不去处理的话,根本就没有办法测试代码的执行时间的。看看时间也不早了,今天还得上班呢,不管还会不会再失眠,必须强迫自己关掉心爱的电脑,躺在床上了。
    2. 这么简单的一个问题,却很少有人能够做测试,通常都是主观的表达自己的观点,然后就投入了所谓的“企业级开发”。如果我在博客园首页提出这样的问题,会不会出现各种各样的人出来争锋相对、各持己见、甚至相互谩骂,认为别人的想法太幼稚,而自己的想法才是真理呢?我想说不定会,至少可能性是有的。
    3. 以后再遇到针锋相对、犹豫不决的事情,还是希望在没有亲自调查、测试之前,不要太过自信的发表言论吧,如果拿不准但必须要表态的话,至少应该加上“我觉得”、“个人认为”。。。。。。

在企业级开发中使用Try...Catch...会影响效率吗?的更多相关文章

  1. 人们对Python在企业级开发中的10大误解

    From : 人们对Python在企业级开发中的10大误解 在PayPal的编程文化中存在着大量的语言多元化.除了长期流行的C++和Java,越来越多的团队选择JavaScript和Scala,Bra ...

  2. asp.net5开发中DNX SDK版本的影响

    某次asp.net5开发中遇到了一个很奇怪的问题,引用部分的nuget包没有显示任何错误,如下图: 但是编译时出现了几百个错误: 错误基本都是形如“CS0246 The type or namespa ...

  3. mongodb高级操作及在Java企业级开发中的应用

    Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...

  4. Shiro系列(0) - 权限管理在J2EE企业级开发中的应用与实战

    其实也是应大家要求,讲一下权限管理,之前有讲过,但是没有拿出来细讲,这次索性录了视频从头到尾把shiro讲一遍.后续spring security会另外找个时间也讲一下. 主要内容会包括以下 1.了解 ...

  5. wpf企业级开发中的几种常见业务场景

    前阵子在公司弄个内部的进销存管理系统,从了解需求.系统设计到编码,大约耗费了两个月时间,后来公司有了其他的安排,这东西就算黄了.顺便吐槽一下,厂里的一些人说话真心不顾别人感受,邮件啥的没一句舒服的.不 ...

  6. 【优化】Java开发中注意内存问题,影响JVM

    1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控 ...

  7. iOS企业级开发初级课程-表视图(13集)

    首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜 ...

  8. 一探前端开发中的JS调试技巧

    前言 调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...

  9. 前端开发中的JS调试技巧

    前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...

随机推荐

  1. SQL表建立,临时表,表变量示例

    CODE: USE Sales; GO /* CREATE TABLE Orders ( OrderID int IDENTITY(1,1) PRIMARY KEY, OrderGUI uniquei ...

  2. Epoll在LT和ET模式下的读写方式

    在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次, ...

  3. 我所理解的OOP——UML六种关系(转)

    转自:http://www.cnblogs.com/dolphinX/p/3296681.html 最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱了, ...

  4. lc面试准备:Invert Binary Tree

    1 题目 Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 接口: public TreeNod ...

  5. Spark Streaming 结合FlumeNG使用实例

    SparkStreaming是一个对实时数据流进行高通量.容错处理的流式处理系统,可以对多种数据源(如Kdfka.Flume.Twitter.Zero和TCP 套接字)进行类似map.reduce.j ...

  6. 谷歌浏览器怎么调试js

    首先我们打开开发者工具,你可以直接在页面上点击右键,然后选择审查元素或者在Chrome的工具中找到或者你直接记住这个快捷方式: Ctrl+Shift+I (或者Ctrl+Shift+J直接打开控制台) ...

  7. jquery-pager分页

    首先引用这三个文件 <script src="../../Scripts/jquery-1.4.4.min.js" type="text/javascript&qu ...

  8. JavaScript 设计风格&模式 概览 20140418

    基本的概念 在JavaScript中,一旦定义好一个变量,该变量会自动成为内置对象的一个属性,(如果该变量是全局变量,那么会成为全局对象的一个属性). 定义的变量实际上也是一个伪类,拥有自身的属性,该 ...

  9. [ReadingNotes] Search the links, static final in the java

    [ReadingNotes] Search the links, static final in the java */--> pre { background-color: #2f4f4f;l ...

  10. 987654321 problem - SGU 107(找规律)

    题目大意:求n位数的平方的后几位结果是987654321的个数是多少. 分析:刚看到这道题的时候怀疑过有没有这样的数,于是暴力跑了一下,发现还真有,9位的数有8个,如下: i=111111111, i ...