Совет дня

Общие советы
Советы по оптимизации кода
Советы по IDE
    Советы по оптимизации кода
  1. Избегайте длинных имен элементов управления и форм
    Помните, что имена элементов управления и форм хранятся в исполняемом файле, зато на именах переменных можете не экономить: они не хранятся в EXE-файлах
  2. Не выгружайте часто используемую форму - просто спрячьте ее, в следующий раз она появится мгновенно
    Однако при этом событие Form_Load не произойдет, и Вы будете должны проинициализировать все поля вручную!
  3. Всегда сбрасывайте форму в Nothing после ее выгрузки. Тем самым вы освободите всю память, занимаемую ее переменными и массивами и обеспечит ее правильную инициализацию при последующем ее вызове:

    Unload Form1
    Set Form1 = Nothing

    Не останавливайте ваши приложения грубым образом. Многие программисты пользуются кнопкой Stop в среде разработки Visual Basic (IDE) или используют оператор End в коде для остановки программы. Старайтесь избегать подобных вещей. Дело в том, что завершая программу подобным образом, вы не даете вашей программе очистить память компьютера от различного мусора: ссылки на объекты, записи базы данных и т.п. Особенно, это проявляется при работе с функциями API. Если вы к тому же используете функции для сабклассинга, то подобное поведение просто приводит к краху VB IDE. Поэтому, вы должны выгружать программу по возможности нормальным образом, закрывая форму через кнопку закрытия или через описанный выше код.

  4. Перед окончательной компиляцией приложения, удалите или закомментируйте все неработающие куски кода, модули которые Ваша программа не вызывает, и которые часто остаются при написании новых версий
  5. Используйте константы везде, где только можно. Если вы укажете в программе 5 000 пар пустых кавычек, то создадите 5 000 пустых строк, каждая из которых займет минимум по 5 байтов, а введя константу sEmpty, вы получите единственную строку
  6. Всегда используйте Integer или Long тип переменных, вместо Single, Double или Currency, где это возможно. Математические операции с типами Integer и Long делаются за 1 такт процессора, и следовательно гораздо быстрее
  7. Используйте Single вместо Double, если Вам не нужна точность Double. Переменная типа Single требует меньше памяти и работает быстрее в математических выражениях
  8. Не пользуйтесь типом Variant, если не нуждаетесь в его особенных свойствах, таких например, как хранение величин типа Empty и Null. Каждая переменная Variant занимает 16 байт (против 8, занимаемых Double или Currency)
  9. Конкатенация - это медленная операция. Если вы хотите заменить 1-2 символа в строке - используйте ф-цию Mid$:

    Mid$(a$, 1, 1) = "A"


    Hе используйте такой код :

    a$ = "A" & Mid$(a$, 2)

  10. Cтроковые переменные фиксированной длины часто медленнее чем стандартные строковые переменные. Фактически, все строковые функции работают только со строками переменной длины. Следовательно, все строки фиксированной длины сначала должны быть преобразованы, прежде, чем обработаются. Это может замедлить ваш код раза в три или четыре
  11. Держитесь подальше от функций без значка "$" таких как Left и Trim, т.к. они возвращают значение типа Variant. Обычные функции Left$ и Trim$ возвращают результат немедленно, без его неявного преобразования в Variant
  12. Использование ASCII кода при сравнении намного быстрее использования самого символа. Например:

    ' Сравнение с пробелом.
    If Left$(a$, 1) = " " Then ...

    ' Сравнение через код (на 40% быстрее)
    If Asc(a$) = 32 Then ...

    Такой подход обычно используют в блоках Select Case

  13. Используйте встроенные строковые константы вместо Chr$ (). Hапример, используйте vbTab вместо Chr$ (9), и vbCrLf вместо Chr$ (13) и Chr$ (10)
  14. Использование функции Len, чтобы проверить, содержит ли строка символы- приблизительно на 25 процентов быстрее чем явное сравнение с пустой строкой

    If Len(a$) = 0 Then ...
    это быстрее,чем
    If sName < > " " Then ...

  15. Часто 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" в первую строку каждого модуля.

  16. Функция InStr позволяет Вам быстро проверить содержится ли одиночный символ в списке символов. Hапример, так Вы можете определять, содержит ли a$ гласную:

    isVowel = InStr("aeiou", a$)

  17. Когда Вам надо обработать каждый символ в строке, поместите строку в массив байтов и оперируйте с элементами массива. Помните что каждый символ 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.

  18. Вы ускорите загрузку форм и снизите потребляемые ресурсы, если будете применять более простые элементы управления. Например, не пользуйтесь элементом с вводом по маске (masked-edit controls) если Вам достаточно простого text box’а. В некоторых случаях можно использовать label с рамкой вместо read-only text box, набор Image, вместо Toolbar common control, маленький scrollbar вместо spin button, и т.д.
  19. Установка AutoRedraw в False обычно удваивает скорость большинства графических методов, а также снижает требуемое кол-во памяти для ее отображения
  20. Если Вам необходимо установить AutoRedraw в True, попробуйте использовать формы с фиксированной рамкой (fixed-border forms). Фактически, когда у формы изменяемые границы, VB занимает непрерывный кусок памяти, величиной с целый экран, даже если окно никогда не максимизируется. Наоборот, когда у формы фиксированные границы, VB занимает память только под установленный размер формы
  21. Если Ваша форма не содержит графики, или создает графические объекты в процессе работы и они не перекрывают существующие элементы управления, установите свойство ClipControls в False для ускорения работы всех графических методов
  22. Используйте метод Move для изменения размеров или перемещения форм. Это быстрее, чем по отдельности изменять свойства Left, Top, Width, и Height
  23. Элемент PictureBox очень прожорлив, и если Вам не требуются такие его свойства, как поддержка DDE, графические методы, и способность содержать другие объекты – Вы можете повысить производительность своего приложения, заменив его на обычный элемент Image
  24. Не пользуйтесь пустыми циклами For … Next для реализации задержки в вашей программе. Используйте API функцию Sleep, которая не загружает процессор и позволяет другим приложениям в многозадачной среде работать:

    Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)
    ' пауза в 5 сек.
    Sleep 5000

  25. Свойства, определенные как переменные типа Public, всегда быстрее, чем пара свойств Let/Get даже на разных версиях VB. Это составляет около 7 раз для VB4, и только 4 раза на VB5
  26. Замените числа в небольших целых степенях их простым произведением. Например:

    ' Это в 7 раз быстрее, чем N^3

    x = N * N * N

    Вы можете также разбить большую степень с помощью временных переменных, в которых будете хранить промежуточные результаты:

    ' это в 3 раза быстрее, чем N^7

    tmp = N * N * N

    x = tmp * tmp * N

  27. Пользуйтесь командами LSet или RSet для присвоения новых значений строкам без изменения их длины. При этом можно дополнять строку спереди или сзади пробелами, при необходимости
  28. Как только Вы создаете новую строку или изменяете длину существующей, VB запускает свой строковый менеджер и тем самым тормозит Ваш код. Вы можете значительно повысить скорость Вашего кода путем уменьшения количества временных строк в вашей программе. Например, эти две строчки кода дают в результате одно и то же:

    length% = Len(a$ & b$)

    length% = Len(a$) + Len(b$)

    Но вторая строка раза в 3 быстрее потому, что с одной стороны операция «&» очень медленная, и с другой стороны строковый менеджер не выделяет память под временную строку a$ & b$.

  29. Вы можете значительно понизить активность строкового менеджера, если не будете изменять длину строки после того, как Вы ее создали. Например, следующий код меняет содержимое строк:

    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

  30. Вы можете добавить метод Show и после него DoEvent в событии Form_Load чтобы показать форму еще до того, как завершится процесс инициализации:

    Private Sub Form_Load()

    Me.Show

    DoEvents

    ' здесь откройте базу данных

    End Sub

  31. Некоторая техника оптимизации форм подходит и для picture boxes. Например, Вы можете ускорить графические команды, установив свойства AutoRedraw и ClipControls в False. Помните, если Вы установили AutoRedraw в False, Вам придется следить за тем, чтобы случайно не обратиться к свойствам объекта Image. Это приведет к созданию VB временного образа, как если бы AutoRedraw было установлено в True
  32. Когда Вы внедряете рисунок в форму, или файл ресурсов, всегда используйте минимально возможное количество цветов. 16-цветный рисунок занимает половину памяти требуемой для 256-цветового рисунка, а монохромный одну четверть памяти, требуемой для 16-цветного рисунка
  33. VB5 позволяет Вам указывать явно типы данных. Если очень нужно, Вы можете установить значение по умолчанию прямо в списке параметров.

    Под VB5 Вы можете написать более сжатый и эффективный код:

    Sub MyProc(Optional X As Integer = 10)

  34. Если цикл содержит вычисляемое выражение, которое не изменяется во время выполнения цикла, вычисляйте его до цикла, а в цикле используйте временную переменную:

    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.

Реклама