|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.09.2017, 20:42 | #1 |
Регистрация: 01.05.2016
Сообщений: 6
|
Оптимизация кода на скорость исполнения (обращения к массивам данных)
Здравствуйте, уважаемые форумчане,
прошу совета в таком вопросе: Есть база данных в виде многомерного массива: Public MY_ARRAY(N,2,32,32) as Integer. При запуске программы он заполняется с ячеек листа, и потом программа обращается к нему. И вот столкнулся с тем, что при увеличении числа N производительность программы падает. Обращения к этому массиву, конечно, частые, но их частота не зависит от объема массива. При этом обращения идут сразу к конкретным элементам массива, никакого поиска и перебора элементов в нем не производится (т.е. сама процедура обращения к массиву не должна по скорости зависеть от размера массива). Но по факту зависит (причем прилично, съедая до 50% скорости работы программы). Я подозреваю, что дело может быть в переполнении кеша, в который этот массив загружается целиком каждый раз, когда я к нему обращаюсь. Но вобщем хотелось бы услышать мнение специалистов. Заранее спасибо. |
30.09.2017, 20:47 | #2 |
Форумчанин
Регистрация: 22.06.2011
Сообщений: 325
|
1) какой кол-во элементов в массиве?
2) хотелось бы посмотреть на саму реализацию, так тяжело что0то сказать
Заказать макрос можно на сайте http://excel4you.ru/
|
30.09.2017, 22:00 | #3 |
Регистрация: 01.05.2016
Сообщений: 6
|
1) какой кол-во элементов в массиве?
- всего 70 (пробовал уменьшить до 20 - в целом скорость исполнения программы выросла процентов на 30) 2) хотелось бы посмотреть на саму реализацию, так тяжело что-то сказать там в программе очень много строк, поэтому я приведу пару коротких выдержек, которые касаются этого массива: Код:
Последний раз редактировалось Вадим Мошев; 17.10.2018 в 16:29. |
17.10.2018, 15:59 | #4 |
Новичок
Джуниор
Регистрация: 17.10.2018
Сообщений: 2
|
С огромным опозданием, но все же отпишусь: проблема была решена. Оказалось следующее: информацию для заполнения массива я брал с листа Excel. Информацию на лист добавлял блоками одинакового размера, каждый из которых комментировал сразу в паре десятков ячеек (соответственно данным в ячейках). Как только убрал эти комментарии, сразу скорость исполнения вернулась к норме и уже практически не зависела от количества этих блоков и, соответственно, элементов массива. Думаю это может быть актуально для тех, кто любит пользоваться комментированием ячеек и при этом хочет быстрого исполнения макросов.
ПС. Кстати, вот что вышло из той программы: https://youtu.be/lI8BnWj85Us |
24.08.2019, 23:42 | #5 |
Новичок
Джуниор
Регистрация: 17.10.2018
Сообщений: 2
|
Для того, чтобы окончательно закрыть эту тему - файл с программой тут:
https://davevsziggy.wordpress.com/%d...b%d0%be%d0%b3/ По существу вопроса оптимизации на скорость исполнения в VBA (это не все, что нужно знать, а только главное из того, с чем мне пришлось столкнуться при написании программы и ее "разгоне"): 1.Не комментируйте ячейки и не присваивайте им индивидуальные имена без крайней необходимости. 2.Не юзайте пользовательские классы (лучше прописать структуру данных и методы отдельно в VBA - выигрыш колоссальный). 3.Не забывайте отключать отрисовку экрана в местах, где она не нужна. 4.Не работайте с отдельными ячейками для загрузки/выгрузки данных - присваивайте массив переменной и работайте с ней, а еще лучше выгрузить содержимое ячеек в массив с простым типом данных (Int, long, double, string). 5.Чтобы знать форматирование ячеек - не обращайтесь к ним, храните изменения форматов в дублирующем буфере в переменной, обращайтесь к нему) 6.Не форматируйте много ячеек одним и тем же форматом поштучно - накладывайте форматирование сразу на весь массив ячеек. 7.Отключайте в начале программы DisplayAlerts, EnableEvents* 8.Ставьте в начале кода Application.Calculation = xlCalculationManual* 9.Отключайте в начале программы DisplayStatusBar* 10.В коде избегайте переменных типа Variant и Object где это возможно, где возможно используйте Boolean 11.Где возможно - пользуйтесь Select case - end select для множественного выбора вместо if-elseif-end if 12.Где возможно - пользуйтесь With - end with для ускорения доступа к элементам структуры данных. 13.Сложение быстрее умножения (Х+Х быстрее чем Х*2), умножение быстрее деления (Х*0,5 быстрее чем Х/2) и возведения в степень (Х*Х быстрее чем Х^2), целочисленное деление \ быстрее дробного /. 14.Операции над целочисленным типом данных Int все еще немного быстрее, чем над числами с плавающей запятой (из которых Double немного быстрее, чем Single) 15.Не дробите критические места программы на под-под-под-подпроцедурные уровни. Каждый вызов подпрограммы требует времени. 16.Если у Вас огромный массив чисел в малом диапазоне значений (в пределах байта), над которым программа относительно нечасто производит вычисления - лучше и создать массив типа byte. 17. Если у вас много процедур/функций, к которым вы обращаетесь нечасто в ходе исполнения программы, а общее количество кода значительно - лучше вынести эти функции в отдельный модуль. 18. И не делайте файл слишком большим, если это возможно. Больше файл - медленнее счет. 19. Не делайте в файле слишком много листов. 20. Старайтесь обходиться минимумом (или вообще обходиться без) пользовательских форм. __________________________ * - желательно сохранить предыдущее значение и восстановить его в конце Вашей программы. ПС.Спасибо еще раз данному сайту за помощь в паре сложных для меня вопросов, без которых программа не смогла бы состояться. Последний раз редактировалось Shuma74; 24.08.2019 в 23:55. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
расшифрование кода во время исполнения | xqr | Безопасность, Шифрование | 9 | 12.05.2015 19:40 |
добавление данных строками... Listview (оптимизация кода) | Fahman | Общие вопросы Delphi | 7 | 25.07.2014 18:01 |
скорость обращения к строке (массив) | xrob | Общие вопросы Delphi | 2 | 30.08.2013 13:31 |
Скорость исполнения макроса в Excel-2010 намного ниже, чем в Excel-2003 | Павел+ | Microsoft Office Excel | 5 | 29.12.2010 03:28 |
Оптимизация времени исполнения макроса | basil0 | Microsoft Office Excel | 12 | 06.12.2010 10:20 |