-
Избегайте
длинных имен элементов управления и
форм
Помните, что имена элементов управления
и форм хранятся в исполняемом файле,
зато на именах переменных можете не
экономить: они не хранятся в EXE-файлах.
-
Нумерация
версий программ, созданных на VB, может
быть простой, если вы воспользуетесь
функцией Version Numbering при создании EXE-модуля.
Для этого щелкните кнопку Options
диалогового окна Make Project, а затем
установите флажок Auto Increment во вкладке Make
диалогового окна Project Properties.
Номер
версии программы состоит из трех
элементов: Major, Minor и Revision. Функция Auto
Increment, если она выделена, будет
автоматически увеличивать номер Revision на
единицу при каждом запуске команды Make
Project для конкретного проекта.
Обычно
информация о версиях программы
используется в форме About. Для этого
просто добавьте метку с именем lblVersion и
введите следующий код для вашей формы:
lblVersion.Caption = "Версия: " & App.Major & _
"." & App.Minor & "." & App.Revision
Если
для вашей программы номер Major равен 2,
номер Minor — 1 и номер Revision — 12, то метка
выведет на экран: "Версия: 2.1.12"
-
Не
выгружайте часто используемую форму -
просто спрячьте ее, в следующий раз она
появится мгновенно.
Однако при этом событие Form_Load не
произойдет, и Вы будете должны
проинициализировать все поля вручную!
-
Всегда
сбрасывайте форму в Nothing после ее
выгрузки. Тем самым вы освободите всю
память, занимаемую ее переменными и
массивами и обеспечит ее правильную
инициализацию при последующем ее вызове:
Unload Form1
Set Form1 = Nothing
-
Перед
окончательной компиляцией приложения,
удалите или закомментируйте все
неработающие куски кода, модули которые
Ваша программа не вызывает, и которые
часто остаются при написании новых
версий.
-
Используйте
константы везде,где только можно.Если вы
укажете в программе 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) .
-
Обязательно
добавьте в раздел General каждого модуля
директиву Option Explicit. Это снизит риск
неумышленного использования
необъявленных Variant-переменных.
-
Конкатенация
- это медленная операция. Если вы хотите
заменить 1-2 символа в строке -
используйте ф-цию Mid$:
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
процентов быстрее чем явное сравнение с
пустой строкой
-
Часто
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 для
ускорения работы всех графических
методов.
-
Вставляете
ли Вы изображения в форму при
конструировании, или во время ее
выполнения из файла ресурсов, - Вы должны
использовать сжатые форматы
изображения (compressed bitmaps). Помните, что
элемент PictureBox может читать RLE и WMF
форматы, а в версии VB5 также PCX и JPEG. Если
Вы ранее использовали компоненты
третьих фирм для работы с этими
форматами, Вы можете избавиться от этого
изменив и перекомпилировав свой код под
VB5 и сохранив старый файл ресурсов.
-
Используйте
метод Move для изменения размеров или
перемещения форм. Это быстрее, чем по
отдельности изменять свойства Left, Top, Width,
и Height.
-
Элемент
PictureBox очень прожорлив, и если Вам не
требуются такие его свойства, как
поддержка DDE, графические методы, и
способность содержать другие объекты –
Вы можете повысить производительность
своего приложения, заменив его на
обычный элемент Image.
-
Не
пользуйтесь пустыми циклами For … Next для
реализации задержки в вашей программе.
Используйте API функцию Sleep, которая не
загружает процессор и позволяет другим
приложениям в многозадачной среде
работать:
Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)
' пауза в 5 сек.
Sleep 5000
-
Ускорить
доступ к свойствам, или методам объектов
можно уменьшением числа “точек” в
выражении. Например, когда Вам надо
сослаться на несколько “вложенных”
объектов или элементов управления
повторно:
Form1.Text1.Text = ""
Form1.Text1.ForeColor = 0
Вы
можете использовать временный объект
или директиву With:
With Form1.Text
.Text = ""
.ForeColor = 0
End With
-
Свойства,
определенные как переменные типа Public,
всегда быстрее, чем пара свойств Let/Get
даже на разных версиях VB. Это составляет
около 7 раз для VB4, и только 4 раза на VB5.
-
Замените
числа в небольших целых степенях их
простым произведением. Например:
'
Это в 7 раз быстрее, чем N^3
Вы
можете также разбить большую степень с
помощью временных переменных, в которых
будете хранить промежуточные
результаты:
' это в 3 раза быстрее, чем N^7
-
Пользуйтесь
командами LSet или RSet для присвоения новых
значений строкам без изменения их длины.
При этом можно дополнять строку спереди
или сзади пробелами, при необходимости.
-
Как
только Вы создаете новую строку, или
изменяете длину существующей, VB
запускает свой строковый менеджер и тем
самым тормозит Ваш код. Вы можете
значительно повысить скорость Вашего
кода путем уменьшения количества
временных строк в вашей программе.
Например, эти две строчки кода дают в
результате одно и то же:
length% = Len(a$) + Len(b$)
Но
вторая строка раза в 3 быстрее потому,
что с одной стороны операция “&”
очень медленная, и с другой стороны
строковый менеджер не выделяет память
под временную строку a$ & b$.
-
Вы
можете значительно понизить активность
строкового менеджера, если не будете
изменять длину строки после того, как Вы
ее создали. Например, следующий код
меняет содержимое строк:
Mid$(result$, slen% + 1 – i, 1) = Mid$(source$, i, 1)
и он
значительно быстрее, чем достижение
результата путем добавления каждого
символа друг за другом:
For i = 1 To Len(source$)
result$ = Mid$(source$, i, 1) _
-
Вы
можете добавить метод Show и после него
DoEvent в событии Form_Load чтобы показать форму
еще до того, как завершится процесс
инициализации:
' здесь откройте базу данных
-
Вы
можете заменить многие элементы
управления, используя графические
методы. Например, элементы Line и Shape на
графические методы Line и Circle, или 3-D Frame
можно нарисовать, используя комбинацию
линий. Window’s API рисует замкнутые
полигоны и заполняет их цветом по Вашему
выбору гораздо быстрее, чем графические
методы VB.
-
Некоторая
техника оптимизации форм подходит и для
picture boxes. Например, Вы можете ускорить
графические команды, установив свойства
AutoRedraw и ClipControls в False. Помните, если Вы
установили AutoRedraw в False, Вам придется
следить за тем, чтобы случайно не
обратиться к свойствам объекта Image. Это
приведет к созданию VB временного образа,
как если бы AutoRedraw было установлено в True.
-
Команда
SavePicture сохраняет растровый файл в
зависимости от установленного Вами
режима видеоадаптера. Если вы
сохраняете монохромный bitmap разрешением
640 на 480 в то время как Ваша видеокарта
работает в 256-цветном режиме, файл на
диске займет 300К вместо 37.5, которые нужны
для картинки чтобы корректно ее
сохранить (восемь пикселов на байт).
-
Используйте
заставку для обратной связи с
пользователем, при загрузке главной
формы приложения. Хотя на самом деле это
и не повысит скорость загрузки, зато
пользователю будет казаться, что
программа работает быстрее.
-
Когда
Вы внедряете рисунок в форму, или файл
ресурсов, всегда используйте минимально
возможное количество цветов. 16-цветный
рисунок занимает половину памяти
требуемой для 256-цветового рисунка, а
монохромный одну четверть памяти,
требуемой для 16-цветного рисунка.
-
VB5
позволяет Вам указывать явно типы
данных. Если очень нужно, Вы можете
установить значение по умолчанию прямо
в списке параметров.
Под VB5
Вы можете написать более сжатый и
эффективный код:
Sub MyProc(Optional X As Integer = 10)
-
Если
цикл содержит вычисляемое выражение,
которое не изменяется во время
выполнения цикла, вычисляйте его до
цикла, а в цикле используйте временную
переменную: