VB6中使用错误处理对程序速度的影响

发表于:2007-05-25来源:作者:点击数: 标签:程序VB6速度影响错误
在 VB 6 中,我们使用 On Error 来捕获和处理错误,而且经常使用 On Error Resume Next 来可能产生的忽略错误。 那么 使用错误捕获是否会影响速度呢? 是的,使用错误处理将会降低一些 性能 ,在。Net 中,使用 Try Catch 也将会影响性能,所以我们使用Refle
  在 VB6 中,我们使用 On Error 来捕获和处理错误,而且经常使用 On Error Resume Next 来可能产生的忽略错误。

  那么 使用错误捕获是否会影响速度呢?

  是的,使用错误处理将会降低一些性能,在。Net 中,使用 Try Catch 也将会影响性能,所以我们使用Reflector 反编译微软的类库时,会发现他的子过程很少使用 Try 来捕获错误,基本都是采用可预知的方式来判断可能出现的错误,并做相应处理。

  实际上,使用错误捕获后,编译后的代码实际上做了很多不为我们所知的操作,虽然 使用错误捕获从一定程度上方便了编码过程,却牺牲了一定的速度,有利有弊,所以我们应该正确的使用 错误捕获。

  测试的VB6代码

clearcase/" target="_blank" >cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1">
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

  可以看到:不使用错误处理,速度相当稳定,而使用错误处理时,有错误的情况下速度落差较大。所以 对于在循环中 频繁调用 的子过程,建议对可能出现的错误进行预处理,减少使用 On error来提升速度。

原文转自:http://www.ltesting.net