在企业级开发中使用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调试技巧
前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问题.降低故障概率.帮助分析逻辑错误等等.而在互联网前端开发越来越重要的今 ...
随机推荐
- MSBuild 教程(2)
如果你没有看过第一部分教程,请先看完后再回到这里来继续我们的第二部分. 我们下一步的工作是发布我们的网站,也就是创建Publish target. 为了能使我们的target工作,我们需要给它传递两个 ...
- centos6.5静态IP和DNS设置
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0EVICE=eth0HWADDR=60:02:92:62:30:2ATYPE=EthernetBROA ...
- Java项目中使用配置文件配置
private String readConfig() { Properties p = new Properties(); InputStream in = getClass().getClassL ...
- Linux学习笔记1——Linux的目录结构
/ 是根目录 ~是主目录 bin 存放二进制可执行文件(Is,cat,mkdir等) boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc 存放系统配置文件 home 存放所有 ...
- Navicat for MySQL之MySQL客户端的下载、安装和使用
前期工作 若需使用Navicat for MySQL,则需要先安装MySQL,在此就不叙述了.具体可见我的博客: mysql-5.7.11-winx64.zip 的下载.安装.配置和使用(window ...
- java对Ldap操作3
")); }}
- AutoLayout--masonry使用
[label1 mas_makeConstraints:^(MASConstraintMaker *make) { //使左边间距为 make.left.equ ...
- FIREDAC TFDCONNECTION连接MYSQL数据库
FIREDAC TFDCONNECTION连接MYSQL数据库 procedure TfrmDB.ConnectDB;begin FDMoniFlatFileClientLink1.FileName ...
- PPT扁平化手册 2
- CentOS6.5解决中文乱码与设置字符集
[ CleverCode发表在csdn博客中的原创作品,请勿转载,原创地址:http://blog.csdn.net/clevercode/article/details/46377577] 1)说明 ...