在 VB 中我们使用 On Error 来捕获和处理错误而且经常使用 On Error Resume Next 来可能产生的忽略错误 那么 使用错误捕获是否会影响速度呢? 是的使用错误处理将会降低一些性能在Net 中使用 Try Catch 也将会影响性能所以我们使用 Reflector 反编译微软的类库时会发现他的子过程很少使用 Try 来捕获错误基本都是采用可预知的方式来判断可能出现的错误并做相应处理 实际上使用错误捕获后编译后的代码实际上做了很多不为我们所知的操作虽然 使用错误捕获从一定程度上方便了编码过程却牺牲了一定的速度有利有弊所以我们应该正确的使用 错误捕获 测试的VB代码 Option Explicit Dim cn As New ADODBConnection Dim rs As New ADODBRecordset Dim m_FldsName() As String Private Sub Command_Click() Dim II As Long Dim t As Single cnOpen Provider=SQLOLEDB;Persist Security Info=False;User ID=sa;Initial Catalog=广商;Data Source=SUPER rsOpen Select * from FldSet cn adOpenKeyset Do Until rsEOF = True rsMoveNext Loop rsMoveFirst t = Timer ReDim m_FldsName(rsFieldsCount) For II = To rsFieldsCount m_FldsName(II) = rsFields(II)Name Next Do Until rsEOF = True ReadFieldsNotOnErr Err ReadFieldsNotOnErr TableName ReadFieldsNotOnErr Err rsMoveNext Loop MsgBox NotErr: & Timer t On Error Resume Next rsMoveFirst t = Timer Do Until rsEOF = True ReadFieldsOnErr Err ReadFieldsOnErr TableName ReadFieldsOnErr Err rsMoveNext Loop MsgBox OnErr: & Timer t rsClose cnClose 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 = To UBound(m_FldsName) 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 ReadFieldsNotOnErr 有错误时 ReadFieldsOnErr ReadFieldsNotOnErr 可以看到不使用错误处理速度相当稳定而使用错误处理时有错误的情况下速度落差较大 所以 对于在循环中 频繁调用 的子过程建议对可能出现的错误进行预处理减少使用 On error 来提升速度 |