> НАЗАД <



 VB Советы


 

    1. Избегайте длинных имен элементов управления и форм
      Помните, что имена элементов управления и форм хранятся в исполняемом файле, зато на именах переменных можете не экономить: они не хранятся в EXE-файлах.

    2.  

    3. Нумерация версий программ, созданных на VB, может быть простой, если вы воспользуетесь функцией Version Numbering при создании EXE-модуля. Для этого щелкните кнопку Options диалогового окна Make Project, а затем установите флажок Auto Increment во вкладке Make диалогового окна Project Properties.

    4. Номер версии программы состоит из трех элементов: 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" 

    5. Не выгружайте часто используемую форму - просто спрячьте ее, в следующий раз она появится мгновенно.
      Однако при этом событие Form_Load не произойдет, и Вы будете должны проинициализировать все поля вручную!

    6.  

    7. Всегда сбрасывайте форму в Nothing после ее выгрузки. Тем самым вы освободите всю память, занимаемую ее переменными и массивами и обеспечит ее правильную инициализацию при последующем ее вызове:

    8. Unload Form1
      Set Form1 = Nothing 
    9. Перед окончательной компиляцией приложения, удалите или закомментируйте все неработающие куски кода, модули которые Ваша программа не вызывает, и которые часто остаются при написании новых версий.

    10.  

    11. Используйте константы везде,где только можно.Если вы укажете в программе 5 000 пар пустых кавычек, то создадите 5 000 пустых строк,каждая из которых займет минимум по 5 байтов,а введя константу sEmpty, вы получите единственную строку.

    12.  

    13. Всегда используйте Integer или Long тип переменных, вместо Single, Double, или Currency где это возможно. Математические операции с типами Integer и Long делаются за 1 такт процессора, и следовательно гораздо быстрее.

    14.  

    15. Используйте Single вместо Double, если Вам не нужна точность Double. Переменная типа Single требует меньше памяти и работает быстрее в математических выражениях.

    16.  

    17. Не пользуйтесь типом Variant, если не нуждаетесь в его особенных свойствах, таких например, как хранение величин типа Empty и Null. Каждая переменная Variant занимает 16 байт (против 8, занимаемых Double или Currency) .

    18.  

    19. Обязательно добавьте в раздел General каждого модуля директиву Option Explicit. Это снизит риск неумышленного использования необъявленных Variant-переменных.

    20.  

    21. Конкатенация - это медленная операция. Если вы хотите заменить 1-2 символа в строке - используйте ф-цию Mid$:

    22. Mid$(a$, 1, 1) = "A" 
      Hе используйте такой код :
      a$ = "A" & Mid$(a$, 2) 
    23. Cтроковые переменные фиксированной длины часто медленнее чем стандартные строковые переменные. Фактически, все строковые функции работают только со строками переменной длины. Следовательно, все строки фиксированной длины сначала должны быть преобразованы, прежде, чем обработаются. Это может замедлить ваш код раза в три или четыре.

    24.  

    25. Держитесь подальше от функций без значка "$" таких как Left и Trim, т.к. они возвращают значение типа Variant. Обычные функции Left$ и Trim$ возвращают результат немедленно, без его неявного преобразования в Variant.

    26.  

    27. Использование ASCII кода при сравнении намного быстрее использования самого символа. Например:

    28. ' Сравнение с пробелом.
      If Left$(a$, 1) = " " Then ...
      ' Сравнение через код (на 40% быстрее)
      If Asc(a$) = 32 Then ...

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

    29. Используйте встроенные строковые константы вместо Chr$ (). Hапример, используйте vbTab вместо Chr$ (9), и vbCrLf вместо Chr$ (13) и Chr$ (10).

    30.  

    31. Использование функции Len, чтобы проверить, содержит ли строка символы- приблизительно на 25 процентов быстрее чем явное сравнение с пустой строкой

    32. If Len(a$) = 0 Then ... 
    33. Часто VB программисты сравнивают строки , используя LCASE$ или UCASE$, чтобы преобразовать обе строки перед сравнением. Однако, быстрее прибегнуть к редко используемой функции StrComp:

    34. If StrComp(a$, b$, vbTextCompare) = 0 Then
      'строки равны
      End If 

      30. Точно также, когда Вам нужно найти подстроку без учета регистра, используйте четвертый параметр функции InStr:

      If InStr(1, a$, "vb", vbTextCompare) Then ...

      Заметим, что при такой форме синтаксиса, Вы не можетие опустить первый аргумент. Если Ваша программа применяет поиск и сравнение исключительно без учета регистра, можете добавить директиву "Option Compare Text" в первую строку каждого модуля.

       

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

    36. isVowel = InStr("aeiou", a$)

       

    37. Когда Вам надо обработать каждый символ в строке, поместите строку в массив байтов и оперируйте с элементами массива. Помните что каждый символ Unicode описывается двумя байтами. Такой подход обычно быстрее, т.к. он не использует обычную в таких случаях функцию Mid$ и не нужно создавать временные строки. Например, самый быстрый способ подсчитать кол-во пробелов в строке:

    38. 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. 

    39. Вы ускорите загрузку форм и снизите потребляемые ресурсы, если будете применять более простые элементы управления. Например, не пользуйтесь элементом с вводом по маске (masked-edit controls) если Вам достаточно простого text box’а. В некоторых случаях можно использовать label с рамкой вместо read-only text box, набор Image, вместо Toolbar common control, маленький scrollbar вместо spin button, и т.д.

    40.  

    41. Установка AutoRedraw в False обычно удваивает скорость большинства графических методов, а также снижает требуемое кол-во памяти для ее отображения.

    42.  

    43. Если Вам необходимо установить AutoRedraw в True, попробуйте использовать формы с фиксированной рамкой (fixed-border forms). Фактически, когда у формы изменяемые границы, VB занимает непрерывный кусок памяти, величиной с целый экран, даже если окно никогда не максимизируется. Наоборот, когда у формы фиксированные границы, VB занимает память только под установленный размер формы.

    44.  

    45. Если Ваша форма не содержит графики, или создает графические объекты в процессе работы и они не перекрывают существующие элементы управления, установите свойство ClipControls в False для ускорения работы всех графических методов.

    46.  

    47. Вставляете ли Вы изображения в форму при конструировании, или во время ее выполнения из файла ресурсов, - Вы должны использовать сжатые форматы изображения (compressed bitmaps). Помните, что элемент PictureBox может читать RLE и WMF форматы, а в версии VB5 также PCX и JPEG. Если Вы ранее использовали компоненты третьих фирм для работы с этими форматами, Вы можете избавиться от этого изменив и перекомпилировав свой код под VB5 и сохранив старый файл ресурсов.

    48.  

    49. Используйте метод Move для изменения размеров или перемещения форм. Это быстрее, чем по отдельности изменять свойства Left, Top, Width, и Height.

    50.  

    51. Элемент PictureBox очень прожорлив, и если Вам не требуются такие его свойства, как поддержка DDE, графические методы, и способность содержать другие объекты – Вы можете повысить производительность своего приложения, заменив его на обычный элемент Image.

    52.  

    53. Не пользуйтесь пустыми циклами For … Next для реализации задержки в вашей программе. Используйте API функцию Sleep, которая не загружает процессор и позволяет другим приложениям в многозадачной среде работать:

    54. Declare Sub Sleep Lib "kernel32" (ByVal milliseconds As Long)
      ' пауза в 5 сек.
      Sleep 5000 
    55. Ускорить доступ к свойствам, или методам объектов можно уменьшением числа “точек” в выражении. Например, когда Вам надо сослаться на несколько “вложенных” объектов или элементов управления повторно:

    56. Form1.Text1.Text = ""
      Form1.Text1.ForeColor = 0

      Вы можете использовать временный объект или директиву With:

      With Form1.Text
      .Text = ""
      .ForeColor = 0
      End With 
    57. Свойства, определенные как переменные типа Public, всегда быстрее, чем пара свойств Let/Get даже на разных версиях VB. Это составляет около 7 раз для VB4, и только 4 раза на VB5.

    58.  

    59. Замените числа в небольших целых степенях их простым произведением. Например:

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

      x = N * N * N

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

      ' это в 3 раза быстрее, чем N^7
      tmp = N * N * N
      x = tmp * tmp * N 
    61. Пользуйтесь командами LSet или RSet для присвоения новых значений строкам без изменения их длины. При этом можно дополнять строку спереди или сзади пробелами, при необходимости.

    62.  

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

    64. length% = Len(a$ & b$)
      length% = Len(a$) + Len(b$)

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

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

    66. 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 
    67. Вы можете добавить метод Show и после него DoEvent в событии Form_Load чтобы показать форму еще до того, как завершится процесс инициализации:

    68. Private Sub Form_Load()
      Me.Show
      DoEvents
      ' здесь откройте базу данных
      End Sub 
    69. Вы можете заменить многие элементы управления, используя графические методы. Например, элементы Line и Shape на графические методы Line и Circle, или 3-D Frame можно нарисовать, используя комбинацию линий. Window’s API рисует замкнутые полигоны и заполняет их цветом по Вашему выбору гораздо быстрее, чем графические методы VB.

    70.  

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

    72.  

    73. Команда SavePicture сохраняет растровый файл в зависимости от установленного Вами режима видеоадаптера. Если вы сохраняете монохромный bitmap разрешением 640 на 480 в то время как Ваша видеокарта работает в 256-цветном режиме, файл на диске займет 300К вместо 37.5, которые нужны для картинки чтобы корректно ее сохранить (восемь пикселов на байт).

    74.  

    75. Используйте заставку для обратной связи с пользователем, при загрузке главной формы приложения. Хотя на самом деле это и не повысит скорость загрузки, зато пользователю будет казаться, что программа работает быстрее.

    76.  

    77. Когда Вы внедряете рисунок в форму, или файл ресурсов, всегда используйте минимально возможное количество цветов. 16-цветный рисунок занимает половину памяти требуемой для 256-цветового рисунка, а монохромный одну четверть памяти, требуемой для 16-цветного рисунка.

    78.  

    79. VB5 позволяет Вам указывать явно типы данных. Если очень нужно, Вы можете установить значение по умолчанию прямо в списке параметров.

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

      Sub MyProc(Optional X As Integer = 10) 
    81. Если цикл содержит вычисляемое выражение, которое не изменяется во время выполнения цикла, вычисляйте его до цикла, а в цикле используйте временную переменную:

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.

 

 > НАЗАД <

 



 


DDA Software HOME page

ddasoft@narod.ru

Updated: 05.2003

 

Сайт управляется системой uCoz