公認的觀點是使用像Dim dict As New Dictionary
這樣的結構在性能上比Dim dict As Dictionary/Set dict = New Dictionary
差。Excel VBA自動實例化的神話性能不佳嗎?
解釋是前面的示例 - 自動實例化 - 將實例化延遲到變量dict
的第一次使用。因此,每次字典被引用,編譯的代碼必須首先檢查dict
是否等於Nothing。
但是,我發現編譯代碼無論如何都這樣做。每當您嘗試使用Nothing
的對象引用時,您都會收到錯誤消息。
所以,爲了向科學致敬,我跑了一些測試。結果表明兩種方法之間沒有性能差異。 (在Excel 2007上運行)
調用「創建字典&添加2個項目」100,000次。
- 明確:16,891ms /自動:16,797ms(自動94ms更快)
- 明確:16,797ms /自動:16,781ms(自動爲16ms更快)
反向測試調用的順序:
- 自動:16,766ms /顯式:16,812ms(自動46ms更快)
- 自動:16,828ms /顯式:16,813ms(顯式15ms的更快)
調用「創建字典&添加6個項目」100,000次。
- 汽車:17,437ms /明確:17,407ms(顯式30毫秒更快)
- 汽車:17,343ms /明確:17,360ms(自動17MS更快)
創建詞典並添加100000項目。
- 汽車:391ms /明確:391ms(同)
創建詞典並添加百萬個。
- 汽車:57,609ms /明確:58,172ms(自動563ms更快)
- 明確:57,343ms /自動:57,422ms(顯式79ms更快)
我看到任何跡象表明自動實例化與顯式實例化的關係很差。 (要清楚,由於其他原因,我會避免自動實例化,但我只是在這裏表現角度感興趣。)
那麼這是一個神話嗎?
UPDATE
讓我奠定了爲什麼性能說法沒有道理給我。據說,
x.Add("Key", "Item")
在自動實例化對象
等同於以下內容:
If x is Nothing then
Set x = New Dictionary
End If
x.Add("Key", "Item")
這使得它看起來像「可怕的開銷,」如果你調用這個數千次。但是在顯式實例的情況下,它在代碼的編譯版本生成邏輯的完全形式:
If x is Nothing Then
Err.Raise "Object variable not set..."
End If
x.Add("Key", "Item")
這並不一定意味着汽車是更長的時間,這就是爲什麼我問是否有任何事實。我想知道我是否已經確定了許多未經考驗的表演神話中的另一個。
它確實只是不同的「Nothing」語義,它將'As New'設置爲與Dim/Set'略有區別。正如你所說的,涉及運行時類型檢查的所謂開銷是不相關的,除非檢查的自動實例化對象實際上*是*'Nothing',否則不會發生比如果它是Dim/Set引用更多的情況。 –
@Alex K,這個古老的性能指南說*每個*變量的引用都會在自動情況下調用一個「If X Is Nothing」檢查,而Dim/Set變量不會。所以當你在聲明後訪問對象時,你必須測試是否有性能問題,而不是測試聲明本身。 –
@JP不是真的 - 我在今天看到的另一個SO問題後Google搜索了一下。例如:http://www.cpearson.com/excel/classes.aspx另一個例子:http://www.bettersolutions.com/vba/VUA113/LI912711911.htm –