ADN Open CIS
Сообщество программистов Autodesk в СНГ

05/09/2013

AutoCAD, VBA и производительность

Описываются причины, по которым Вы можете отказаться от идеи использования VBA в AutoCAD x64 версий 2008-2013. То есть совсем отказаться.

Вызвав текстовое окно (клавиша F2), можно иногда увидеть фразу наподобие
Initializing VBA System...

Всего лишь после инициализации VBA-системы в AutoCAD некоторые команды могут выполняться на порядок дольше. Конечно, значение "в 10 раз" может плавать в большую или меньшую сторону (зависит от очень многих факторов). При этом, что самое интересное, даже необязательно загружать какой бы то ни было DVB - AutoCAD и так начнет безбожно тормозить.

Так, к примеру, при неинициализированном VBA вызов команды _.qsave приводит к поиску в реестре и файловых событий в общей сумме 2100 штук (по данным программы ProcMon). Стоит хотя бы раз вызвать vbaide, и это количество моментально вырастает до 950000 (почти в 453 раза больше). Неудивительно, что теперь _.qsave выполняется так долго. Многие файлы и записи реестра сканируются по нескольку раз, и, похоже, это количество зависит от количества путей поддержки, прописанных в профиле AutoCAD.

Изменение системных переменных INDEXCTL, SAVEFIDELITY and PROXYGRAPHICS и им подобных (за подробным описанием добро пожаловать в справку; некоторое количество информации можно найти на этом блоге) не изменит ситуацию ни на йоту, если VBA хотя бы раз вызывался (хотя в других случаях их изменение может привести к некоторому ускорению процесса записи файла).

Почему же это происходит?

После инициализации компонента VBA AutoCAD начинает проверять все обработчики, которые могут быть зарегистрированы в VBA-компоненте (в лиспе их называют реакторами; в .NET - событиями), как собственные, так и связанные с выполнением штатных команд. Само по себе уже это может занять ощутимое время.

Кроме того, Autodesk распространяла 32-разрядный VBA-модуль невзирая на разрядность AutoCAD. И работал этот модуль в режиме "out-of-process", т.е. фактически как внешний СОМ-сервер. И это было вплоть до AutoCAD 2013, который использовал VBA версии 6.3. Исполнение очень многих инструкций возлагается не на AutoCAD, а на ОС, что делает 64-разрядные версии AutoCAD + VBA ощутимо медленнее, чем 32-разрядные.

Теоретически эта проблема должна исчезнуть в AutoCAD 2014, в котором уже используется VBA версии 7.1. Эта версия примечательна тем, что является полностью переработанной под 64-разрядные версии приложения.

Что делать?

Понятно, что напрашивающееся решение "перейти на 32-разрядные AutoCAD" вряд ли найдет понимание у пользователей. Остается либо переходить на AutoCAD 2014, либо переписывать приложения на .NET

Первое чревато тем, что некоторые элементы диалогов могут запросто перестать работать - контролы, пришедшие из 32-разрядного VB6, далеко не всегда корректно преобразовываются в соответствующие контролы VBA 7.1)
Второй путь потребует некоторых вложений в знания и умения "перевода" исходного кода на новые языки. Но Autodesk сделала достаточно много шагов для того, чтобы облегчить подобный переход: в Autodesk .NET Developer Guide есть примеры кодов на VB.NET, C# и VBA, решающие одну и ту же задачу. Поэтому, даже если Вы не знаете .NET, перейти будет не очень сложно

На основе материалов http://blog.jtbworld.com/2013/09/autocad-performance-issues-and-vba.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+JtbWorld+%28JTB+World%29

Обсуждение: http://adn-cis.org/forum/index.php?topic=200

Опубликовано 05.09.2013
Отредактировано 05.09.2013 в 22:29:39