Страницы: 1
RSS
Разное время выполнения одного макроса. Причина
 
Добрый день.
Не являюсь опытным пользователем...

Написал макрос VBA Excel с массивами и словарями
Построено так (если отбросить лишнее): сначала загружаются словари, потом массивам присваиваются значения соответствующих колонок таблицы, потом начинаются главные циклы макроса, в которых используются загруженные словари и массивы. (т.е. словари и массивы загружаются один раз, в начале).

При первом запуске макроса после открытия эксель файла - он будет работать 39 сек.
Если после первого запуска макроса запустить его повторно - он будет работать 1 (одну) секунду.
Численный результат работы макроса в обоих случаях один и тот же.
Макрос обрабатывает довольно большую таблицу. Файл мой потихоньку разрастается. Сейчас в нем уже порядка 40 Мб.

Было ли у вас такое (разное время работы программы при первом и повторном запусках)? И куда "копать" в поисках возможной причины?

PS. Поясню. Вопрос для меня имеет практическое значение. Потому что я должен добавить в этот макрос один большой цикл в 10-20 тыс итераций с меняющимися параметрами. Соответственно, это будет 10 тыс х 39 сек или 10 тыс х 1 сек. Разница!
 
в вашем макросе есть разные блоки вычислений. Замерьте время выполнения каждого блока и вы увидите какой из блоков так долго выполняется. Например. поставьте 15 таймеров и если 14 таймеров выполняются 0,024 секунды, а один таймер 38 секунд - то уже анализируйте этот блок
Как пример

Код
Sub Test()
    Dim myTimer As Single, TimeElapsedOneBlock As Single, TimeElapsedTotal As Single, i As Long
    
    'блок 1
    myTimer = Timer 'засекаем время
    'что-то делаем
    For i = 1 To 100000000
        i = i * 1
    Next i
    'вычисляем затраченное время
    TimeElapsedOneBlock = Timer - myTimer
    TimeElapsedTotal = TimeElapsedTotal + TimeElapsedOneBlock
    Debug.Print TimeElapsedOneBlock, "- затрачено времени на Блок 1"
        
    'блок 2
    myTimer = Timer 'засекаем время
    'что-то делаем
    For i = 1 To 200000000
        i = i * 1
    Next i
    'вычисляем затраченное время
    TimeElapsedOneBlock = Timer - myTimer
    TimeElapsedTotal = TimeElapsedTotal + TimeElapsedOneBlock
    Debug.Print TimeElapsedOneBlock, "- затрачено времени на Блок 2"
    
    'блок 3
    myTimer = Timer 'засекаем время
    'что-то делаем
    For i = 1 To 100000000
        i = i * 1
    Next i
    'вычисляем затраченное время
    TimeElapsedOneBlock = Timer - myTimer
    TimeElapsedTotal = TimeElapsedTotal + TimeElapsedOneBlock
    Debug.Print TimeElapsedOneBlock, "- затрачено времени на Блок 3"
    
    Debug.Print TimeElapsedTotal, "- ВСЕГО затрачено времени"
    
    'теперь нажмите Ctrl+G и изучайте данные
End Sub


Код
 0,7392578    - затрачено времени на Блок 1
 1,476563     - затрачено времени на Блок 2
 0,7285156    - затрачено времени на Блок 3
 2,944336     - ВСЕГО затрачено времени

Вот тут видно, что на Блок 2 затрачено больше времени, чем на Блок 1  и Блок 3
Изменено: New - 04.10.2021 03:34:00
 
Да было. Если вы параллельно работаете с другими приложениями при выполнении макроса.
Но самая главная причина, которую я нашёл. Это Защитник виндовс и антивирусник. при первом запуске макроса он начинает его проверять. Потом уже так как книга осталась открытой он его не проверяет. Я добавляю эксель в исключения защитника и антивирусника и других программ и вообще огонь. Макросы выполняются значительно быстрее.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
GuestHere написал:
Написал макрос VBA Excel с массивами и словарямиПостроено так (если отбросить лишнее): сначала загружаются словари, потом массивам присваиваются значения соответствующих колонок таблицы, потом начинаются главные циклы макроса, в которых используются загруженные словари и массивы. (т.е. словари и массивы загружаются один раз, в начале).
В слепую что-то определять  - это круто, но  .... Покажите ваш макрос. Допускаю что могли брать куски кода из других примеров и там есть оптимизацмя для разовой первичной загрузки данных. Хотя 39 и 1 разница слишком велика, что для кода что для антивируса.

Цитата
GuestHere написал:
10 тыс х 1 сек. Разница!
2  - 3 часа работы макроса - конечно есть подобные задачи, но .....
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх