स्वीकृत ज्ञान यह है कि Dim dict As New Dictionary
जैसे निर्माण का उपयोग Dim dict As Dictionary/Set dict = New Dictionary
से प्रदर्शन में गरीब है।क्या एक्सेल वीबीए का खराब प्रदर्शन एक मिथक को ऑटो-इंस्टेंसिंग कर रहा है?
स्पष्टीकरण यह है कि पूर्व उदाहरण - ऑटो-इंस्टेंटेशन - परिवर्तनीय dict
के पहले उपयोग तक तत्कालता को रोकता है। और इस प्रकार, हर बार निर्देश का संदर्भ दिया जाता है, संकलित कोड को पहले जांच करनी चाहिए कि dict
कुछ भी बराबर नहीं है।
लेकिन यह मेरे लिए होता है कि संकलित कोड वैसे भी करता है। किसी भी समय जब आप किसी ऑब्जेक्ट संदर्भ का उपयोग करने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी जो Nothing
है।
तो, विज्ञान के लिए श्रद्धांजलि में, मैंने कुछ परीक्षण चलाए। और परिणाम बताते हैं कि दोनों दृष्टिकोणों के बीच कोई प्रदर्शन अंतर नहीं है। (Excel 2007 पर चलाने के लिए)
कॉल 100,000 बार "बनाने के शब्दकोश & 2 आइटम जोड़ने"।
- स्पष्ट: 16,891ms/ऑटो: 16,797ms (ऑटो 94ms तेज)
- स्पष्ट: 16,797ms/ऑटो: 16,781ms (ऑटो 16ms तेजी से)
परीक्षण कॉल के आदेश रिवर्स :
- ऑटो: 16,766ms/स्पष्ट: 16,812ms (ऑटो 46ms तेज)
- ऑटो: 16,828ms/स्पष्ट: 16,813ms (स्पष्ट 15ms तेज)
कॉल 100,000 बार "बनाने के शब्दकोश & 6 आइटम जोड़ने"।
- ऑटो: 17,437ms/स्पष्ट: 17,407ms (स्पष्ट 30ms तेज)
- ऑटो: 17,343ms/स्पष्ट: 17,360ms (ऑटो 17ms तेजी से)
शब्दकोश बनाएँ और 100,000 जोड़ने आइटम नहीं है।
- ऑटो: 391ms/स्पष्ट: 391ms (एक ही)
शब्दकोश बनाएं और 1,000,000 आइटम जोड़ने।
- ऑटो: 57,609ms/स्पष्ट: 58,172ms (ऑटो 563ms तेज)
- स्पष्ट: 57,343ms/ऑटो: 57,422ms (स्पष्ट 79ms तेजी से)
मुझे लगता है कि इंगित करने के लिए कुछ भी नहीं देखना ऑटो-इंस्टेंटेशन स्पष्ट तत्कालता के लिए एक खराब प्रदर्शन संबंध है। (स्पष्ट होने के लिए, अन्य कारणों से, मैं ऑटो-इंस्टेंटेशन से बचूंगा लेकिन मुझे यहां प्रदर्शन कोण में दिलचस्पी है।)
तो क्या यह एक मिथक है?
अद्यतन
मुझे बाहर रखना क्यों प्रदर्शन तर्क मेरे लिए कोई मतलब नहीं है करते हैं। कहा जाता है कि
x.Add("Key", "Item")
एक स्वत: instantiated वस्तु में
निम्नलिखित के बराबर है:
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")
यह जरूरी है कि ऑटो का पालन नहीं करता है कि क्या वहाँ था कि मैं क्यों पूछ रहा हूँ, अब है इस के लिए कोई सच है। मुझे आश्चर्य है कि मैंने कई अनचाहे प्रदर्शन मिथकों में से एक को पहचाना है।
यह वास्तव में केवल अलग-अलग "कुछ भी नहीं" अर्थशास्त्र है जो 'Dim/Set' के अलावा थोड़ा 'As' सेट करता है। जैसा कि आप कहते हैं कि रनटाइम प्रकार की जांच से जुड़े तथाकथित ओवरहेड को अप्रासंगिक माना जाता है कि जब तक कि चेक किए गए ऑटो-इंस्टॉस्ड ऑब्जेक्ट वास्तव में * * कुछ भी नहीं 'है, तो यह' Dim/Set' संदर्भ 'से अधिक नहीं होता है। –
@ एलेक्स के, इस उम्र के पुराने प्रदर्शन दिशानिर्देश कहते हैं कि * प्रत्येक * वैरिएबल के संदर्भ में ऑटो केस में "यदि एक्स कुछ भी नहीं है" का आह्वान करेगा, जो एक मंद/सेट चर नहीं होगा। इसलिए जब आप घोषणापत्र के बाद ऑब्जेक्ट तक पहुंचते हैं तो घोषणा प्रदर्शन के बजाए प्रदर्शन प्रदर्शन होने पर आपको परीक्षण करना पड़ता है। –
@ जेपी सच नहीं है- मैंने इसे एक और SO प्रश्न के बाद गुगल किया, आज मैं देख रहा था। उदाहरण: http://www.cpearson.com/excel/classes.aspx एक और उदाहरण: http://www.bettersolutions.com/vba/VUA113/LI912711911.htm –