Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Что быстрее: использовать несколько переменных или одну и перезаписывать ее

Автор Novadies, 18.08.2021, 11:27:13

« назад - далее »

Novadies

Добрый день, у меня созрел теоретический вопрос по работе вба, касающийся оптимизации и быстродействия в части использования переменных.
А именно, есть ли разница между двумя вариантами по скорости обработки.
Пишешь макрос....

Вариант А.
создаёшь кучу переменных и каждой по ходу кода присваивается одно значение.

Вариант Б.
создаёшь наименьшее возможное количество переменных и перезаписываешь их по мере выполнения кода.

vikttur

Перезапись - это какое-то время. Больше переменных - больше оперативной памяти занято.
Балансируйте между временем и использованием оперативки. Как? Никто не скажет. Разные переменные могут по разному занимать время для перезаписи, разные машины имеют разные объемы памяти и скорости обработки, в разных задачах применение переменных различается.

Дмитрий Щербаков(The_Prist)

Плюс нельзя не учитывать и типы данных, которые перезаписываем и учитывает ли это тип переменной. Например, если используем переменную типа String, то перезапись текстовой переменной будет напрямую зависеть от длины текста. Однако, если используется только одна переменная типа Variant, в которую кидаем то один тип, то другой - тут перезапись будет еще дольше, чем в переменную заранее назначенного типа.
В большинстве случаев(если не работаете с очень большими текстовыми переменными) Вы не заметите разницы между использованием одной и той же переменной или для каждого текста своей. Но везде надо подходить с умом. Если Вы используете несколько каких-либо циклов для обработки массивов, то имеет смысл использовать там одну переменную как для самого цикла, так и для считывания данных. Например, такой код будет более оптимален:
Sub test1()
    Dim s As String, lr As Long, lcnt As Long
    Dim arr
    arr = Range("A2:A100").Value
    For lr = 1 To UBound(arr, 1)
        s = arr(lr, 1)
        If StrComp(s, "яблоко", 1) = 0 Then
            lcnt = lcnt + 1
        End If
    Next
    Range("A1").Value = lcnt
   
    lcnt = 0
    arr = Range("B2:B100").Value
    For lr = 1 To UBound(arr, 1)
        s = arr(lr, 1)
        If StrComp(s, "банан", 1) = 0 Then
            lcnt = lcnt + 1
        End If
    Next
    Range("B1").Value = lcnt
   
    lcnt = 0
    arr = Range("C2:C100").Value
    For lr = 1 To UBound(arr, 1)
        s = arr(lr, 1)
        If StrComp(s, "ананас", 1) = 0 Then
            lcnt = lcnt + 1
        End If
    Next
    Range("C1").Value = lcnt
End Sub

чем такой:
Sub test2()
    Dim s1 As String, s2 As String, s3 As String
    Dim lr1 As Long, lr2 As Long, lr3 As Long, lcnt1 As Long, lcnt2 As Long, lcnt3 As Long
    Dim arr1, arr2, arr3
    arr1 = Range("A2:A100").Value
    For lr1 = 1 To UBound(arr1, 1)
        s1 = arr1(lr1, 1)
        If StrComp(s1, "яблоко", 1) = 0 Then
            lcnt1 = lcnt1 + 1
        End If
    Next
    Range("A1").Value = lcnt1
   
    arr2 = Range("B2:B100").Value
    For lr2 = 1 To UBound(arr2, 1)
        s2 = arr2(lr2, 1)
        If StrComp(s2, "банан", 1) = 0 Then
            lcnt2 = lcnt2 + 1
        End If
    Next
    Range("B1").Value = lcnt2
   
    arr3 = Range("C2:C100").Value
    For lr3 = 1 To UBound(arr3, 1)
        s3 = arr3(lr3, 1)
        If StrComp(s3, "ананас", 1) = 0 Then
            lcnt3 = lcnt3 + 1
        End If
    Next
    Range("C1").Value = lcnt3
End Sub

опять же - это если рассматривать только использование переменных, а не сам алгоритм. Во втором коде нам переменные arr1, lr1, s1 и lcnt1 нужны только для первого цикла. Начиная со второго цикла они лишь обуза для памяти, т.к. больше нигде в процедуре не используются. Первый же код использует память в этом плане более рационально - только тогда, когда переменная используется. Именно поэтому в первом коде переменные используются одни и те же и просто перезаписываются.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Novadies


Яндекс.Метрика Рейтинг@Mail.ru