Статьи

Страница 3 из 3.   [1] [2] [3]

88 советов по оптимизации программ на Visual Basic


ЧТЕНИЕ И ЗАПИСЬ В ФАЙЛЫ.

57. VB4 и VB5 позволяют Вам записать любой массив на диск одной директивой Put:

Put #1, , strArray()

Вы также можете использовать директиву Get для чтения массива обратно в память:

ReDim strArray(numEls) As String 
Get #1, , strArray()

Заметим, что вы должны правильно объявить размерность массива перед чтением в него файла. Этот метод работает с любыми типами массивов, включая строки и типы определенные пользователем за исключением объектов.

58. Самый быстрый путь считать текстовый файл в строковую переменную или элемент управления TextBox - это использовать функцию Input$:

Text1.Text = Input$(#1, LOF(1))

58. Если надо записать множество маленьких кусочков данных в текстовый файл, объедините их в одну тестовую строку и пишите ее за один заход одним оператором:

' Сохранение содержимого строкового массива в текстовый файл.
For I = 1 To UBound(sArr) 
 Temp$ = Temp$ & sArr(i) & vbCrLf
Next
Open "C:\Notes.txt" For Output As #1 
Print #1, Temp$
Close #1

НОТАЦИИ КЛАССОВ В ОБЪЕКТАХ И КОЛЛЕКЦИЯХ.

60. Ускорить доступ к свойствам, или методам объектов можно уменьшением числа «точек» в выражении. Например, когда Вам надо сослаться на несколько «вложенных» объектов или элементов управления повторно:

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

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

With Form1.Text 
.Text = "" 
.ForeColor = 0 
End With

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

62. В приложениях, откомпилированных с опцией native-compiled VB5, вызов свойств или методов объявленных как Friend около 6 раз быстрее, чем простой вызов их как Public, вне зависимости от их определения (Private или Public) в классе.

63. Ссылайтесь на элемент коллекции с помощью строкового ключа:

RootName = MyCollection("Root").Name

Это быстрее, чем ссылки через числовой индекс. Несмотря на это числовой индекс быстрее, если нужно обратиться к первому элементу коллекции, но он тормозит, когда читается элемент, расположенный в области больших индексов.

64. Старайтесь всегда использовать для перебора коллекций цикл For Each ... Next, который в 10 раз быстрее стандартного For ... Next с числовыми индексами.

65. При добавлении элемента в коллекцию никогда не используйте аргументы before и after, если у Вас нет абсолютной необходимости поместить новый элемент строго в заданную позицию.

66. Если Вы хотите очистить коллекцию, не пользуйтесь циклом с Remove. Вместо этого присвойте коллекции значение Nothing. Эта техника приемлема только в том случае, если в коллекции нет элементов, ссылающихся на другие коллекции.

67. Автоматическое создание объекта при его определении директивой Dim x As New Class1, медленнее, чем простое объявление объекта директивой Dim без New, и последующая его инициализация директивой Set (Set x = New Class1). Это происходит потому, что в случае объявления New в Dim, при каждой ссылке на объект,VB проверяет нужна ли объекту инициализация. Это приводит к понижению производительности на 50% под VB4, но в принципе оно незначительно под VB5.

68. Держитесь подальше от общих объявлений (as Object) в переменных и процедурах, Которые используют позднее связывание. Всегда используйте только определенные объекты, если конечно Ваша процедура не работает с разными объектами.


OLE АВТОМАТИЗАЦИЯ.

69. В общем, вызовы in-process DLL-серверов более быстры, чем out-of-process EXE-серверов, где-то на два порядка.

70. При передаче аргументов in- process OLE-серверам (ActiveX DLL), передавайте каждый параметр по ссылке, т.к. сервер объединяет их клиентские адресные пространства и может читать значения аргументов прямым доступом. Эта техника особенно рекомендуется при передаче длинных строк.

71. Наоборот, при передаче аргументов out-of-process OLE-серверу (ActiveX EXE), вы должны всегда передавать параметры по значению, т.к. OLE не прибегает к упорядочиванию (so OLE does not resort to marshaling) при возвращении управления своему клиенту. Конечно, этот совет не катит, когда Вам надо передать параметр по ссылке с целью его изменения.

72. Если Вам не нужны дополнительные возможности, предоставляемые SingleUse OLE-серверами, используйте MultiUse-сервера, которые используют меньше памяти и ресурсов.

73. Если ваш сервер информирует свое приложение о завершении полученной задачи, используйте механизм обратного вызова (callback) вместо события, выполняющегося через директиву WithEvent. События выполняются в 30 раз медленнее, не принимают аргументы по умолчанию, не возвращают величины, и не работают с удаленными серверами.


БЫСТРЕЕ ЧЕМ «КОНКОРД»: JET и DAO.

74. Используйте простые типы наборов записей, которые поддерживают все необходимое для Вашей задачи. Например, если Вам нужно перебрать записи для составления отчета, Вам будет достаточно forward-only, read-only набора данных, который использует меньше ресурсов и более быстр, чем набор данных dynaset.

75. В случае 500 или менее записей, snapshot, в общем, более эффективен, чем dynaset, исключая те случаи, когда набор содержит Memo и большие двоичные объекты (Large Binary fields). В последнем случае, применять dynaset предпочтительнее, т.к. он загружает данные, только когда в коде программы на VB Вы ссылаетесь на соответствующее, содержащее эти объекты, поле.

76. Всегда фильтруйте Ваши записи, используя подходящие выражения SELECT SQL, которые предпочтительнее простых пропусков при обработке записей по условию. Также при операциях вставки, изменения и удаления, применение команд SQL INSERT, UPDATE и DELETE предпочтительнее, чем использование для этого методов DAO.

77. Чаще сжимайте Вашу базу данных. Эта операция записывает таблицы в смежных страницах базы данных, перестраивает индексы, меняет статистику базы данных и перекомпилирует все запросы.

78. Используйте параметризованные объекты QueryDef, когда Вам нужно выполнить несколько выборок или действий с запросами повторно. Когда DAO компилирует объекты QueryDef, оно использует последние данные статистики для подготовки его плана выполнения. В связи с этим рекомендуется сжимать Вашу базу данных так часто, как Вы хотите изменять планы Ваших запросов основываясь на последних данных.

79. Доступ к данным, на удаленных базах данных с использованием присоединенных таблиц предпочтительнее, чем прямое их открытие методом OpenDatabase.

80. Всегда открывайте свою базу данных в режиме read-only («только чтение»), если Вы не хотите изменять данные. Такая практика предотвращает блокировки и ваша программа (а также и все другие приложения, которые совместно используют эту базу данных) будет работать быстрее.

81. Для повышения производительности заключайте ваши изменения в транзакции с помощью методов BeginTrans и CommitTrans. Однако учтите, что ожидающие завершения транзакции сохраняются в памяти насколько это возможно, и слишком много незавершенных транзакций требуют создания временной базы данных на диске что приводит к диким торможениям. Чтобы этого не произошло, завершайте транзакцию с помощью CommitTrans и начинайте новую через каждые N записей. Так как транзакции подразумевают реальную блокировку данных, никогда не включайте в транзакции функции интерфейса пользователя, и всегда завершайте или откатывайте их по возможности.

82. Значительно ускоряет ядро Jet Engine 3.5 новая команда SetOptions, с помощью которой вы можете перезаписать значения по умолчанию в реестре Windows. Например Вы можете контролировать размер внутреннего буфера ( опция dbMaxBufferSize), как часто он будет сбрасываться на диск (опции dbSharedAsynchDelay и dbExclusiveAsynchDelay), как часто ядро будет предпринимать попытки блокировать страницу (опция dbLockDelay), и количество этих попыток (опция dbLockRetry). Для подробной информации читайте справку VB5.

83. Если вы не знаете, как долго будет выполняться запрос и сколько записей он возвратит, вы можете использовать объект QueryDef и установить его свойство MaxRecord в приемлемое значение такое, как 100 или 200 такое, как 100 или 200 записей.


НА ЛЕТУ: ODBCDIRECT И RDO.

84. Скопировав на машину клиента удаленные маленькие таблицы, данные в которых редко меняются, Вы обеспечите быстрый доступ к ним. При таком подходе Ваше приложение должно при каждом своем запуске проверять не обновились ли эти таблицы на сервере и скачивать их на рабочую станцию в случае их обновления.

85. Используя свойство QueryTimeOut объекта rdoQuery, Вы можете предотвратить долгое ожидание окончания выполнения запроса. По истечении заданного времени RDO инициирует событие QueryTimeOut для родительского объекта rdoConnection и вы можете его перехватить и обработать в программе, решив что делать дальше: продолжать ждать или прервать выполнение запроса.

86. Вы можете cделать удаленные запросы менее тормозными, используя так называемое preconnection (предварительное соединение) к источнику данных ODBC. В начале программы откройте и сразу же закройте базу данных. Эти действия не разорвут само соединение, которое может оставаться активным до 10 минут. Вы можете изменить это время подбором величины ConnectTimeOut в ключе реестра ...\Jet\3.5\Engines\ODBC.

87. Вы также можете сделать сетевой трафик минимально возможным, работая с наборами записей типа dynaset 100 записей и меньше. Фактически dynaset содержащий более 100 записей требует два соединения (connections) - одно для записей, и одно для ключей. Однако другие dynaset’ы могут использовать последнее соединение для своих собственных ключей.

88. Когда вы используете оптимистическое изменение в удаленной таблице содержащей много полей, вы можете сделать операции удаления (insert) и добавления (delete) более эффективными, если добавите поле типа временной метки (timestamp) в таблицу с помощью команды SQL, например «ALTER TABLE RemoteTable ADD COLUMN VersionID TIMESTAMP». Добавление такого поля позволит ядру базы данных сравнивать только новое поле VersionID вместо целой записи для выяснения, не редактирует ли кто другой текущую запись.

BONUS TIP №1. Значительно понизить сетевой трафик можно также применением оптимистических курсоров (Client Batch cursors), которые доступны в RDO 2.0. Более того, с их помощью можно временно убрать соединение, произвести локальное изменение набора записей (RecordSet), прицепиться вновь и послать изменения на сервер. Для более полной информации читайте справку VB5.

BONUS TIP №2. Еще один способ значительного ускорения ваших клиент-серверных приложений - использование асинхронных запросов и соединений.



Страница 3 из 3.   [1] [2] [3]

   
Hosted by uCoz