Среди множества методов оптимизации размера программного кода большинство включает удаление ненужных элементов из кода. Visual Basic автоматически удаляет определенные элементы при компиляции приложения. Нет ограничений на длину или количество имен идентификаторов, комментариев и пустых строк. Когда приложение запускается как файл .EXE, эти элементы не влияют на размер памяти, занимаемой приложением. Другие элементы, такие как переменные, формы и процедуры, занимают некоторое место в памяти. Лучше упростить их, чтобы сделать их более эффективными. Ниже представлены 6 методов, которые можно использовать для уменьшения памяти, необходимой приложению, и уменьшения размера кода. Надеюсь, это будет полезно новичкам.
1. Уменьшите количество загрузочных форм и элементов управления и используйте метки вместо текстовых полей.
Каждая загруженная форма, видимая или нет, занимает определенный объем памяти (объем варьируется в зависимости от типа и количества элементов управления на форме, размера растрового изображения на форме и т. д.). Загружайте форму только тогда, когда вам нужно ее отобразить, и выгружайте форму, когда она больше не нужна (вместо того, чтобы скрывать форму). Помните, что любая ссылка на свойства, методы или элементы управления формы или на переменную формы, объявленную с помощью New, приведет к загрузке формы Visual Basic.
При использовании метода Unload для выгрузки формы можно освободить только часть занимаемого формой пространства. Чтобы освободить все пространство, используйте ключевое слово Nothing, чтобы сделать ссылку на форму недействительной:
При разработке приложения формы должны использовать как можно меньше элементов управления. Фактический предел зависит от типа элемента управления и системы, но на практике форма с большим количеством элементов управления будет работать медленно. Связанный с этим метод заключается в том, чтобы при проектировании по возможности использовать массивы элементов управления, а не размещать в форме большое количество элементов управления одного типа. Массив элементов управления — это группа элементов управления с общим именем и типом. Их ход событий также одинаков. Во время разработки добавление элементов управления с использованием массива элементов управления потребляет меньше ресурсов, чем добавление нескольких элементов управления одного типа непосредственно в форму. Массивы элементов управления также полезны, если вы хотите, чтобы несколько элементов управления использовали общий код. Элемент управления меткой Label занимает меньше ресурсов Windows, чем текстовое поле Textbox, поэтому, когда это возможно, вместо текстового поля следует использовать метку. Например, если скрытый элемент управления в форме должен содержать текст, использование меток более эффективно.
2. Используйте дисковые файлы или ресурсы и организационные модули.
Данные, помещенные непосредственно в приложение во время разработки (например, литеральные строки и значения в свойствах или коде), увеличивают объем памяти, занимаемой приложением во время выполнения. Загрузка данных из дисковых файлов или ресурсов во время выполнения снижает использование памяти. Это особенно ценно для больших растровых изображений и строк. Файлы ресурсов фактически состоят из ряда независимых строк, растровых изображений или других элементов, каждый из которых имеет уникальный идентификатор. Файлы ресурсов можно создавать с помощью текстового редактора и компилятора ресурсов, аналогичного тем, которые предусмотрены в Microsoft Visual C. Скомпилированные файлы ресурсов имеют расширение .res.
Visual Basic загружает модули только при необходимости, то есть, когда код вызывает процедуру в модуле, модуль загружается в память. Если процедура в определенном модуле никогда не вызывается, Visual Basic никогда не загружает модуль. Поэтому постарайтесь поместить связанные процедуры в один и тот же модуль и позволить Visual Basic загружать модуль только при необходимости.
3. Рассмотрите возможность замены типа данных Variant.
Тип данных Variant чрезвычайно гибок в использовании, но занимает больше памяти, чем другие типы данных. Если вы хотите сжать лишнее пространство в своем приложении, вам следует рассмотреть возможность замены переменных Variant другими типами данных, особенно заменой массивов переменных Variant.
Каждый вариант занимает 16 байт, Integer — 2 байта, а Double — 8 байт. Строковые переменные переменной длины занимают 4 байта плюс 1 байт на каждый символ строки. Однако каждый вариант, содержащий строку, занимает 16 байтов плюс 1 байт на каждый символ строки. Из-за своего большого размера переменные Variant особенно раздражают при использовании в качестве локальных переменных или аргументов процедур, поскольку они слишком быстро занимают пространство стека. Но в некоторых случаях использование других типов данных вместо Variant снижает гибкость, и приходится добавлять больше кода, чтобы компенсировать утраченную гибкость. В результате реального уменьшения размера не происходит.
4. Используйте динамические массивы и освобождайте память при удалении.
Используйте динамические массивы вместо фиксированных. Когда данные динамического массива больше не нужны, используйте Erase или ReDimPReserve, чтобы удалить ненужные данные и освободить память, используемую массивом. Например, используйте следующий код, чтобы освободить пространство, используемое динамическим массивом:
Здесь Erase полностью удаляет массив, а ReDimPreserve только сокращает массив, не теряя его содержимого:
Удаление массива фиксированного размера не освобождает место, занимаемое массивом, — оно просто удаляет значение из каждого элемента массива. Если элементы являются строками или вариантами, содержащими строки или массивы, то при удалении массива освобождается память, занимаемая этими строками или вариантами, а не память, занимаемая самим массивом.
5. Освободите пространство, используемое строковыми или объектными переменными.
Когда процесс завершается, пространство, используемое (нестатическими) локальными строковыми переменными и переменными массива, может быть автоматически освобождено. Однако глобальные строковые переменные и переменные массива на уровне модуля сохраняются до конца всей программы. Если вы хотите, чтобы ваше приложение было как можно меньше, вы должны максимально освободить пространство, используемое этими переменными. Присвоение строки нулевой длины строковой переменной освобождает ее пространство:
Аналогично, установка переменной объекта в значение Nothing освобождает часть (но не все) пространства, используемого объектом. Например, чтобы удалить переменную объекта формы:
Даже если вы не используете явные переменные формы, вам следует проявлять осторожность и выгружать формы, которые больше не используются, а не просто скрывать их.
6. Устраните мертвый код и бесполезные переменные.
По мере разработки и изменения приложения у вас может остаться мертвый код — целый процесс в вашем коде, который нигде не вызывается. Также могут быть объявлены некоторые неиспользуемые переменные. Хотя Visual Basic действительно может удалять ненужные константы при создании файлов .exe, он не может удалять ненужные переменные и мертвый код. Будьте осторожны при просмотре своего кода, чтобы найти и удалить ненужные переменные и мертвый код. Например, инструкция Debug.Print игнорируется при запуске .exe, но она часто появляется в файлах .exe.
При создании файла .exe операторы Debug.Print, содержащие строки и переменные в качестве параметров, не компилируются. Но оператор Debug.Print, содержащий функцию в качестве параметра, сам компилятор игнорирует, и функция компилируется. Таким образом, пока приложение работает, функция вызывается, но возвращаемое значение игнорируется. Поскольку в файле .exe, когда функция появляется в качестве параметра Debug.Print, она занимает место и время цикла процессора, поэтому лучше удалить эти инструкции перед созданием exe-файла.
Используйте команду «Найти» в меню «Правка» для поиска ссылок на определенную переменную. Или, когда каждый модуль содержит оператор OptionExplicit, вы можете быстро узнать, используется ли переменная, удалив или прокомментировав объявление переменной и запустив приложение. Если эта переменная используется, Visual Basic выдаст ошибку. Если ошибок не возникает, переменная не используется. ->