2009-05-20 80 views

Trả lời

13

Làm thế nào về ...

này sẽ bảo toàn dữ liệu đã có trong myArray

Redim Preserve MyArray(15) 

này sẽ xóa bất kỳ dữ liệu trước đó tồn tại trong myArray

Redim MyArray(15) 
11

Nhất hiệu quả cách để redimension một mảng là để giới hạn số lần bạn thay đổi kích thước mảng đó. Mỗi khi bạn thay đổi kích cỡ mảng VB sẽ lấy toàn bộ mảng và sao chép nó, lãng phí thời gian và bộ nhớ.

Nếu bạn không biết kích thước mảng của mình tại thời điểm phát triển, bạn nên thực hiện phỏng đoán tốt nhất với kích thước tối đa của mảng, sau đó điền vào mảng. Sau khi điền xong mảng, bạn có thể thay đổi kích thước của nó xuống kích thước chính xác.

Trong các vòng, thường là tốt nhất để thực hiện dự đoán này bằng cách tăng gấp đôi kích thước của mảng hiện tại khi bạn hết dung lượng. Bạn có thể thấy điều này trong hành động dưới đây với RedimTestA() thay đổi kích thước mảng mỗi lần lặp (1.000.000 lần) và RedimTestB() chỉ thay đổi kích thước đôi khi (22 lần).

Trên máy tính xách tay của tôi RedimTestA() mất 3,93 giây và RedimTestB() mất 0,41 giây.

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

Ồ, thôi nào - trừ khi bạn đang ReDimming trong một vòng lặp với 1000 lần lặp lại, điều này thực sự không phải là một vấn đề thực tế. Tôi có rất nhiều mã ra có ReDims mảng tất cả các thời gian và không có hiệu suất cũng không phải vấn đề bộ nhớ. Mặt khác, tôi không sử dụng các mảng để lưu trữ 1000 giá trị (đó là những gì các bảng và các bản ghi được sử dụng). –

+0

Hoàn toàn đồng ý với @David. Điều này hiệu quả hơn vào thời gian chạy, nhưng tôi có sử dụng nó không? Hiếm khi, có lẽ chỉ khi tôi đang viết một số loại lớp xử lý mảng ma thuật. –

+0

Câu trả lời cho câu hỏi ngụ ý nếu thường sử dụng loại con trỏ recordset hỗ trợ thuộc tính RecordCount (nghĩa là số hàng được trả về) để bạn có thể định kích thước mảng trong một lần truy cập. Nếu recordset là ADO, bạn có thể sử dụng phương thức GetRows của nó để trả về một mảng nội dung mà không liên quan đến ReDim chút nào :) – onedaywhen

8

Cũng lưu ý rằng bạn chỉ có thể lấy lại kích thước phù hợp nhất của mảng đa chiều.

+0

Đó là một lưu ý quan trọng cần lưu ý. –

Các vấn đề liên quan