在企业级开发中使用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时使用事务会比没有使用事务要慢很多,可是经过测试,使用事务比没有使用事务要快很多,而且居然不是一个数量级的。因此,使用事务就成为了提升数据库访问性能的一种手段了。

结论:

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值