Тема Visual Basic

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

Итак, я использовал этот код в своей программе 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, которые очень медленные, и в крайних случаях для их выполнения требуется несколько часов. Есть какие-нибудь советы по оптимизации моего кода?

Это всегда будет приводить к одному и тому же ответу, так почему вы рассчитываете его каждый раз? Просто проработайте это один раз и жестко закодируйте ответ (я думаю, результат будет примерно 8 * 10 ^ 8) Упс только что заметил, что вы используете &, так что это будет очень длинная строка, а не число. Таким образом, он выполняет долгое преобразование в строку каждый раз в цикле - неудивительно, что это занимает некоторое время - еще больше причин для жесткого кодирования строки

Harassed Dad 24.12.2018 11:15

Почему вы не можете использовать желаемое название в качестве фактического названия?

StayOnTarget 02.01.2019 13:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
86
3

Ответы 3

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

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, это происходит почти мгновенно.

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

Это будет немного быстрее, чем решение, предоставленное @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

Ваша проблема в том, что вы перетасовываете миллионы мегабайт памяти. На полпути ваш код копирует 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

Другие вопросы по теме