加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:28:08 所属栏目:MsSql教程 来源:网络整理
导读:记得不久之前,公司一同事曾经说过:“如果是Winform开发,由于程序是在本地,使用try。。。catch不会有太大性能问题,可是如果是在 web服务器上的话,不推荐使用try。。。catch。。。,因为这对于web服务器的性能会有很大影响”。当时我对此一直心存疑问,

组次

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

记得不久之前,公司一同事曾经说过:“如果是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();
????????}
????}
}

?测试结果如下表所示:

?

    推荐文章
      热点阅读