VB5.0中大量使用OLE,對象的正確使用對于開發(fā)一個高效的應(yīng)用程序是非常關(guān)鍵的。因此,筆者想談一談OLE調(diào)用的優(yōu)化。
一、利用WITH語句減少重復(fù)調(diào)用。
為了設(shè)置單個對象的多個特性,可以使用WITH END WITH減少激活引用鏈設(shè)置特性的次數(shù),在這種情況下,甚至不需要定義對象類型的臨時對象。例如:DBEngine.WorkSpace(0).Databases(0).
RecordSet.Fields(0).Name="jx"
DBEngine.WorkSpace(0).Databases(0).RecordSet.Fields(0).Height="1.75"
可以這樣賦值:WITH DBEngine.WorkSpace(0).Databases(0)
.RecordSet.Fields(0).Name="jx"
.Height="1.75"
END WITH
很明顯,減少了執(zhí)行賦值所必須做的OLE對象查詢的次數(shù)。
二、使用可以提供的最特定的對象。
在VB中訪問任何對象的模型通常要求重復(fù)使用OBJECT.PROPERTY語句,那么這個引用鏈將變得很長。
DBEngine.WorkSpace(0).Databases(0).RecordSet.Fields(0).Name
在上面這個序列中每個點代表VB為了訪問下一個元素要求的OLE查找。如果將這樣一條語句放到循環(huán)中,會產(chǎn)生大量不必要的查找:
例如For I%=0 TO DBEngine.WorkSpace(0).Databases(0).R
ecordSet.Field.Count-1
Print DBEngine.WorkSpace(0).Databases(0).RecordSet.Fi
elds(I%).Name
Next
如果通過使用可用的最特定的對象類型,可以大大減少同一個
循環(huán)的開銷。程序變換如下:
DIM X AS Fields
DIM Y AS Field
SET X=DBEngine.WorkSpace(0).Databases(0).RecordSet.Fi
elds(0)
FOR EACH Y IN X
Print F.Name
Next
三、最小化跨進程OLE調(diào)用。
OLE Automation對程序內(nèi)的對象的調(diào)用總是比跨進程調(diào)用要快,如果處理可以在一個程序內(nèi)完成,就會比調(diào)用另一個應(yīng)用程序快。如果進行跨進程OLE Automation,一個硬輸入的(DIM X AS SPECIFICTYPE)而不是“AS OBJECT”的對象會大大減少開銷,因為只需一個跨進程調(diào)用。
四、使用進程內(nèi)而不是進程外的OLE服務(wù)器。進程外OLE服務(wù)器(使用MAKE EXE建立的OLE服務(wù)器)比進程內(nèi)OLE服務(wù)器(使用MAKE DLL建立的OLE服務(wù)器)慢得多。
一、利用WITH語句減少重復(fù)調(diào)用。
為了設(shè)置單個對象的多個特性,可以使用WITH END WITH減少激活引用鏈設(shè)置特性的次數(shù),在這種情況下,甚至不需要定義對象類型的臨時對象。例如:DBEngine.WorkSpace(0).Databases(0).
RecordSet.Fields(0).Name="jx"
DBEngine.WorkSpace(0).Databases(0).RecordSet.Fields(0).Height="1.75"
可以這樣賦值:WITH DBEngine.WorkSpace(0).Databases(0)
.RecordSet.Fields(0).Name="jx"
.Height="1.75"
END WITH
很明顯,減少了執(zhí)行賦值所必須做的OLE對象查詢的次數(shù)。
二、使用可以提供的最特定的對象。
在VB中訪問任何對象的模型通常要求重復(fù)使用OBJECT.PROPERTY語句,那么這個引用鏈將變得很長。
DBEngine.WorkSpace(0).Databases(0).RecordSet.Fields(0).Name
在上面這個序列中每個點代表VB為了訪問下一個元素要求的OLE查找。如果將這樣一條語句放到循環(huán)中,會產(chǎn)生大量不必要的查找:
例如For I%=0 TO DBEngine.WorkSpace(0).Databases(0).R
ecordSet.Field.Count-1
Print DBEngine.WorkSpace(0).Databases(0).RecordSet.Fi
elds(I%).Name
Next
如果通過使用可用的最特定的對象類型,可以大大減少同一個
循環(huán)的開銷。程序變換如下:
DIM X AS Fields
DIM Y AS Field
SET X=DBEngine.WorkSpace(0).Databases(0).RecordSet.Fi
elds(0)
FOR EACH Y IN X
Print F.Name
Next
三、最小化跨進程OLE調(diào)用。
OLE Automation對程序內(nèi)的對象的調(diào)用總是比跨進程調(diào)用要快,如果處理可以在一個程序內(nèi)完成,就會比調(diào)用另一個應(yīng)用程序快。如果進行跨進程OLE Automation,一個硬輸入的(DIM X AS SPECIFICTYPE)而不是“AS OBJECT”的對象會大大減少開銷,因為只需一個跨進程調(diào)用。
四、使用進程內(nèi)而不是進程外的OLE服務(wù)器。進程外OLE服務(wù)器(使用MAKE EXE建立的OLE服務(wù)器)比進程內(nèi)OLE服務(wù)器(使用MAKE DLL建立的OLE服務(wù)器)慢得多。

