|
|
|
[Статья] Как заставить Вашу программу на VB работать быстрее?08.01.2015, 17:13. Показов 24122. Ответов 25
Метки нет (Все метки)
Автор: Рут Глушкин, VBStreets
Прежде всего заставьте программу работать, а затем беспокойтесь о ее быстродействии. Существует множество способов ускорения вашей VB программы. К сожалению, большинство из них не приводят к особо впечатляющим результатам. Даже если ваша программа работает с огромными коллекциями, преобразование их в массивы, возможно, спасет вам какой-то процент или два в процессе выполнения программы. С другой стороны, переписывание основных алгоритмов программы может сократить процесс выполнения в сотни раз. Ниже приводятся несколько способов, с помощью которых вы можете намного улучшить эффективность вашей программы. 1. Производя арифметические операции, оперируйте целыми числами и используйте целочисленные операторы, где это возможно. Используйте оператор "\" - целочисленного деления вместо "/" - деления с плавающей точкой. Используйте "* .5" вместо "/ 2", поскольку команда ассемблера "MUL" быстрее, чем "FDIV". 2. Где только это возможно, не применяйте квадратные корни, например: Visual Basic If a * a + b * b = 4 Then ... Visual Basic If Sqr(a * a + b * b) = 2 Then ... 4. Перепишите вашу программу на C++ или Delphi. (Это, конечно, не всегда возможно, но это - единственное решение, когда несмотря ни на что, ваша программа работает невыносимо медленно). 5. Установите у себя 5 или 6 версию VB. Программы, откомпилированные в VB с опцией Native, конечно, работают медленнее, чем программы, написанные на C++ или Delphi, но они намного быстрее, чем неоткомпилированные программы, создаваемые более ранними версиями VB. 6. Создавайте шаблоны. Пользуйтесь средствами контроля производительности для того, чтобы определить, где именно ваша программа проводит больше всего времени. Эти средства встроены в VB 4 и 5, и VB 6 Enterprise Edition. Не теряйте времени по улучшению того кода, который и так достаточно быстрый. 7. Распаковывайте графику. Всегда пользуйтесь файлами с расширением .bmp, а не запакованными .jpg или .gif файлами. Эти файлы хранятся в программе в запакованном виде, и требуется дополнительное время для их раскрытия. 8. Используйте Set your_form = Nothing, когда данная форма вам больше не нужна. Это экономит память и может сэкономить массу времени, когда у вас много форм, которые вы должны хранить в памяти. Если же у вас немного форм, гораздо эффективнее загружать их все в начале программы. Затем они будут появляться на экране быстрее, когда они вам понадобятся. Не закрывайте их до конца, вместо этого применяйте методы Hide/Show по мере необходимости. 9. Используйте массивы вместо коллекций. Массивы намного быстрее. Используйте коллекции только тогда, когда вам нужны их особые свойства, например, просмотр по ключу. Заранее определяйте массивы максимально возможного размера, чтобы не пришлось динамически выделять под них память в процессе выполнения программы - ReDim. 10. Если вам нужно обнулить все элементы динамического массива, используйте ReDim. Это займет больше времени, чем оставить массив в покое, но это гораздо быстрее, чем обнуление элементов массива в цикле. 11. Если вам нужно обнулить все элементы массива фиксированной длины, объявленного с применением Dim, используйте Erase. Это уничтожит динамический массив, но обнулит массив фиксированной длины. 12. Пользуйтесь функциями API MemCopy или RtlMoveMemory для копирования массивов вместо копирования их элементов в цикле. 13. Всегда указывайте определенные типы данных вместо Variant. Всегда объявляйте переменную вместе с ее типом. Если вы не укажете тип переменных, она по умолчанию будет Variant. 14. Всегда указывайте определенные типы объектов вместо объявления переменной типа Object. Будьте настолько точны, насколько это возможно. Например, Object - плохо Control - лучше TextBox - лучше всего. 15. Никогда не очищайте коллекцию, удаляя ее элементы. Уничтожайте их, используя Set элемент = Nothing. 16. Объявляйте объект и выделяйте под него память на отдельных строках кода. Строка "Dim obj As New MyClass" выполняется медленнее, чем две отдельных строки "Dim obj As MyClass" "Set obj = New MyClass". 17. Для проверки строки нулевой длины "" используйте функцию Len. То есть: Visual Basic If Len(my_string) = 0 Then ... гораздо быстрее, чем: If my_string = "" Then 19. Применяйте как можно меньше операций с переменными типа String, эти операции медленные. 20. Упорядочивайте команды внутри Select Case таким образом, чтобы наиболее часто встречающиеся значения были вначале. 21. Ощущаемое быстродействие гораздо важнее фактического. Представьте себе, что вы нажали на кнопку, и в течение 10 секунд ничего не происходит. Эти 10 секунд покажутся вам часом. Добавьте ProgressBar, и тогда пользователь даже не заметит, что прошло 10 секунд. 22. Когда у вас в программе множество динамически меняющихся картинок, поместите их все в невидимые Images на первую загружаемую форму, а затем загружайте их по мере необходимости. Никогда не работайте с файлами. Строка Visual Basic Form2.Image1.Picture = LoadPicture("yourfile.bmp")Visual Basic Form2.Image1.Picture = Form1.Image1.Picture 24. Чтобы создать ощущение, что ваша программа выполняется быстро, показывайте первую форму как можно быстрее. Вставьте команду Show в процедуру Form1_Load(), чтобы она появилась на экране до окончания выполнения долгих начальных настроек и вычислений. Помещайте в процедуру каждой формы Load как можно меньше кода для того, чтобы она появлялась как можно быстрее. Если требуется много времени для загрузки начальной формы, создайте дополнительную форму с ProgressBar и загружайте ее немедленно. Эта форма должна быть на экране все время выполнения начальных настроек, она убирается с экрана в конце процедуры Form1_Load(). 25. Распределяйте функции и процедуры по модулям. Когда одна процедура вызывает другую, загружается весь модуль второй процедуры. Если одна процедура вызывает несколько процедур из разных модулей, все эти модули загружаются в память. Если же все процедуры находятся в одном модуле, они все загружаются одновременно. 26. Не тратьте память бездумно. Иногда вы можете заставить вашу программу выполняться быстрее, используя больше памяти, но иногда применение большей памяти сильно замедляет вашу программу. В частности, если вы используете так много памяти, что ваша программа требует больше оперативной памяти, чем есть в системе, система будет загружать программу постранично, что сильно замедлит ее выполнение. 27. Для сокращения требуемой оперативной памяти присваивайте Form1.AutoRedraw = False. Но для ускорения сложных графических операций присваивайте Form1.AutoRedraw = True. 28. Присваивайте Object.ClipControls = False, где это возможно (прочтите Help для более подробной информации). 29. Для изменения местоположения контролек используйте команду Move вместо изменений значений Left и Top. 30. Если вам нужно изменить серию свойств, связанных с внешним видом (Appearance) объекта, вначале сделайте его невидимым, и только по завершении всех операций, сделайте его снова видимым. 31. Кэшируйте свойства, которые вы применяете много раз. Например, если ваша программа несколько раз обращается к свойству txtLastName.Left, поместите это значение в переменную, и работайте с ней. Обращение к переменной намного быстрее, чем к свойствам объекта. 32. Для того, чтобы нарисовать прямоугольник, вместо четырех команд Line, используйте: Visual Basic Line (x1, y1)-(x2, y2), , B34. Используйте Frames для хранения других объектов вместо PictureBoxes, так как Frame требует меньше памяти. 35. Неважные объекты помещайте в массивы. Например, множество форм содержат множество Labels. Поместите их все в один массив. Массив, содержащий 10 объектов, требует меньше памяти, чем 10 отдельных объектов. 36. Выполняйте длинные вычисления на фоне выполнения других операций, используя Timer. 37. Используйте комментарии и значимые имена переменных. Длинные комментарии и имена переменных, а также пустые строки не увеличивают размера вашей программы, так что нет никакого вреда в их применении. 38. Не нумеруйте каждую строку вашего кода, поскольку нумерация строк увеличивает размер вашей программы. 39. Убирайте неиспользуемые переменные и участки кода, так как они остаются в программе, и увеличивают как ее размер, так и выделяемую под нее оперативную память. 40. Используйте DoEvents, чтобы позволить пользователю выполнять другие операции, пока ваша программа выполняет какой-то длительный процесс. Это уменьшит недовольство пользователя даже, если это не заставит вашу программу выполняться быстрее. 41. Используйте функции API FindFirstFile, FindNextFile, и FindClose для быстрого поиска файлов и папок. Но помните, что не всегда обращение к функциям API быстрее. Это всегда сложнее, и иногда весьма рискованно, чем применение стандартных функций VB. 42. Функции UCase$ и LCase$ позволяют вам осушествлять сравнения вне зависимости от регистра текста, но нижеследующие функции API гораздо быстрее: Visual Basic Declare Function CharLower Lib "user32" _ Alias "CharLowerA" (ByVal lpsz As String) As String Declare Function CharUpper Lib "user32" _ Alias "CharUpperA" (ByVal lpsz As String) As String SelectedEmployee.NextOfKin.HomeInformati on.Address. Вместо того, чтобы обращаться к этому длинному выражению несколько раз, используйте: Visual Basic Dim addr As AddressInfo Set addr = SelectedEmployee.NextOfKin.HomeInformation.Address addr.Street = txtStreet.Text addr.City = txtCity.Text addr.State = txtState.Text addr.Phone = txtPhone.Text Visual Basic With SelectedEmployee.NextOfKin.HomeInformation.Address .Street = txtStreet.Text .City = txtCity.Text .State = txtState.Text .Phone = txtPhone.Text End With 45. Для вычисления степеней используйте оператор "*" вместо "^". Например, A = B * B быстрее, чем A = B ^ 2. 46. Если вам нужно сформировать длинную строку, формируйте ее по частям, и затем собира йте все части воедино. Например, у вас есть процедуры AddText1, AddText2, и т.д., которые добавляют текст к переменной типа String. Тогда этот код: Visual Basic Dim txt As String txt = AddText1(txt) txt = AddText2(txt) txt = AddText3(txt) Visual Basic Dim txt As String Dim txt1 As String Dim txt2 As String Dim txt3 As String AddText1(txt1) AddText2(txt2) AddText3(txt3) txt = txt1 & txt2 & txt3 47. Запоминайте промежуточные результаты математических вычислений. Например, этот код: Visual Basic Xsquare = x * x Ysquare = y * y a = 2 * Xsquare + 3 * Ysquare b = 3 * Xsquare + 5 * Ysquare If a + b > 50 Then ... Visual Basic If 2 * x * x + 3 * y * y + _ 3 * x * x + 5 * y * y > 50 _ Then ... Например, этот код: Visual Basic i = 1 Do While i Visual Basic i_max = SlowFunction() i = 1 Do While i Visual Basic For i = 1 To SlowFunction() total = total + i Next i
9
|
|
| 08.01.2015, 17:13 | |
|
Ответы с готовыми решениями:
25
Как заставить функцию работать быстрее? Оцените, будьте так любезны! Как заставить игры работать чуточку быстрее на таком компьютере? Можно ли заставить ЖД работать быстрее? |
|
Супер-модератор
|
|||||||||||||||||||||
| 08.01.2015, 17:40 | |||||||||||||||||||||
|
Нда... Хотел сам такую статью написать, но "заболтал"...
Что же касается приведенных выше советов, то некоторые из них вполне тривиальны (особенно прикольно выглядит совет №4). Есть и небесспорные (например, нумеруя строки как в старых версиях Бэйсика, вы получаете возможность в обработчике ошибок использовать функцию ERL - номер ошибочной строки). Ну, и есть, что добавить. 49. Не используйте variant-переменные, как параметры циклов. Вообще быстрее всего использовать для параметров циклов тип long (совет для новичков); 50. Если алгоритм требует наращивания строки, велик соблазн написать так:
52. Правило "бутылочного горлышка" - основное "торможение" любой программы вызывает одно-два узких места. Из нужно найти и ускорить. Оптимизировать остальной код большого смысла не имеет. 53. Чистка циклов
5
|
|||||||||||||||||||||
|
|
|
| 09.01.2015, 08:15 | |
|
Как ни странно, но нет одного действенного совета, который реально увеличивает скорость работы скомпилированной программы - настройка компилятора! Если убрать все лишние проверки в отлаженной программе, то она работает гораздо шустрее
4
|
|
|
Модератор
|
||||||||||||||||||||
| 11.01.2015, 13:43 | ||||||||||||||||||||
|
6
|
||||||||||||||||||||
|
Модератор
|
|||||||||||
| 11.01.2015, 15:53 | |||||||||||
|
Немного от себя.
Для ускорения вызова API функций нужно использовать библиотеки типов, после этого функции добавляются в таблицу импорта. Для ускорения вызовов методов COM объектов, также следует использовать библиотеки типов, если конечно это возможно, и вообще всегда стараться выполнять раннее связывание вместо использования позднего связывания. Используйте числа с фиксированной запятой для ускорения вычисления каких либо значений:
Для ускорения некоторых расчетов можно воспользоваться свойствами компилятора, например чтобы использовать арифметику без ошибки - переполнений:
Функция MakeTrue вообще не попадет в EXE, если она объявлена в обычном модуле. Пример: IDEOptimize.rar Для того, чтобы ускорить вызов функций, нужно объявлять их в стандартном модуле. Если объявлять их в других модулях, то они превращаются в методы объектов и дополнительно передается 2 параметра, а также после каждого вызова идет проверка возвращаемого значения, что дополнительно требует времени. Пример: CallOptimize.rar PS. Позже еще напишу.
4
|
|||||||||||
|
Модератор
|
|||
| 11.01.2015, 21:49 | |||
|
3
|
|||
|
Модератор
|
||||||
| 11.01.2015, 22:13 | ||||||
|
Для копирования данных от 1 до 8 байт используйте функции GetMem и PutMem, которые намного быстрее чем RtlMoveMemory (CopyMemory). Также, к примеру, передавая в качестве значения параметра этих функций элемент массива (как обычно делают), это вызывает блокировку и разблокировку (__vbaAryLock, __vbaAryUnlock) массива каждый раз при вызове функции что требует дополнительного времени. Быстрее будет если передавать указатель на элемент полученный через VarPtr:
3
|
||||||
|
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
|
||
| 12.01.2015, 14:45 | ||
В примере абсольтно одинаковые циклы. До начала цикла задаётся значение i. видимо где-то до Loop идёт наращивание. Какое отношение ко времени работы цикла имеет переменная i_max вычисляемая до цикла?
0
|
||
|
|
||||||||||||
| 20.03.2016, 11:05 [ТС] | ||||||||||||
b(i) = b(i) \ 2Если же результат записывается в переменную с плавающей запятой, то операция умножения будет быстрее операции деления:
1
|
||||||||||||
|
Модератор
|
|||
| 20.03.2016, 11:37 | |||
|
1
|
|||
|
|
|
| 23.04.2016, 19:39 [ТС] | |
|
The trick, можно для тебя, как спеца в этих штуках, оставить такие задачки ?
Что быстрее: 1) Exit For или Exit Sub (Function), если подразумевается, что после выхода из цикла подпрограмма завершается. 2) Операция "var > 0" или операция "var <> 0" 3) GetMem4 ByVal VarPtr(bData(0)), ByVal VarPtr(lData) или lData = bData(0) + bData(1) * 256&
0
|
|
|
|
||||||
| 14.05.2017, 18:10 [ТС] | ||||||
|
Что будет быстрее для разбиения числа (в идеале нужно Currency) на байты (тип byte) - GetMem1 либо побитовый "И" ?
Но, можно ли написать (способна ли) ассемблерную вставку с использованием одной инструкции с оператором "И", которая работала бы быстрее GetMem1 ? Добавлено через 4 минуты В принципе тут разница только в том, что для GetMem1 затраты уйдут на (по примеру выше): - получить адрес, +3, скопировать участок памяти. - вариант с ASM наверное будет ещё сложнее. Так что вопрос, наверное, отпал сам собой.
0
|
||||||
|
Модератор
|
|
| 14.05.2017, 20:12 | |
|
Dragokas, быстрее всего будет GetMem8 в 8-ми байтовый массив, и потом уже обращаться к нужным байтам.
2
|
|
| 14.05.2017, 20:12 | |
|
Помогаю со студенческими работами здесь
20
Как заставить программу работать с консолью? Как заставить программу работать постоянно? Как заставить эту программу работать в VC++ форм Как заставить программу работать через прокси? Как заставить программу работать без остановки? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|