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

记得不久之前,公司一同事曾经说过:“如果是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. 以后再遇到针锋相对、犹豫不决的事情,还是希望在没有亲自调查、测试之前,不要太过自信的发表言论吧,如果拿不准但必须要表态的话,至少应该加上“我觉得”、“个人认为”。。。。。。

转载于:https://www.cnblogs.com/wlb/archive/2009/11/30/1613412.html

在企业级开发中使用Try...Catch...会影响效率吗?相关推荐

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

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

  2. python公司一般都是什么样的公司-人们对Python在企业级开发中的10大误解

    在PayPal的编程文化中存在着大量的语言多元化.除了长期流行的C++和Java,越来越多的团队选择JavaScript和Scala,Braintree的收购也推出了成熟的Ruby社区. 有一种特别的 ...

  3. 直播app开发中这几个功能影响后期运营

    直播app开发中的常见功能我们都有所了解,但是对于功能的选择我们也会存在一定的瓶颈期,功能的出彩影响着后期运营的效果,所以把一些功能设计好是非常有必要的.今天就和南京软件开发公司软世通,一起来了解直播 ...

  4. BeanCopy和BeanCopier在实际开发中的使用(属性copy效率优化)

    优化场景: 项目的实体类主要分为三种:dto.dao.query等,所以属性copy避免不了,是影响代码执行效率的主要方面之一. 当时的情况是,项目A接受url请求,然后会调用项目B的一个接口去处理明 ...

  5. [Spring Boot 6]企业级开发

    本节内容主要就几个常用的模块进行解读,在众多企业级开发中常常用得到. 例如邮件发送这一功能其实非常常见,在一般的网站设计中会有对注册邮件的激活功能,此时就需要用到这个功能了,一般来说激活邮件需要设置U ...

  6. 专访蒋彪:JavaEE是企业级开发首选

    2019独角兽企业重金招聘Python工程师标准>>> 摘要:企业级开发首选技术是什么?JavaEE和.Net哪个技术更好?在JavaEE开发中主要用哪些框架?另外在移动大热的趋势下 ...

  7. Mysql 面向企业级开发(一)

    你需要在企业级开发中了解这些 数据类型 整数类型 实数类型 VARCHAR类型 CHAR类型 DATETIME日期类型 TIMESTAMP时间戳 体系结构 InnoDB存储引擎 存储特性 事务特性 M ...

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

    有请提示:文中涉及较多Gif演示动画,移动端请尽量在Wifi环境中阅读 前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问 ...

  9. 前端开发中JS调试技巧,你知道几种?用过几种?

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

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

    转自:http://seejs.me/2016/03/27/%E3%80%90%E5%8E%9F%E5%88%9B%E3%80%91%E4%B8%80%E6%8E%A2%E5%89%8D%E7%AB% ...

最新文章

  1. Simple Dynamic Strings(SDS)源码解析和使用说明一
  2. http2-stream-optima-prioritation
  3. 掌握这些PPT技巧,让你的工作效率提高10倍
  4. 【数据分析】“上海名媛”其实是“拼夕夕名媛”,数据分析告诉你真实的名媛其实都是什么样子!...
  5. 与TIME_WAIT相关的几个内核参数
  6. 如何在GitHub上下载开源文件
  7. java treemap_Java TreeMap firstEntry()方法及示例
  8. python自顶向下设计步骤_python自底向上的执行单元测试
  9. Java基础学习总结(113)——异常最佳实践
  10. C#:当把U盘放插入,然后程序自动将U盘的内容复制到本地硬盘
  11. CentOS SELinux
  12. MicroPython-GPRS教程之TPYBoardv702GPRS功能测试
  13. CISSP怎么复习备考
  14. 使用c语言实现数组连接
  15. RANSAC算法详解
  16. java_SSD3_实验报告_面向对象——多态
  17. 阿祥Python自学笔记
  18. 假面骑士鸿蒙系统,《假面骑士》街机游戏,这样组合太棒了!
  19. 编制投标书常见的115个错误
  20. 用turtle模块画小猪佩奇

热门文章

  1. Struts之logic标签库详解(转载)
  2. 3、grep,vim,压缩功能详解
  3. 58、IPv6访问控制列表及ICMPv6简介
  4. CCNA 折扣号申请流程(新版)
  5. MySQL table_cache 优化(二)
  6. 开源数据库系统之SQLite3.2.0、FireBird2.0 Alpha-1等
  7. [2018.11.05 T3] 零食
  8. 时间排序处理在微信小程序和真机调试没问题,发布体验版后未执行
  9. nginx负载均衡原理(理解篇)
  10. oracle srvctl命令,关闭RAC、srvctl命令