从合作开始注意了对Try Catch的使用,当时想的是既然错误处理能让程序在测试的时候不出错,那么为什么不在每个程序段上都加上错误处理呢(当时用三层架构开发的系统,只在U层和SQLHelper加上了错误处理)?后来通过和别人交流得知Try Catch会影响程序效能,至于怎么影响的就不得而知了。
在网上查了一番,得到的结论是Try Catch只会在Catch抓住异常的时候影响效能,没有异常的时候对于效能没影响。恰好昨天看到同班同学的博客,对异常处理影响效能做了测试,结论是加了异常处理对效能的影响微乎其微(运行时间增加了1ms)。
先放下别人的结论,咱们自己动下手,写下测试的代码:
Module Module1 Sub Main() '定义Stopwatch类用于记录时间 Dim sw As New Stopwatch() '定义循环次数 Dim RUN_COUNT As Int32 = 300 * 10000 '定义循环累加的和 Dim Sum As Long = 0 '第一次测试,没有Try...Catch '开始计时 sw.Start() For i = 0 To RUN_COUNT Sum = Sum + i Next sw.Stop() '控制台显示循环时间 Console.WriteLine("Test1 Sum={0} Time={1}ms", Sum, sw.ElapsedMilliseconds) '第二次测试,有Try...Catch,不抛异常 '重置Stopwatch和Sum sw.Reset() Sum = 0 '开始计时 sw.Start() '加上Try Catch Try For i = 0 To RUN_COUNT Sum = Sum + i Next Catch ex As Exception Console.WriteLine("Error:{0}", ex.Message) End Try '计时停止 sw.Stop() '控制台显示所用时间 Console.WriteLine("Test2 Sum={0} Time={1}ms", Sum, sw.ElapsedMilliseconds) '第三次测试 用上Try Catch 并抛出异常 '重置Stopwatch和Sum sw.Reset() Sum = 0 '开始计时 sw.Start() '加上Try Catch Try For i = 0 To RUN_COUNT Sum = Sum + i Next Throw New Exception("循环后抛出的异常") Catch ex As Exception Console.WriteLine("Error:{0}", ex.Message) End Try '计时停止 sw.Stop() '控制台显示所用时间 Console.WriteLine("Test3 Sum={0} Time={1}ms", Sum, sw.ElapsedMilliseconds) Console.ReadLine() End Sub ' Main End Module写好代码就可以进行测试了,激动人心那。
这是运行的结果
可以看到,没有Try Catch的test1和有Try Catch 但没有抛出异常的程序时间一样,有Try Catch 并抓住异常的test3运行所用时间大概增加了11ms,不到一倍的样子(多次运行测试,时间虽有不同,但相差不多)。从这个测试可以看出,加了Try Catch确实会影响效能。
做程序,考虑性是一方面,程序的稳定也是一个相当重要的方面,因此在有可能出错的地方加上Try Catch 还是非常必要的。
- 5楼yaoyong0745昨天 08:23
- 淡淡的淡淡的淡淡的淡淡的淡淡的淡淡
- Re: xqf30910小时前
- 回复yaoyong0745n怎么个淡法.....
- 4楼lfmilaoshi昨天 07:47
- 程序的稳定也是一个相当重要的方面,这就是健壮性。。。米老师
- Re: xqf309昨天 07:47
- 回复lfmilaoshin恩,我们应该做稳定的程序
- 3楼lidaasky昨天 07:46
- 精准的实验
- Re: xqf309昨天 07:47
- 回复lidaaskyn嘿嘿
- 2楼liushuijinger昨天 00:01
- 实践是王道
- Re: xqf309昨天 01:00
- 回复liushuijingern[e04]
- 1楼liutengteng130前天 17:59
- 支持,加油啊。
- Re: xqf309昨天 23:24
- 回复liutengteng130n恩,谢啦