Filter与Throw性能对比

类别:软件工程 点击:0 评论:0 推荐:

我们在编写程序的时候,常常要使用Try Catch来进行异常的捕获。有时,将暂时无法处理的异常继续向外抛出也是十分常见的用法。完成这项操作可以通过两种方式,第一种是判断后继续抛出异常;第二种则是通过filter进行条件过滤,只捕获条件符合的异常。我们分别用两个子程序演示他们:

'检查后重新抛出异常
Private Sub Test1()
    Dim a As Integer = 0

    Try
        a = 2 \ a
    Catch ex As Exception
        If a <= 0 Then Throw
    End Try
End Sub

'用过滤器根据条件捕获异常
Private Sub Test2()
    Dim a As Integer = 0

    Try
        a = 2 \ a
    Catch ex As Exception When a > 0

    End Try
End Sub

注意到区别了吗,一个是通过Throw语句完成,而另一个则是通过When语句。我用的抛出异常的语句是a = 2 \ a,它产生的被零除异常速度非常快,要比直接抛出Exception的实例还要快的多,只有这样我们才能将比较的焦点放在捕获上。

这是测试的代码:

Dim w As New Stopwatch()
For i As Integer = 1 To 50
    w.Start()
    Try
        Test1() 'Or Test2()
    Catch ex As Exception

    End Try
    w.Stop()
Next

TextBox1.AppendText(w.ElapsedMilliseconds & vbCrLf)

测试进行在Release,不开优化(以免编译器改变机理)的情况下,预运行10次的条件下,这是两者的对比(毫秒):

Throw版:341
Filter(When)版:169

性能差距极大!Throw是一个非常慢的操作。相比之下Filter则十分快速。此处只循环了50次,就能有数百毫秒的差距,可见此性能差距是日常程序里肉眼就能看出的严重差距。建议大家需要按条件捕获异常时,尽量用When语句,以获得Filter的性能好处。

本文地址:http://com.8s8s.com/it/it36221.htm