Visual Basic Тема - PullRequest
       50

Visual Basic Тема

0 голосов
/ 24 декабря 2018

Мой предполагаемый заголовок для этого поста: VB6 (VBA) Loop Code Optimization (извините за любые проблемы)

Поэтому я использую этот код в моей программе VB6 (VBA):

Public Sub Form_Load()
    Dim Output As String
    For i = 1 To 990
        For i2 = 1 To 990
            Output = Output & i * i2
        Next
    Next
End Sub

И у меня проблемы с тем, что циклы for работают очень медленно, а в экстремальных случаях выполняется несколько часов.Любые советы по оптимизации моего кода?

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Это будет немного быстрее, чем решение, предоставляемое @ DisplayName

Public Sub Form_Load()
Const I_MAX     As Long = 990
Const I2_MAX    As Long = 990

Dim Output  As String
Dim i       As Long
Dim i2      As Long
Dim lCount  As Long
Dim arr     As Variant

lCount = 0
ReDim arr(I_MAX * I2_MAX)

For i = 1 To I_MAX
    For i2 = 1 To I2_MAX
        arr(lCount) = i * i2
        lCount = lCount + 1
    Next
Next

Output = Join(arr, vbNullString)
Debug.Print Output
End Sub
0 голосов
/ 24 декабря 2018

Ваша проблема в том, что вы тасуете миллионы мегабайт памяти.На полпути ваш код копирует 5,7 МБайт из одной области памяти в другую каждый раз через внутренний цикл.В общей сложности от 5700 гигабайт по всей программе.

Правила объединяют небольшие строки вместе, а затем объединяют меньшие строки в конце конкатенации.Чтобы строки меньшего размера не превышали, скажем, 4000 байтов, затем присоедините эти файлы в конце.

У современных языков есть объект для построения строк, у VBA тоже есть объект, который просто не называется.

ВВ VBA есть функция Mid и оператор Mid.Они делают противоположные вещи.Итак, вы сначала создаете свой последний укус.Затем с помощью оператора Mid вставьте подстроки в первую строку.Это позволяет избежать сотен мегабайт перетасовки.Используйте Rtrim, чтобы убрать лишние пробелы в конце.Если вы уменьшите вывод до 6 миллионов пробелов, то он уместится в вашем примере и будет использовать около 12 МБ по сравнению с тысячами гигабайт.

Вот небольшой пример.

Private Sub Form_Load()
OutPut = Space(1500)

For x = 1 To 500
    Offset = Offset + Len(CStr(x))
    Mid(OutPut, Offset) = CStr(x)
Next
MsgBox OutPut
End Sub

См. Указатели, необходимые для ускорения макроса вложенного цикла в VBA

0 голосов
/ 24 декабря 2018

Я с трудом догадываюсь, для чего это нужно, но промежуточный шаг с массивами ускоряет его

Public Sub Form_Load2()
    Const n As Long = 500, n2 As Long = 200

    Dim Output As String
    Dim i As Long, i2 As Long

    ReDim vals(1 To n2) As String
    For i = 1 To n
        For i2 = 1 To n2
            vals(i2) = i * i2
        Next
        Output = Output & Join(vals, "")
    Next
    Debug.Print Output
End Sub

С ограничением i и i2 соответственно, соответственно 500 и 200, это почти мгновенно

Вам нужно попробовать большее число, но я посоветую вам сделать небольшие шаги ..

...