VB6中使用错误处理对程序速度的影响
在VB6中,我们使用On Error来捕获和处理错误,并经常使用On Error Resume Next来忽略可能的错误。
那么使用错误捕获会影响速度吗?
是的,使用错误处理会降低一些性能。Net中,Try Catch的使用也会影响性能,所以当我们用Reflector反编译微软的类库时,会发现它的子进程很少使用Try Catch错误,基本都是采用可预测的方式来判断可能的错误并进行相应的处理。
实际上,使用错误捕获后,编译后的代码实际上做了很多未知的操作。虽然使用错误捕获在一定程度上方便了编码过程,但是牺牲了一定的速度,有利有弊,所以要正确使用错误捕获。
测试VB6的代码。
选项显式
Dim cn作为新ADODB。连接
Dim rs As New ADODB。记录集
Dim m_FldsName()为字符串
私有子命令1_Click()
Dim II As Long
Dim t As Single
cn。Open " Provider = SQLOLEDB.1Persist安全信息= False用户ID = sa初始目录=宽商;数据源= SUPER " "/br/]RS。打开“Select * from FldSet”,cn,adOpenKeyset
做直到rs。EOF = True
rs。MoveNext
循环
rs。MoveFirst
t =计时器
ReDim m_FldsName(rs。Fields.Count)
用于II = 0至rs。field s . Count-1
m _ flds name(II)= RS。字段(二)。下一个名字
做直到rs。EOF = True
ReadFieldsNotOnErr " err 1 "
ReadFieldsNotOnErr " TableName "
ReadFieldsNotOnErr " err 2 "
rs。MoveNext
Loop
MsgBox " NotErr:" & Timer-t
出错时继续下一个
rs。MoveFirst
t = Timer
Do Until RS。EOF = True
ReadFieldsOnErr " err 1 "
ReadFieldsOnErr " TableName "
ReadFieldsOnErr " err 2 "
RS。MoveNext
Loop
MsgBox " OnErr:" & Timer-t
rs。关闭
cn。关闭
末端接头
private Sub ReadFieldsOnErr(field name As String)
Dim v As Variant
v = RS(field name)。值
结束Sub
private Sub ReadFieldsNotOnErr(field name As String)
Dim II Long
Dim is exists As Boolean
Dim v As Variant
is exists = False
For II = 0 To UBound(m _ flds name)-1
If m _ flds name(II)= field name Then
is exists = True
Exit For
End If
Next
如果IsExists = True,则
v = rs(FieldName)。值
End If
End Sub
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
测试结果:
无误差时间
ReadFieldsOnErr : 0 .46
ReadFieldsNotOnErr : 0 .47
当出现错误时
读取字段错误:0.96
读取字段数错误率:0.47
可以看到,没有错误处理的时候速度相当稳定,但是使用错误处理的时候,有错误的时候速度下降很大。因此,对于循环中频繁调用的子流程,建议对可能出现的错误进行预处理,减少On error的使用以加快速度。
位律师回复
0条评论