在 vb6 中,我們使用 on error 來(lái)捕獲和處理錯(cuò)誤,而且經(jīng)常使用 on error resume next 來(lái)可能產(chǎn)生的忽略錯(cuò)誤。
那么 使用錯(cuò)誤捕獲是否會(huì)影響速度呢?
是的,使用錯(cuò)誤處理將會(huì)降低一些性能,在。net 中,使用 try catch 也將會(huì)影響性能,所以我們使用
reflector 反編譯微軟的類庫(kù)時(shí),會(huì)發(fā)現(xiàn)他的子過(guò)程很少使用 try 來(lái)捕獲錯(cuò)誤,基本都是采用可預(yù)知的方式來(lái)判斷可能出現(xiàn)的錯(cuò)誤,并做相應(yīng)處理。
實(shí)際上,使用錯(cuò)誤捕獲后,編譯后的代碼實(shí)際上做了很多不為我們所知的操作,雖然 使用錯(cuò)誤捕獲從一定程度上方便了編碼過(guò)程,卻犧牲了一定的速度,有利有弊,所以我們應(yīng)該正確的使用 錯(cuò)誤捕獲。
測(cè)試的vb6代碼
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
===================================
測(cè)試結(jié)果:
無(wú)錯(cuò)誤時(shí)
readfieldsonerr : 0。46
readfieldsnotonerr : 0。47
有錯(cuò)誤時(shí)
readfieldsonerr : 0.96
readfieldsnotonerr : 0.47
可以看到:不使用錯(cuò)誤處理,速度相當(dāng)穩(wěn)定,而使用錯(cuò)誤處理時(shí),有錯(cuò)誤的情況下速度落差較大
所以 對(duì)于在循環(huán)中 頻繁調(diào)用 的子過(guò)程,建議對(duì)可能出現(xiàn)的錯(cuò)誤進(jìn)行預(yù)處理,減少使用 on error
來(lái)提升速度
新聞熱點(diǎn)
疑難解答
圖片精選