2009-05-20 5 views

Antwort

13

Wie wäre es ...

Diese Daten bereits in MyArray

Redim Preserve MyArray(15) 

bewahren Dies wird bestehende alle vorherigen Daten löschen in MyArray

Redim MyArray(15) 
11

Die effiziente Weg Die Redimensionierung eines Arrays beschränkt die Anzahl der Größenanpassungen dieses Arrays. Jedes Mal, wenn Sie die Größe des Arrays ändern, nimmt VB das gesamte Array und kopiert es, wodurch Zeit und Speicher verschwendet werden.

Wenn Sie nicht über die Größe der Array zur Entwicklungszeit wissen, sollten Sie die beste Vermutung auf die maximale Größe des Arrays machen, dann das Array füllen. Sobald Sie das Array gefüllt haben, können Sie es auf die richtige Größe verkleinern.

in Schleifen ist es oft am besten, diese Vermutung zu machen, indem die Größe des aktuellen Arrays verdoppelt, wenn Sie aus dem Raum laufen. Sie können dies unter in Aktion mit RedimTestA() der Anordnung jede Iteration (1.000.000 mal) Ändern der Größe und RedimTestB() Ändern der Größe nur gelegentlich (22-mal).

Auf meinem Laptop RedimTestA() dauert 3,93 Sekunden und RedimTestB() dauert 0,41 Sekunden.

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

Oh, komm schon - es sei denn, du bist in einer Schleife mit 1000s Wiederholungen ReDimming, das wird nicht wirklich ein realistisches Problem sein. Ich habe eine Menge Code da draußen, dass ReDims-Arrays die ganze Zeit und es gibt weder Leistung noch Speicherprobleme. Auf der anderen Seite verwende ich keine Arrays zum Speichern von 1000er Werten (dafür gibt es Tabellen und Recordsets). –

+0

Stimmen Sie @David vollständig zu. Dies ist zur Laufzeit effizienter, aber würde ich es verwenden? Nur selten, wahrscheinlich nur, wenn ich eine Art magischer Array-Handling-Klasse schrieb. –

+0

Die Antwort auf die Frage, ob impliziert oft eine Datensatzcursortyp zu verwenden, die die Eigenschaft Record unterstützt (das heißt zurück die Anzahl der Zeilen), so kann man in einem Treffer die Array-Dimension. Wenn das Re-Cord ADO ist, können Sie seine GetRows-Methode verwenden, um ein Array von Inhalten zurückzukehren, ohne überhaupt :) – onedaywhen

8

Beachten Sie auch, dass Sie nur die rechte Dimension eines multidimensionalen Arrays redimieren können.

+0

Das ist eine wichtige subtile Note zu berücksichtigen. –