在企业级开发中使用Try...Catch...会影响效率吗?
感谢神啊、上帝及老天爷让我失眠,才能够有了本篇文章。
记得不久之前,公司一同事曾经说过:“如果是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时使用事务会比没有使用事务要慢很多,可是经过测试,使用事务比没有使用事务要快很多,而且居然不是一个数量级的。因此,使用事务就成为了提升数据库访问性能的一种手段了。
结论:
- 不论是使用c#进行什么开发,使用try。。。catch都不会影响性能,反倒会略微提升性能。
- try。。。catch不仅要在开发中使用,而且在进行公共类的公共方法时必须使用,否则出现了异常,就会影响共同调用此方法的所有用户。
- 如果为了所谓的性能,而不去处理程序中的异常的话,原则上就不能通过(讲原则)。
我使用Vs2008+sp1开发环境简单做了个Demo,有兴趣的朋友可以下载代码自己测试一下。
事件反思:
- 如果能够再做一个不使用try。。。catch出现异常的测试,应该对这次的结论会更加的有帮助。可是转一想,自己真是糊涂了,如果出现异常而不去处理的话,根本就没有办法测试代码的执行时间的。看看时间也不早了,今天还得上班呢,不管还会不会再失眠,必须强迫自己关掉心爱的电脑,躺在床上了。
- 这么简单的一个问题,却很少有人能够做测试,通常都是主观的表达自己的观点,然后就投入了所谓的“企业级开发”。如果我在博客园首页提出这样的问题,会不会出现各种各样的人出来争锋相对、各持己见、甚至相互谩骂,认为别人的想法太幼稚,而自己的想法才是真理呢?我想说不定会,至少可能性是有的。
- 以后再遇到针锋相对、犹豫不决的事情,还是希望在没有亲自调查、测试之前,不要太过自信的发表言论吧,如果拿不准但必须要表态的话,至少应该加上“我觉得”、“个人认为”。。。。。。
在企业级开发中使用Try...Catch...会影响效率吗?的更多相关文章
- 人们对Python在企业级开发中的10大误解
From : 人们对Python在企业级开发中的10大误解 在PayPal的编程文化中存在着大量的语言多元化.除了长期流行的C++和Java,越来越多的团队选择JavaScript和Scala,Bra ...
- asp.net5开发中DNX SDK版本的影响
某次asp.net5开发中遇到了一个很奇怪的问题,引用部分的nuget包没有显示任何错误,如下图: 但是编译时出现了几百个错误: 错误基本都是形如“CS0246 The type or namespa ...
- mongodb高级操作及在Java企业级开发中的应用
Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...
- Shiro系列(0) - 权限管理在J2EE企业级开发中的应用与实战
其实也是应大家要求,讲一下权限管理,之前有讲过,但是没有拿出来细讲,这次索性录了视频从头到尾把shiro讲一遍.后续spring security会另外找个时间也讲一下. 主要内容会包括以下 1.了解 ...
- wpf企业级开发中的几种常见业务场景
前阵子在公司弄个内部的进销存管理系统,从了解需求.系统设计到编码,大约耗费了两个月时间,后来公司有了其他的安排,这东西就算黄了.顺便吐槽一下,厂里的一些人说话真心不顾别人感受,邮件啥的没一句舒服的.不 ...
- 【优化】Java开发中注意内存问题,影响JVM
1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控 ...
- iOS企业级开发初级课程-表视图(13集)
首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜 ...
- 一探前端开发中的JS调试技巧
前言 调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...
- 前端开发中的JS调试技巧
前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...
随机推荐
- SQL表建立,临时表,表变量示例
CODE: USE Sales; GO /* CREATE TABLE Orders ( OrderID int IDENTITY(1,1) PRIMARY KEY, OrderGUI uniquei ...
- Epoll在LT和ET模式下的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是:EAGAIN: 再试一次, ...
- 我所理解的OOP——UML六种关系(转)
转自:http://www.cnblogs.com/dolphinX/p/3296681.html 最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱了, ...
- 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 ...
- Spark Streaming 结合FlumeNG使用实例
SparkStreaming是一个对实时数据流进行高通量.容错处理的流式处理系统,可以对多种数据源(如Kdfka.Flume.Twitter.Zero和TCP 套接字)进行类似map.reduce.j ...
- 谷歌浏览器怎么调试js
首先我们打开开发者工具,你可以直接在页面上点击右键,然后选择审查元素或者在Chrome的工具中找到或者你直接记住这个快捷方式: Ctrl+Shift+I (或者Ctrl+Shift+J直接打开控制台) ...
- jquery-pager分页
首先引用这三个文件 <script src="../../Scripts/jquery-1.4.4.min.js" type="text/javascript&qu ...
- JavaScript 设计风格&模式 概览 20140418
基本的概念 在JavaScript中,一旦定义好一个变量,该变量会自动成为内置对象的一个属性,(如果该变量是全局变量,那么会成为全局对象的一个属性). 定义的变量实际上也是一个伪类,拥有自身的属性,该 ...
- [ReadingNotes] Search the links, static final in the java
[ReadingNotes] Search the links, static final in the java */--> pre { background-color: #2f4f4f;l ...
- 987654321 problem - SGU 107(找规律)
题目大意:求n位数的平方的后几位结果是987654321的个数是多少. 分析:刚看到这道题的时候怀疑过有没有这样的数,于是暴力跑了一下,发现还真有,9位的数有8个,如下: i=111111111, i ...