2009-05-20 13 views

उत्तर

13

कैसा रहेगा ...

यह myArray

Redim Preserve MyArray(15) 

में पहले से ही डेटा को सुरक्षित रखेगा यह myArray

Redim MyArray(15) 
11

सबसे कुशल तरह से करने के लिए मौजूदा किसी भी पिछले डेटा मिटा देगा सरणीकरण एक सरणी है कि आप उस सरणी का आकार बदलने की संख्या को सीमित कर सकते हैं। हर बार जब आप सरणी का आकार बदलते हैं तो वीबी पूरी सरणी ले लेगा और इसे कॉपी करेगा, समय और स्मृति बर्बाद कर देगा।

यदि आप विकास समय पर अपने सरणी के आकार को नहीं जानते हैं तो आपको सरणी के अधिकतम आकार में सबसे अच्छा अनुमान लगाना चाहिए, फिर सरणी भरें। एक बार सरणी भरने के बाद आप इसे सही आकार में बदल सकते हैं।

लूप में अंतरिक्ष से बाहर निकलने के बाद वर्तमान सरणी के आकार को दोगुना करके यह अनुमान लगाने के लिए सबसे अच्छा होता है। आप RedimTestA() के साथ नीचे की कार्रवाई में इसे प्रत्येक पुनरावृत्ति (1,000,000 बार) और RedimTestB() सरणी का आकार बदलकर कभी-कभी इसका आकार बदल सकते हैं (22 बार)।

मेरे लैपटॉप पर RedimTestA() लेता है 3.93 सेकंड और RedimTestB() 0.41 सेकंड लेता है।

Option Explicit 

Sub RedimTest() 
    Dim tA, tB As Single 
    tA = RedimTestA(1000000) 
    tB = RedimTestB(1000000) 

    MsgBox "Test A takes : " & tA & ", and Test B takes : " & tB 

End Sub 


Function RedimTestA(iterations As Long) As Single 
    Dim t As Single 
    Dim i As Long 
    Dim aryString() As String 
    Dim myString As String 

    t = Timer 
    Do While i <= iterations 
    ReDim Preserve aryString(i) As String 
    aryString(i) = "ABCEFG123" 
    i = i + 1 
    Loop 
    RedimTestA = Timer - t 

End Function 


Function RedimTestB(iterations As Long) As Single 
    Dim t As Single 
    Dim i As Long 
    Dim aryString() As String 
    Dim myString As String 

    t = Timer 

    ReDim aryString(0) As String 
    Do While i <= iterations 
    If i >= UBound(aryString) Then 
     ReDim Preserve aryString(i * 2) As String 
    End If 

    aryString(i) = "ABCEFG123" 
    i = i + 1 
    Loop 

    ReDim Preserve aryString(i - 1) As String ' i - 1 becuase of the final i = i + 1 
    RedimTestB = Timer - t 

End Function 
+2

ओह, चलो - जब तक आप पुनरावृत्ति के 1000s के साथ एक लूप में रीडिमिंग नहीं कर रहे हैं, यह वास्तव में एक यथार्थवादी समस्या नहीं होगी। मेरे पास बहुत सारे कोड हैं जो हर समय ReDims arrays और न तो प्रदर्शन और न ही स्मृति समस्याएं हैं। दूसरी तरफ, मैं मूल्यों के 1000s को संग्रहीत करने के लिए सरणी का उपयोग नहीं करता (यही वह टेबल और रिकॉर्डसेट है)। –

+0

पूरी तरह से @ डेविड से सहमत हैं। यह रन टाइम पर अधिक कुशल है, लेकिन क्या मैं इसका इस्तेमाल करूंगा? शायद ही कभी, अगर मैं कुछ प्रकार के जादू सरणी हैंडलिंग कक्षा लिख ​​रहा था। –

+0

निहित प्रश्न का उत्तर यदि अक्सर रिकॉर्डकार्ट कर्सर प्रकार का उपयोग करने के लिए रिकॉर्डकाउंट गुण का उपयोग करता है (यानी पंक्तियों की संख्या लौटाई जाती है) ताकि आप एक हिट में सरणी को आयाम कर सकें। यदि रिकॉर्डसेट एडीओ है, तो आप रीडिम के साथ शामिल किए बिना सामग्री की सरणी वापस करने के लिए अपनी GetRows विधि का उपयोग कर सकते हैं :) – onedaywhen

8

यह भी ध्यान रखें कि आप केवल बहु आयामी सरणी के दाएं सबसे अधिक आयाम को फिर से कर सकते हैं।

+0

यह ध्यान में रखना एक महत्वपूर्ण सूक्ष्म नोट है। –

संबंधित मुद्दे