运用任何一个语言进行程序开发时,通常都会对程序开发中必然会出现的错误进行相应的处理。那么在VB.NET中,VB.NET错误处理往往会对运行速度有一定的影响。VB.NET中On Error 来捕获和处理错误,而且经常使用 On Error Resume Next 来可能产生的忽略错误。#t#
那么 使用错误捕获是否会影响速度呢?
是的,使用VB.NET错误处理将会降低一些性能,在。Net 中,使用 Try Catch 也将会影响性能,所以我们使用Reflector 反编译微软的类库时,会发现他的子过程很少使用 Try 来捕获错误,基本都是采用可预知的方式来判断可能出现的错误,并做相应处理。
实际上,使用错误捕获后,编译后的代码实际上做了很多不为我们所知的操作,虽然 使用错误捕获从一定程度上方便了编码过程,却牺牲了一定的速度,有利有弊,所以我们应该正确的使用 错误捕获。
测试的VB.NET
- Option Explicit
- Dim cn As New ADODB.Connection
- Dim rs As New ADODB.Recordset
- Dim m_FldsName() As String
- Private Sub Command1_Click()
- Dim II As Long
- Dim t As Single
- cn.Open "Provider=SQLOLEDB.1;Persist
Security Info=False;User ID=sa;Initial
Catalog=广商;Data Source=SUPER"- rs.Open "Select * from FldSet ",
cn, adOpenKeyset- Do Until rs.EOF = True
- rs.MoveNext
- Loop
- rs.MoveFirst
- t = Timer
- ReDim m_FldsName(rs.Fields.Count)
- For II = 0 To rs.Fields.Count - 1
- m_FldsName(II) = rs.Fields(II).Name
- Next
- Do Until rs.EOF = True
- ReadFieldsNotOnErr "Err1"
- ReadFieldsNotOnErr "TableName"
- ReadFieldsNotOnErr "Err2"
- rs.MoveNext
- Loop
- MsgBox "NotErr:" & Timer - t
- On Error Resume Next
- rs.MoveFirst
- t = Timer
- Do Until rs.EOF = True
- ReadFieldsOnErr "Err1"
- ReadFieldsOnErr "TableName"
- ReadFieldsOnErr "Err2"
- rs.MoveNext
- Loop
- MsgBox "OnErr:" & Timer - t
- rs.Close
- cn.Close
- End Sub
- Private Sub ReadFieldsOnErr
(FieldName As String)- Dim v As Variant
- v = rs(FieldName).Value
- End Sub
- Private Sub ReadFieldsNotOnErr
(FieldName As String)- Dim II As Long
- Dim IsExists As Boolean
- Dim v As Variant
- IsExists = False
- For II = 0 To UBound(m_FldsName) - 1
- If m_FldsName(II) = FieldName Then
- IsExists = True
- Exit For
- End If
- Next
- If IsExists = True Then
- v = rs(FieldName).Value
- End If
- End Sub
测试结果:
无错误时
- ReadFieldsOnErr : 0。46
- ReadFieldsNotOnErr : 0。47
有错误时
- ReadFieldsOnErr : 0.96
- ReadFieldsNotOnErr : 0.47
可以看到:不使用VB.NET错误处理,速度相当稳定,而使用VB.NET错误处理时,有错误的情况下速度落差较大,所以 对于在循环中 频繁调用 的子过程,建议对可能出现的错误进行预处理,减少使用 On error来提升速度。