从合作开始注意了对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恩,谢啦