Советы по оптимизации кода
Избегайте длинных имен элементов управления и форм
Помните, что имена элементов управления и форм хранятся в исполняемом файле, зато на именах переменных можете не экономить: они не хранятся в EXE-файлах
Не выгружайте часто используемую форму - просто спрячьте ее, в следующий раз она появится мгновенно
Однако при этом событие Form_Load не произойдет, и Вы будете должны проинициализировать все поля вручную!
Всегда сбрасывайте форму в Nothing после ее выгрузки.
Тем самым вы освободите всю память, занимаемую ее переменными и массивами и обеспечит ее правильную инициализацию при последующем ее вызове:
Unload Form1
Set Form1 = Nothing
Не останавливайте ваши приложения грубым образом. Многие программисты пользуются кнопкой Stop в среде разработки Visual Basic (IDE) или используют оператор End в коде для остановки программы. Старайтесь избегать подобных вещей. Дело в том, что завершая программу подобным образом, вы не даете вашей программе очистить память компьютера от различного мусора: ссылки на объекты, записи базы данных и т.п. Особенно, это проявляется при работе с функциями API. Если вы к тому же используете функции для сабклассинга, то подобное поведение просто приводит к краху VB IDE.
Поэтому, вы должны выгружать программу по возможности нормальным образом, закрывая форму через кнопку закрытия или через описанный выше код.
Перед окончательной компиляцией приложения, удалите или закомментируйте все неработающие куски кода, модули которые Ваша программа не вызывает, и которые часто остаются при написании новых версий
Используйте константы везде, где только можно. Если вы укажете в программе 5 000 пар пустых кавычек, то создадите 5 000 пустых строк, каждая из которых займет минимум по 5 байтов, а введя константу sEmpty, вы получите единственную строку
Всегда используйте Integer или Long тип переменных,
вместо Single, Double или Currency, где это возможно. Математические операции с
типами Integer и Long делаются за 1 такт процессора, и следовательно гораздо быстрее
Используйте Single вместо Double, если Вам не нужна
точность Double. Переменная типа Single требует меньше памяти и работает быстрее в математических выражениях
Не пользуйтесь типом Variant, если не нуждаетесь в его
особенных свойствах, таких например, как хранение величин типа Empty и Null.
Каждая переменная Variant занимает 16 байт (против 8, занимаемых Double или
Currency)
Конкатенация - это медленная операция. Если вы хотите
заменить 1-2 символа в строке - используйте ф-цию Mid$:
Mid$(a$, 1, 1) =
"A"
Hе используйте такой код
:
a$ = "A" & Mid$(a$,
2)
Cтроковые переменные фиксированной длины часто
медленнее чем стандартные строковые переменные. Фактически, все строковые
функции работают только со строками переменной длины. Следовательно, все строки
фиксированной длины сначала должны быть преобразованы, прежде, чем обработаются.
Это может замедлить ваш код раза в три или четыре
Держитесь подальше от функций без значка "$" таких
как Left и Trim, т.к. они возвращают значение типа Variant. Обычные функции
Left$ и Trim$ возвращают результат немедленно, без его неявного преобразования в
Variant
Использование ASCII кода при сравнении намного
быстрее использования самого символа. Например:
' Сравнение с пробелом.
If Left$(a$, 1) = " " Then ...
' Сравнение через код (на 40%
быстрее)
If Asc(a$) = 32 Then
...
Такой подход обычно используют в блоках Select Case
Используйте встроенные строковые константы вместо
Chr$ (). Hапример, используйте vbTab вместо Chr$ (9), и vbCrLf вместо Chr$ (13)
и Chr$ (10)
Использование функции Len, чтобы проверить, содержит
ли строка символы- приблизительно на 25 процентов быстрее чем явное сравнение с
пустой строкой
If Len(a$) = 0 Then ...
это быстрее,чем
If sName < > " " Then ...
Часто VB программисты сравнивают строки , используя
LCASE$ или UCASE$, чтобы преобразовать обе строки перед сравнением.
Однако, быстрее прибегнуть к редко используемой функции StrComp:
If StrComp(a$, b$, vbTextCompare) = 0 Then
'строки равны
End If
30. Точно также, когда Вам нужно найти подстроку без
учета регистра, используйте четвертый параметр функции InStr:
If InStr(1, a$, "vb", vbTextCompare) Then
...
Заметим, что при такой форме синтаксиса, Вы не можетие опустить
первый аргумент. Если Ваша программа применяет поиск и сравнение исключительно
без учета регистра, можете добавить директиву "Option Compare Text" в первую
строку каждого модуля.
Функция InStr позволяет Вам быстро проверить
содержится ли одиночный символ в списке символов. Hапример, так Вы можете
определять, содержит ли a$ гласную:
isVowel = InStr("aeiou", a$)
Когда Вам надо обработать каждый символ в строке,
поместите строку в массив байтов и оперируйте с элементами массива. Помните что
каждый символ Unicode описывается двумя байтами. Такой подход обычно быстрее,
т.к. он не использует обычную в таких случаях функцию Mid$ и не нужно создавать
временные строки. Например, самый быстрый способ подсчитать кол-во пробелов в
строке:
Dim b() as Byte, count As Integer
b() =
source$
For i = 1 to UBound(b) Step LenB("A")
If b(i) = 32 Then count =
count + 1
Next
Отметим нестандартное использование функции LenB(). Она
возвращает 2 под VB4/32 и VB5, и 1 под VB4/16, поэтому Вы можете использовать
этот фрагмент кода без директивы #If условной компиляции. Будьте внимательны:
эта техника может не прокатить, если Вы локализуете свой код для стран,
использующих полный набор символов Unicode.
Вы ускорите загрузку форм и снизите потребляемые
ресурсы, если будете применять более простые элементы управления. Например, не
пользуйтесь элементом с вводом по маске (masked-edit controls) если Вам
достаточно простого text box’а. В некоторых случаях можно использовать label с
рамкой вместо read-only text box, набор Image, вместо Toolbar common control,
маленький scrollbar вместо spin button, и т.д.
Установка AutoRedraw в False обычно удваивает
скорость большинства графических методов, а также снижает требуемое кол-во
памяти для ее отображения
Если Вам необходимо установить AutoRedraw в True,
попробуйте использовать формы с фиксированной рамкой (fixed-border forms).
Фактически, когда у формы изменяемые границы, VB занимает непрерывный кусок
памяти, величиной с целый экран, даже если окно никогда не максимизируется.
Наоборот, когда у формы фиксированные границы, VB занимает память только под
установленный размер формы
Если Ваша форма не содержит графики, или создает
графические объекты в процессе работы и они не перекрывают существующие элементы
управления, установите свойство ClipControls в False для ускорения работы всех
графических методов
Используйте метод Move для изменения размеров или
перемещения форм. Это быстрее, чем по отдельности изменять свойства Left, Top,
Width, и Height
Элемент PictureBox очень прожорлив, и если Вам не
требуются такие его свойства, как поддержка DDE, графические методы, и
способность содержать другие объекты – Вы можете повысить производительность
своего приложения, заменив его на обычный элемент Image
Не пользуйтесь пустыми циклами For … Next для
реализации задержки в вашей программе. Используйте API функцию Sleep, которая не
загружает процессор и позволяет другим приложениям в многозадачной среде
работать:
Declare Sub Sleep Lib "kernel32" (ByVal
milliseconds As Long)
' пауза в 5
сек.
Sleep 5000
Свойства, определенные как переменные типа Public,
всегда быстрее, чем пара свойств Let/Get даже на разных версиях VB. Это
составляет около 7 раз для VB4, и только 4 раза на VB5
Замените числа в небольших целых степенях их простым произведением.
Например:
' Это в 7 раз быстрее, чем N^3
x = N * N * N
Вы можете также разбить большую степень с помощью
временных переменных, в которых будете хранить промежуточные результаты:
' это в 3 раза быстрее, чем N^7
tmp = N * N * N
x = tmp * tmp * N
Пользуйтесь командами LSet или RSet
для присвоения новых значений строкам без изменения их длины. При этом можно дополнять строку спереди или сзади пробелами, при необходимости
Как только Вы создаете новую строку или изменяете длину существующей, VB запускает свой строковый менеджер и тем самым тормозит Ваш код. Вы можете значительно повысить скорость Вашего кода путем уменьшения количества временных строк в вашей программе. Например, эти две строчки кода дают в результате одно и то же:
length% = Len(a$ & b$)
length% = Len(a$) + Len(b$)
Но вторая строка раза в 3 быстрее потому, что с одной стороны операция «&» очень медленная, и с другой стороны строковый менеджер не выделяет память под временную строку a$ &
b$.
Вы можете значительно понизить активность строкового менеджера, если не будете изменять длину строки после того, как Вы ее создали. Например, следующий код меняет содержимое строк:
slen% = Len(source$)
result$ = Space$(slen%)
For i = 1 To slen%
Mid$(result$, slen% + 1 – i, 1) _
= Mid$(source$, i, 1)
Next
и он значительно быстрее, чем достижение результата
путем добавления каждого символа друг за другом:
result$ = ""
For i = 1 To Len(source$)
result$ = Mid$(source$, i, 1) _
& result$
Next
Вы можете добавить метод Show и после
него DoEvent в событии Form_Load чтобы показать форму еще до того, как завершится процесс инициализации:
Private Sub Form_Load()
Me.Show
DoEvents
' здесь откройте базу данных
End Sub
Некоторая техника оптимизации форм подходит и для picture boxes. Например, Вы можете ускорить графические команды, установив свойства AutoRedraw и ClipControls в False. Помните, если Вы установили
AutoRedraw в False, Вам придется следить за тем, чтобы случайно не обратиться к свойствам объекта Image. Это приведет к созданию VB временного образа, как если бы AutoRedraw было установлено в True
Когда Вы внедряете рисунок в форму,
или файл ресурсов, всегда используйте минимально возможное количество цветов.
16-цветный рисунок занимает половину памяти требуемой для 256-цветового рисунка,
а монохромный одну четверть памяти, требуемой для 16-цветного рисунка
VB5 позволяет Вам указывать явно типы данных. Если очень нужно, Вы можете установить значение по умолчанию прямо в списке параметров.
Под VB5 Вы можете написать более сжатый и эффективный код:
Sub MyProc(Optional X As Integer = 10)
Если цикл содержит вычисляемое выражение,
которое не изменяется во время выполнения цикла, вычисляйте его до цикла, а
в цикле используйте временную переменную:
For x = 1 to 1000
' вычисляйте x^2 вне цикла
x2 = x * x
For y = 1 To 1000
squares(x, y) = x2 * y * y
Next
Next
На языке компилятора, этот подход называется loop
invariant. Вы можете еще больше усовершенствовать этот
код, приготовив заранее массив, содержащий квадраты всех величин от 1 до 1000.