Что такое эффективное программное обеспечение? Эффективное программное обеспечение должно не только работать быстрее, чем программное обеспечение, выполняющее ту же функцию, но и потреблять меньше системных ресурсов. В этой статье собран некоторый опыт, накопленный автором при использовании VB для разработки программного обеспечения, и используются несколько простых примеров, показывающих, как писать эффективный код VB. Он содержит некоторые методы, которые могут быть очень полезны программистам VB. Прежде чем начать, позвольте мне прояснить несколько понятий.
Пусть код сразу обретает форму: Среди программистов, с которыми я общался, многие любят сначала писать код в соответствии с функциональными требованиями, а затем уже на этой основе оптимизировать код. В конце концов они обнаружили, что чтобы добиться оптимизации, нужно переписать код. Поэтому я предлагаю вам рассмотреть вопросы оптимизации перед написанием кода.
Поймите взаимосвязь между результатами оптимизации и требуемой работой: обычно, когда фрагмент кода готов, его необходимо проверить и изменить. В процессе проверки кода вы можете обнаружить, что эффективность кода в некоторых циклах можно еще повысить. В этом случае многие программисты, стремящиеся к совершенству, могут немедленно изменить код. Я предполагаю, что если изменение этого кода сократит время работы программы на одну секунду, вы можете изменить его. Если это может привести к улучшению производительности только на 10 миллисекунд, никаких изменений не произойдет. Это связано с тем, что переписывание фрагмента кода неизбежно приведет к появлению новых ошибок, а отладка нового кода обязательно займет у вас определенное количество времени. Программистам следует найти баланс между производительностью программного обеспечения и объемом работы, необходимой для его разработки, а 10 миллисекунд — это разница, которую пользователи не могут оценить.
Старайтесь использовать объектно-ориентированные методы, когда вам нужно их использовать. Механизм, предоставляемый VB, не полностью поддерживает объектно-ориентированное проектирование и кодирование, но VB предоставляет простые классы. Большинство людей считают, что использование объектов приведет к снижению эффективности кода. Лично у меня несколько иное мнение на этот счет: эффективность кода нельзя оценивать исключительно с точки зрения скорости работы. Ресурсы, занимаемые программным обеспечением, также являются одним из факторов, которые необходимо учитывать. Использование классов может помочь вам улучшить общую производительность вашего программного обеспечения, что я подробно объясню в последующих примерах.
Я надеюсь, что, когда вы пишете код VB, вы сможете использовать приведенные выше положения в качестве принципов для написания кода. Статью я разделил на две части: как улучшить скорость работы кода и оптимизацию компиляции.
Как заставить ваш код работать быстрее
Следующие методы могут помочь вам улучшить скорость вашего кода:
1. Используйте целые числа (Integer) и длинные целые числа (Long).
Самый простой способ ускорить работу вашего кода — использовать правильные типы данных. Вы можете не поверить, но выбор правильного типа данных может значительно повысить производительность вашего кода. В большинстве случаев программисты могут заменить переменные типа Single, Double и Currency переменными типа Integer или Long, поскольку способность VB обрабатывать Integer и Long намного выше, чем у других типов данных.
В большинстве случаев причина, по которой программисты предпочитают использовать Single или Double, заключается в их способности сохранять десятичные дроби. Но десятичные дроби также можно хранить в переменных типа Integer. Например, если в программе согласовано три десятичных знака, то для получения результата вам достаточно разделить значение, хранящееся в переменной Integer, на 1000. По моему опыту, код может работать почти в 10 раз быстрее, если использовать Integer и Long вместо Single, Double и Currency.
2. Избегайте использования вариантов
Для программиста VB это очевидно. Переменным типов вариантов требуется 16 байт пространства для хранения данных, а для целого числа (Integer) требуется только 2 байта. Обычно целью использования вариантов типов является уменьшение рабочей нагрузки при проектировании и объема кода. Некоторые программисты также используют их для предотвращения проблем. Но если программное обеспечение спроектировано и закодировано строго в соответствии со спецификациями, можно полностью избежать использования типов вариантов.
Кстати, та же проблема существует и для объектов Object. Пожалуйста, посмотрите на код ниже:
мФСО
SetFSO=NewScripting.FileSystemObject
или
ДимФСОасобъект
SetFSO=NewScripting.FileSystemObject
Поскольку приведенный выше код не указывает тип данных при объявлении, память и время ЦП будут потрачены впустую во время назначения. Правильный код должен выглядеть так:
DimFSOasNewFileSystemObject
3. Старайтесь избегать использования атрибутов
В повседневном коде наиболее распространенным неэффективным кодом является многократное использование свойств (Property), когда можно использовать переменные, особенно в циклах. Вы должны знать, что скорость доступа к переменным примерно в 20 раз превышает скорость доступа к атрибутам. Следующий код используется многими программистами в своих программах:
DimintConasInteger
ForintCon=0toUbound(SomVar())
Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)
NextintCon
Код ниже выполняется в 20 раз быстрее, чем код выше.
DimintConasInteger
DimsOutputasString
ForintCon=0toUbound(SomeVar())
sOutput=sOutput&vbCrlf&
СомеВар(intCon)
Следующий
Text1.Text=sВывод
4. Старайтесь использовать массивы и избегайте наборов.
Если вам не нужно использовать коллекцию, вам всегда следует использовать массив. Согласно тестам, скорость доступа к массивам может достигать 100-кратной скорости доступа к коллекциям. Эта цифра звучит немного шокирующей, но если учесть, что коллекция — это объект, то вы поймете, почему разница так велика.
5. Разверните тело маленького цикла
При кодировании вы можете столкнуться с такой ситуацией: тело цикла будет повторяться только 2 или 3 раза, а тело цикла состоит из нескольких строк кода. В этом случае можно развернуть петлю. Причина в том, что цикл отнимает дополнительное время процессора. Но если цикл более сложный, этого делать не нужно.
6. Избегайте использования очень коротких функций
Как и при использовании небольших циклов, вызывать функцию, состоящую всего из нескольких строк кода, неэкономично — вызов функции может занять больше времени, чем выполнение кода в функции. В этом случае вы можете скопировать код функции в то место, где функция была изначально вызвана.
7. Сократите количество ссылок на подобъекты
В VB ссылки на объекты реализуются с помощью . Например:
Форма1.Текст1.Текст
В приведенном выше примере программа ссылается на два объекта: Form1 и Text1. Цитирование с использованием этого метода неэффективно. Но, к сожалению, избежать этого невозможно. Единственное, что может сделать программист, — это использовать With или сохранить дочерний объект (Text1) вместе с другим объектом.
Примечание. Используйте с
WithfrmMain.Text1
.Text="ИзучитьVB"
.Выравнивание=0
.Tag="Это моя жизнь"
.BackColor=vbBlack
.ForeColor=vbWhite
КонецС
или
Примечание. Используйте другой объект, чтобы сохранить дочерний объект.
Димтксттекстбоксастекстбокс
SettxtTextBox=frmMain.Text1
TxtTextBox.Text="LearnVB"
TxtTextBox.Alignment=0
TxtTextBox.Tag="Это моя жизнь"
TxtTextBox.BackColor=vbBlack
TxtTextBox.ForeColor=vbWhite
Обратите внимание, что упомянутый выше метод применим только тогда, когда вам нужно работать с подобъектами объекта. Следующий код неверен:
Стекст1
.Text="ИзучитьVB"
.Выравнивание=0
.Tag="Это моя жизнь"
.BackColor=vbBlack
.ForeColor=vbWhite
КонецС
К сожалению, мы часто можем встретить код, подобный приведенному выше, в реальном коде. Это только замедлит выполнение кода. Причина в том, что блок With после компиляции сформирует ветвь, что добавит дополнительную работу по обработке.
8. Проверьте, пуста ли строка
Большинство программистов при проверке пустости строки используют следующий метод:
ЕслиТекст1.Текст=""то
Примечание: выполнять операции
Эндиф
К сожалению, сравнение строк требует даже больше обработки, чем чтение свойств. Поэтому я предлагаю вам использовать следующий метод:
ЕслиLen(Text1.Text)=0, то
Примечание: выполнять операции
Эндиф
9. Имя переменной после удаления ключевого слова Next.
Добавление имени переменной после ключевого слова Next приведет к снижению эффективности кода. Я не знаю, почему это происходит, это просто опыт. Но я думаю, что очень немногие программисты пойдут так далеко, чтобы добавить лишнюю информацию. В конце концов, большинство программистов дорожат словами как золотом.
Комментарий: Неверный код.
ForiCount=1to10
Примечание: выполнять операции
NextiCount
Примечание. Правильный код.
ForiCount=1to10
Примечание: выполнять операции
Следующий
10. Используйте массивы вместо нескольких переменных
Если у вас есть несколько переменных, которые содержат одинаковые данные, рассмотрите возможность замены их массивом. В VB массивы являются одной из наиболее эффективных структур данных.
11. Используйте динамические массивы вместо статических.
Использование динамических массивов не окажет большого влияния на скорость выполнения кода, но в некоторых случаях может сэкономить немало ресурсов.
12. Уничтожайте объекты
Независимо от того, какое программное обеспечение написано, программистам необходимо рассмотреть возможность освобождения пространства памяти, занимаемого программным обеспечением, после того, как пользователь решит закрыть программное обеспечение. Но, к сожалению, многих программистов это, похоже, не особо волнует. Правильный подход — уничтожить объекты, используемые в программе, перед выходом из программы. Например:
DimFSOasNewFileSystemObject
Примечание: выполнять операции
Примечание. Уничтожьте объект.
SetFSO=Ничего
Для форм вы можете удалить:
Выгрузить из основного
или
SetfrmMain=Ничего
13. Строки переменной и фиксированной длины.
С технической точки зрения строки фиксированной длины требуют меньше времени и места для обработки, чем строки переменной длины. Однако недостатком строк фиксированной длины является то, что во многих случаях вам необходимо вызвать функцию Trim для удаления нулевого символа в конце строки, что снизит эффективность кода. Поэтому, если длина строки не изменится, используйте строки переменной длины.
14. Используйте модули классов вместо элементов управления ActiveX.
Если элементы управления ActiveX не связаны с пользовательскими интерфейсами, попробуйте использовать облегченные объекты, такие как классы. Между ними существует большая разница в эффективности.
15. Используйте внутренние объекты
Когда дело доходит до использования элементов управления ActiveX и библиотек DLL, многие программисты предпочитают их компилировать, а затем добавлять в проект. Я бы советовал вам не делать этого, поскольку подключение к внешнему объекту из VB требует большой вычислительной мощности процессора. Каждый раз, когда вы вызываете метод или получаете доступ к свойству, вы тратите много системных ресурсов. Если у вас есть исходный код элемента управления ActiveX или библиотеки DLL, сделайте их частными объектами в проекте.
16. Уменьшите количество модулей
Некоторым людям нравится хранить общие функции в модулях, и я с этим согласен. Но писать в модуле всего двадцать-тридцать строк кода — это немного смешно. Если вам действительно не нужен модуль, постарайтесь его не использовать. Причина этого в том, что VB загружает модули в память только при вызове функций или переменных в модуле; эти модули выгружаются из памяти при выходе из приложения VB. Если в коде только один модуль, VB выполнит только одну операцию загрузки, поэтому эффективность кода повысится, и наоборот, если в коде несколько модулей, VB выполнит несколько операций загрузки, и эффективность; код будет сокращен.
17. Используйте массивы объектов
При разработке пользовательских интерфейсов программистам следует стараться использовать массивы объектов для элементов управления одного типа. Вы можете провести эксперимент: добавить в окно 100 PictureBox'ов, каждый со своим именем, и запустить программу. Затем создайте новый проект, также добавьте в окно 100 PictureBoxes, но на этот раз используйте массив объектов, запустите программу, вы заметите разницу во времени загрузки двух программ.
18. Используйте метод «Перемещение»
При изменении положения объекта некоторые программисты любят использовать свойства «Ширина», «Высота», «Сверху» и «Слева». Например:
Изображение1.Ширина=100
Изображение1.Высота=100
Изображение1.Верх=0
Изображение1.Влево=0
На самом деле это очень неэффективно, поскольку программа изменяет четыре свойства, и после каждого изменения окно будет перерисовываться. Правильный подход — использовать метод Move:
Изображение1.Переместить0,0,100,100
19. Сократите использование изображений
Изображения будут занимать много памяти, а их обработка также требует много ресурсов процессора. В программном обеспечении, если возможно, рассмотрите возможность использования цветов фона вместо изображений — конечно, это всего лишь взгляд технического человека на этот вопрос.
20. Используйте ActiveXDLL вместо элементов управления ActiveX.
Если проектируемый объект ActiveX не требует пользовательского интерфейса, используйте ActiveXDLL.
Оптимизация компиляции
Многие программисты VB, с которыми я встречался, никогда не использовали параметры компиляции и не пытались выяснить различия между ними. Давайте посмотрим на конкретное значение каждого параметра.
1.P-код (псевдокод) и собственный код
Вы можете скомпилировать программное обеспечение в P-код или собственный код. По умолчанию используется собственный код. Так что же такое P-код и собственный код?
P-код: при выполнении кода в VB VB сначала компилирует код в P-код, а затем интерпретирует и выполняет скомпилированный P-код. В скомпилированной среде использование этого кода выполняется быстрее, чем собственный код. После выбора P-Code VB при компиляции помещает псевдокод в EXE-файл.
Собственный код: Собственный код — это опция, появившаяся только после VB6. При компиляции в EXE-файл собственный код выполняется быстрее, чем P-код. После выбора собственного кода VB использует машинные инструкции для создания EXE-файла при компиляции.
При компиляции нативного кода я обнаружил, что иногда возникают необъяснимые ошибки. Мой код выполняется совершенно корректно в среде компиляции, но EXE-файл, созданный с использованием опции собственного кода, выполняется неправильно. Обычно это происходит, когда выгружается окно или всплывает окно печати. Я решил эту проблему, добавив в код оператор DoEvent. Конечно, вероятность того, что это произойдет, очень редка. Возможно, некоторые программисты VB никогда с этим не сталкивались, но она существует.
В машинном коде также есть несколько опций:
а) Оптимизация скорости кода. Этот параметр позволяет скомпилировать более быстрый исполняемый файл, но исполняемый файл будет больше. Рекомендуется
б) Оптимизация размера кода: этот вариант позволяет скомпилировать исполняемый файл меньшего размера, но в ущерб скорости не рекомендуется.
в) Без оптимизации: этот вариант преобразует только P-код в собственный код без какой-либо оптимизации. Может использоваться при отладке кода.
г) Оптимизирован для Pentium Pro: хотя этот параметр не является параметром по умолчанию в машинном коде, я обычно использую его. Исполняемая программа, скомпилированная с этим параметром, может работать быстрее на машинах PentiumPro и Pentium2 или выше, но будет немного медленнее на старых машинах. Учитывая, что использование Pentium2 устарело, эту опцию рекомендуется использовать всем.
д) Генерировать символическую отладочную информацию: этот элемент генерирует некоторую отладочную информацию во время процесса компиляции, позволяя пользователям использовать такие инструменты, как Visual C++, для отладки скомпилированного кода. При использовании этой опции создается файл .pdf, в котором информация о флаге записывается в исполняемый файл. Эта опция полезна, когда в программе есть функции API или вызовы DLL.
2. Расширенная оптимизация
Настройки расширенной оптимизации могут помочь вам повысить скорость работы вашего программного обеспечения, но иногда они могут приводить к ошибкам, поэтому я рекомендую вам использовать их как можно осторожнее. Если в коде присутствуют относительно большие тела циклов или сложные математические операции, выбор определенных элементов в расширенной оптимизации значительно улучшит производительность кода. Если вы используете расширенные функции оптимизации, я рекомендую тщательно протестировать скомпилированные файлы.
а) Предполагается отсутствие псевдонима: это может повысить эффективность выполнения кода в теле цикла, но если значение переменной изменяется с помощью ссылки на переменную, например, при вызове метода, ссылка на переменную используется как параметр метода. и значение переменной изменится в значении метода, возникнет ошибка. Возможно, возвращенный результат неверен, или это может быть серьезная ошибка, которая приводит к прерыванию программы.
б) Отменить проверку привязки массива, отменить проверку целочисленного переполнения и отменить проверку ошибок с плавающей запятой: если во время работы программы в ходе этих проверок обнаружены ошибки, код обработки ошибок будет обрабатывать эти ошибки. Но если эти проверки отменить, программа не сможет обработать ошибку. Вам следует использовать эти параметры только в том случае, если вы уверены, что вышеуказанные ошибки не возникнут в вашем коде. Они значительно улучшат производительность программного обеспечения.
в) Разрешить операции с плавающей запятой без округления: выбор этой опции позволяет скомпилированной программе быстрее обрабатывать операции с плавающей запятой. Единственным его недостатком является то, что он может привести к неверным результатам при сравнении двух чисел с плавающей запятой.
г) Отменить проверку безопасности PentiumFDIV: эта опция установлена для некоторых старых чипов Pentium и теперь кажется устаревшей.