Як змусити Вашу програму на VB працювати швидше?

Рут Глушкін, VBStreets

Перш за все змусьте програму працювати, а потім турбуйтеся про її швидкодії.

Існує безліч способів прискорення вашої VB програми. На жаль, більшість з них не призводять до особливо вражаючих результатів. Навіть якщо ваша програма працює з величезними колекціями, перетворення їх в масиви, можливо, врятує вас якийсь відсоток або два в процесі виконання програми. З іншого боку, переписування основних алгоритмів програми може скоротити процес виконання в сотні разів.

Нижче наводяться кілька способів, за допомогою яких ви можете набагато поліпшити ефективність вашої програми.

1. Виробляючи арифметичні операції, оперуйте цілими числами і використовуйте цілочисельні оператори, де це можливо. Використовуйте оператор "\" – цілочисельного ділення замість "/" – ділення з плаваючою крапкою. Використовуйте "* .5" замість "/ 2", оскільки команда асемблера "MUL" швидше, ніж "FDIV".

2. Де тільки це можливо, не застосовуйте квадратні корені, наприклад:
If a * a + b * b = 4 Then …
набагато швидше, ніж
If Sqr(a * a + b * b) = 2 Then …

3. Якщо Вам необхідно виробляти повторювані обчислення як можна швидше, найбільш ефективно створити таблицю значень функції, і не складно замінити вихідні дані на відповідні результати з цієї таблиці. Наприклад, якщо заздалегідь вказати в таблиці x і y як координати кожної точки на колі на відстані 1-2 градуси, це буде досить точно і набагато швидше, ніж обчислювати їх значення, використовуючи функції SIN, COS і TAN.

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. Тобто:
If Len (my_string) = 0 Then … набагато швидше, ніж:
If my_string = "" Then


18.
Використовуйте With для довгих послідовностей вказівок властивостей об'єктів, повторюваних кілька разів. Це виконується швидше, ніж якщо ви повторіть серії об'єктів у кожній окремій команді.

19. Застосовуйте якомога менше операцій з змінними типу String, ці операції повільні.

20. Упорядкуйте команди всередині Select Case таким чином, щоб найбільш часто зустрічаються значення були спочатку.

21.
Відчувається швидкодію набагато важливіше фактичного. Уявіть собі, що ви натиснули на кнопку, і протягом 10 секунд нічого не відбувається. Ці 10 секунд здадуться вам годиною. Додайте ProgressBar, і тоді користувач навіть не помітить, що пройшло 10 секунд.

22. Коли у вас у програмі безліч динамічно мінливих картинок, помістіть їх усі в невидимі Images на першу завантажувану форму, а потім завантажуйте їх у міру необхідності. Ніколи не працюйте з файлами. Рядок
Form2.Image1.Picture = LoadPicture("yourfile.bmp")
виконується в десятки разів повільніше, ніж
Form2.Image1.Picture = Form1.Image1.Picture

23. Якщо вам потрібно робити безліч операцій з файлами або зі змінними типу String, завжди додавайте знак $ після імені команди, наприклад, Mid $ замість Mid, тому що Mid працює з параметрами типу Variant, в той час, як Mid $ працює з параметрами типу String, що в 3 рази швидше.

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, використовуйте:
Line (x1, y1)-(x2, y2), , B

33. Замість PictureBoxes застосовуйте, де це можливо, Images, оскільки Image вимагає набагато менше пам'яті.

34. Використовуйте 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 набагато швидше:

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

43. Використовуйте тимчасові змінні для багаторазового звернення до складних виразів. Наприклад, вам потрібно присвоїти різні значення об'єкту
SelectedEmployee.NextOfKin.HomeInformation.Address. Замість того, щоб звертатися до цього довгого висловом кілька разів, використовуйте:

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

Команда With дає таке ж прискорення, тому ви можете використовувати:

With SelectedEmployee.NextOfKin.HomeInformation.Address
.Street = txtStreet.Text
.City = txtCity.Text
.State = txtState.Text
.Phone = txtPhone.Text
End With

44. При виклику процедури або функції, де це можливо, передавайте параметри ByRef, а не ByVal. Коли ви використовуєте ByRef, програма передає тільки невеликий адресу змінної. Коли ж ви використовуєте ByVal, програма повинна створити нову копію переданої змінної. Зазвичай набагато швидше передати адресу, ніж створити копію змінної. Однак, коли ви формуєте виклик функцій, що відносяться до різних процесів, ByVal виконується швидше. При такому виклику, VB повинен у будь-якому випадку запакувати значення змінної для передачі її іншому процесу. Якщо ви використовуєте ByRef, VB має потім розпакувати результат, і це забирає більше часу.

45. Для обчислення ступенів використовуйте оператор "*" замість "^".
Наприклад, A = B * B швидше, ніж A = B ^ 2.

46. Якщо вам потрібно сформувати довгий рядок, формуйте її по частинах, і потім збираються йте всі частини воєдино. Наприклад, у вас є процедури AddText1, AddText2, і т.д., які додають текст до змінної типу String.
Тоді цей код:

Dim txt As String
txt = AddText1(txt)
txt = AddText2(txt)
txt = AddText3(txt)

буде виконуватися повільніше, ніж наступний:

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

У першому прикладі, процедури AddText повинні маніпулювати довгими рядками. У другому прикладі вони працюють з відносно короткими рядками.

47. Запам'ятовуйте проміжні результати математичних обчислень.
Наприклад, цей код:

Xsquare = x * x
Ysquare = y * y
a = 2 * Xsquare + 3 * Ysquare
b = 3 * Xsquare + 5 * Ysquare
If a + b > 50 Then …

виконується швидше, ніж наступний:

If 2 * x * x + 3 * y * y + _
3 * x * x + 5 * y * y > 50 _
Then …

48. Не вставляйте в цикл перевірку із значенням, що повертається функцією.
Наприклад, цей код:

i = 1
Do While i <= SlowFunction()
total = total + i
Loop

виконується значно повільніше, ніж цей:

i_max = SlowFunction()
i = 1
Do While i <= i_max
total = total + i
Loop

Примітка: цикл For не перераховує свої кордони кожного разу. Коли цикл For починається, система визначає граничні значення і запам'ятовує їх. Вона не буде перераховувати їх кожен виток циклу. Отже, нижченаведений код виконується досить швидко:

For i = 1 To SlowFunction()
total = total + i
Next i

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*