C#中使用try...catch...是否会影响程序性能
2012-02-25 11:30
621 查看
老实说,我这人很少有打破沙锅问到底的精神。
不过昨晚听一技术人员跟他的项目经理说要在程序中使用try...catch...时,只见这项目经理邹邹眉说了句“try...catch...性能多差,尽量不要用。”
这句话不知道触动了我哪条神经,让这突然产生了相当好奇的心里。于是呼我就百度一下,找找相关的文章。
这么一找,才知道,原来网上讨论这个的还挺多的,而且各执一词,各有各的道理。
找到的一个例子中,虽然有把结果较详细的列出来,但貌似贴的源码有问题,会引起争议。
所以决定动手自己写个试试,看看结果究竟如何。
好了,废话多说了,下面直接来看看源码吧。
首先,介绍一下相关的测试方法:
1.使用了VS2008开发环境(我怕编译会有所影响)
2.使用命令行程序,尽量忽略其它一些因素导致的开销
3.使用NetFramework 2.0 / 3.5分别编译程序并测试
4.测试代码是分别用 NoTry / HaveTry / HaveException 三个方法,每个方法执行10次,最后计算平均值
5.为了能拖一拖时间,假装有些损耗,测试的时候,使用的是字符串叠加10000次
其次,介绍一下相关的硬件环境:
1.Acer 4732Z 本本
2.CPU:Intel Pentium T4400
3.内存:3G DDR800
下面主角来了,本次测试的源码:
为了不引起争议,我把try...catch...放在for循环内,这样就相当于每次都是一个新的try...catch。
而且HaveException方法中,是每次for循环都抛一次异常,共计抛了10000将异常。
异常的文本内容我没有添加,是怕因为字符串的相关操作倒置了计算不精准。
OK,相信代码很简单,我就不多介绍了,下面来看看结果吧:
以下是在NF2.0环境下运行的结果:
以下是在NF3.5环境下运行的结果:
结果出来了,在做了10000次字符串的叠加,平均下来,没有try的是304/303,有try的是298/299,有异常的是551/554。
结果貌似挺出乎意料的,有加try的甚至比没加try的还要来得快?(这是神马世道?我本以为会多一点点还说得过去……)
而抛出了10000次异常的HaveException也大概是没有加try的2倍。而且请注意,这是抛了10000次异常,正常我们写程序,异常机率肯定不是100%。
这样的测试结果让人很欣喜,因为我一直是try...catch...的粉丝,在程序中,我是每个用户操作的事件,都会加上try...catch...的。
这样一来,就放心很多了,以前也怀疑过,try...catch...是否真的会引起多大的开销,但经过这么一试,我想,开销还是很小的。
而且我在网上搜索的时候,有一位网友的评论我觉得很对:除了try,还有什么方法能保证程序的稳健性呢?
我想,这也是我,或者说很多人为什么要用try...catch...的最原始理由,我们都希望程序按照我们的想法去跑,但往往很多的异常都是很特殊或者说很难预料的。
嗯 嗯,文章大概就写到这里吧,下面再来些扩展的试验,呵呵~
1.同样的代码,把for增加到20000次:
Oh my god,看来String随着叠加次数的增加,性能开销会相对的增加,以NoTry的来看1W次是303,2W次是1585,多了几倍的时间。
2.那么StringBuilder性能会怎么样呢?同样的代码小作修改,这次来试下2W次StringBuilder的Append:
Oh my god,SB就是SB啊,多牛B,2W下8毫秒,我开始还以为我是不是搞错了,仔细检查下代码,确实没错。再提升一个数量级,20W次:
效率真的很不错,而且提升到20W的数量级,开销仍然没有半点增加,保持在1W次8毫秒左右。
看来很多大叔级程序员的话是真的
而且,由2W次、20W次SB的结果来看,貌似可以看出来,catch Exception的效率也不错吧,平均1W次230毫秒,亲,你就真的忽略掉吧。
好了,测试基本都完毕了,不再多说了,当然这样的测试我不知道还有没有什么局限性,或者说别的语言(JAVA之类的)会不会不一样,
但对于这个结果我想说,.net的程序员们,请放心大胆的用try...catch..吧,在没有异常的情况下,有try没try基本一样,
就算偶尔有异常了,也就是几毫秒的开销,何必那么认真呢?而且测试环境只是一台普通得不能再普通的本本,如果换到服务器上,估计开销还更小!
加了try...catch...后,别的不说,至少对于我们的程序的稳健性、debug等,都会有很大的帮助。
不过昨晚听一技术人员跟他的项目经理说要在程序中使用try...catch...时,只见这项目经理邹邹眉说了句“try...catch...性能多差,尽量不要用。”
这句话不知道触动了我哪条神经,让这突然产生了相当好奇的心里。于是呼我就百度一下,找找相关的文章。
这么一找,才知道,原来网上讨论这个的还挺多的,而且各执一词,各有各的道理。
找到的一个例子中,虽然有把结果较详细的列出来,但貌似贴的源码有问题,会引起争议。
所以决定动手自己写个试试,看看结果究竟如何。
好了,废话多说了,下面直接来看看源码吧。
首先,介绍一下相关的测试方法:
1.使用了VS2008开发环境(我怕编译会有所影响)
2.使用命令行程序,尽量忽略其它一些因素导致的开销
3.使用NetFramework 2.0 / 3.5分别编译程序并测试
4.测试代码是分别用 NoTry / HaveTry / HaveException 三个方法,每个方法执行10次,最后计算平均值
5.为了能拖一拖时间,假装有些损耗,测试的时候,使用的是字符串叠加10000次
其次,介绍一下相关的硬件环境:
1.Acer 4732Z 本本
2.CPU:Intel Pentium T4400
3.内存:3G DDR800
下面主角来了,本次测试的源码:
using System; using System.Collections; using System.Text; using System.Diagnostics; using System.Threading; namespace TestTryCatch { class Program { static void Main(string[] args) { WriteLog("主线程", "程序启动"); ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); ArrayList list3 = new ArrayList(); for (int i = 0; i < 10; i++) { WriteLog("程序测试", "第[" + i + "]次测试"); Thread.Sleep(1000); list1.Add(NoTry()); Thread.Sleep(1000); list2.Add(HaveTry()); Thread.Sleep(1000); list3.Add(HaveException()); } long sum1 = 0, sum2 = 0, sum3 = 0; string str1 = "", str2 = "", str3 = ""; for (int i = 0; i < 10; i++) { sum1 += (long)list1[i]; sum2 += (long)list2[i]; sum3 += (long)list3[i]; str1 += list1[i] + "|"; str2 += list2[i] + "|"; str3 += list3[i] + "|"; } WriteLog("测试结果", "NoTry : " + str1 + sum1/10); WriteLog("测试结果", "HaveTry : " + str2 + sum2/10); WriteLog("测试结果", "HaveErr : " + str3 + sum3/10); WriteLog("主线程", "程序关闭"); Console.Read(); } private static void WriteLog(string type, string message) { Console.WriteLine("[{0}] {1} {2}", DateTime.Now.ToString("yyMMdd HHmmss"), type, message); } private static long NoTry() { string test = ""; Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 10000; i++) { test += i; } watch.Stop(); return watch.ElapsedMilliseconds; } private static long HaveTry() { string test = ""; Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 10000; i++) { try { test += i; } catch (Exception err) { } } watch.Stop(); return watch.ElapsedMilliseconds; } private static long HaveException() { string test = ""; Stopwatch watch = new Stopwatch(); watch.Start(); for (int i = 0; i < 10000; i++) { try { test += i; throw new Exception(); } catch (Exception err) { } } watch.Stop(); return watch.ElapsedMilliseconds; } } }
为了不引起争议,我把try...catch...放在for循环内,这样就相当于每次都是一个新的try...catch。
而且HaveException方法中,是每次for循环都抛一次异常,共计抛了10000将异常。
异常的文本内容我没有添加,是怕因为字符串的相关操作倒置了计算不精准。
OK,相信代码很简单,我就不多介绍了,下面来看看结果吧:
以下是在NF2.0环境下运行的结果:
以下是在NF3.5环境下运行的结果:
结果出来了,在做了10000次字符串的叠加,平均下来,没有try的是304/303,有try的是298/299,有异常的是551/554。
结果貌似挺出乎意料的,有加try的甚至比没加try的还要来得快?(这是神马世道?我本以为会多一点点还说得过去……)
而抛出了10000次异常的HaveException也大概是没有加try的2倍。而且请注意,这是抛了10000次异常,正常我们写程序,异常机率肯定不是100%。
这样的测试结果让人很欣喜,因为我一直是try...catch...的粉丝,在程序中,我是每个用户操作的事件,都会加上try...catch...的。
这样一来,就放心很多了,以前也怀疑过,try...catch...是否真的会引起多大的开销,但经过这么一试,我想,开销还是很小的。
而且我在网上搜索的时候,有一位网友的评论我觉得很对:除了try,还有什么方法能保证程序的稳健性呢?
我想,这也是我,或者说很多人为什么要用try...catch...的最原始理由,我们都希望程序按照我们的想法去跑,但往往很多的异常都是很特殊或者说很难预料的。
嗯 嗯,文章大概就写到这里吧,下面再来些扩展的试验,呵呵~
1.同样的代码,把for增加到20000次:
Oh my god,看来String随着叠加次数的增加,性能开销会相对的增加,以NoTry的来看1W次是303,2W次是1585,多了几倍的时间。
2.那么StringBuilder性能会怎么样呢?同样的代码小作修改,这次来试下2W次StringBuilder的Append:
Oh my god,SB就是SB啊,多牛B,2W下8毫秒,我开始还以为我是不是搞错了,仔细检查下代码,确实没错。再提升一个数量级,20W次:
效率真的很不错,而且提升到20W的数量级,开销仍然没有半点增加,保持在1W次8毫秒左右。
看来很多大叔级程序员的话是真的
而且,由2W次、20W次SB的结果来看,貌似可以看出来,catch Exception的效率也不错吧,平均1W次230毫秒,亲,你就真的忽略掉吧。
好了,测试基本都完毕了,不再多说了,当然这样的测试我不知道还有没有什么局限性,或者说别的语言(JAVA之类的)会不会不一样,
但对于这个结果我想说,.net的程序员们,请放心大胆的用try...catch..吧,在没有异常的情况下,有try没try基本一样,
就算偶尔有异常了,也就是几毫秒的开销,何必那么认真呢?而且测试环境只是一台普通得不能再普通的本本,如果换到服务器上,估计开销还更小!
加了try...catch...后,别的不说,至少对于我们的程序的稳健性、debug等,都会有很大的帮助。
相关文章推荐
- C#中使用try...catch...是否会影响程序性能
- C#中使用try...catch...是否会影响程序性能
- C#中使用try{}catch{}finally{}对系统性能的影响和处理机制(摘录)
- C#中使用try{}catch{}finally{}对系统性能的影响和处理机制(摘录)
- C#中Try-Catch语句真的影响程序性能吗?
- C# 关于Try/Catch对系统性能影响的总结
- 在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现。 【方法一】:使用 try{} catch{} 语句。 我们可以在try语句块中试图
- c#关于try catch finally的使用,判断日期格式是否正确
- Try-Catch真的会影响程序性能吗
- Try-Catch真的会影响程序性能吗
- [置顶] C# 深度剖析try catch finally及其性能影响
- 关于import中使用*号是否会影响程序性能
- Try-Catch真的会影响程序性能吗
- C# 关于Try/Catch对系统性能影响的总结
- Try-Catch真的会影响程序性能吗
- C# 程序性能提升篇-2、类型(字段类型、class和struct)的错误定义所影响性能浅析
- C# 如何判断指定文件是否正被其它程序使用
- 使用C#的try…catch语句
- 选择排序法 当数据量较小的时候,使用基本排序方案并不会显著影响程序性能。 选择排序是十分常用的基本排序方案之一。
- 4.第三单元任务三实训:编写一个类ExceptionTest,在main方法中使用try-catch-finally语句结构实现:在try语句块中,编写两个数相除操作,相除的两个操作数要求程序运行时用