Оптимізація коду у Visual Basic
Малобюджетні сайти.
Просування веб-сайту.
Оптимізація коду у Visual Basic
Якщо Ви не пишите програми для обробки складної графіки, то Ваш код навряд чи колись відчував обмеження швидкості виконання. Але трапляються випадки, коли кожна, навіть незначна, затримка може сильно вплинути на швидкість роботи Вашого коду. Насамперед це стосується функцій, які часто викликаються у Вашій програмі, та ще й "упаковані" у великий цикл. Існує кілька принципів оптимізації коду Visual Basic, які ми сьогодні розглянемо.
Для початку я хотів би зробити застереження, що все про що Ви тут прочитаєте не є тільки моїми "думками". Всі основні принципи оптимізації VB коду давно відомі та докладно описані в товстих посібниках до програмних продуктів Microsoft, але я б хотів розповісти Вам про те ж, але, як би, з позиції практики і українською (зрозумілішою для Вас) мовою.
Загальні принципи оптимізації
Компанія Microsoft рекомендує використовувати у своїх програмах такі основні принципи, які допомагають (на їхню думку) отримати швидший код:
- Уникайте використання змінних типу Variant
- Використовуйте цілі змінні Long і цілу математику
- Кешуйте часто використовувані властивості в змінних
- Використовуйте змінні рівня модуля замість змінних Static
- Замініть виклик процедури лінійним кодуванням
- Використовуйте константи, коли це можливо
- Передавайте в процедури параметри ByVal замість ByRef
- Використання оголошених необов'язкових параметрів
- Скористайтеся перевагою колекцій
Ну що? Давайте розглянемо всі ці принципи чи правила з погляду практичного використання. Для цього я використовуватиму найточніший метод оцінки практичної цінності цих принципів - виміри продуктивності. Отже для роботи нам будуть потрібні: кілька процедур, які допоможуть вимірювати швидкість виконання тієї чи іншої операції, дві голови (моя та Ваша), чотири руки. жарт. Тепер серйозно, я вимірятиму продуктивність операції за допомогою функції timeGetTime з мультимедіа бібліотеки winmm.dll, що входить до складу WinAPI, так вважаю її найбільш точною та легкою у використанні. Все це "упаковано" в окремий модуль, я ним завжди користуюся і раджу Вам. Процедури вимірювання продуктивності мають вигляд:
'запускає таймер для вимірювання Public Sub ProfileStart(lStart As Long) lStart = timeGetTime End Sub
'вимірює час виконання операції Public Sub ProfileStop(lStart As Long, lLenth As Long) lLenth = timeGetTime - lStart End Sub
Всі виміри я робитиму комп'ютері: Celeron 333 з системою Windows 98. Я хотів було провести тестування і в Windows 2000, але прогнавши кілька тестів вкотре переконався, що це з практичного погляду марно. Справа в тому, що реалізація багатозадачності в цій системі дозволяє її легко переривати будь-яке завдання для "профілактичних" та інших робіт, а також для потреб інших процесів, тому Ви можете отримати для однієї і тієї ж операції результати, що відрізняються один від одного в кілька разів. Загалом, це мало сенсу.
Змінні різних типів
Тепер давайте приступимо безпосередньо до тестування. Напишемо процедуру, в якій вимірюватимемо продуктивність. Загалом, ми будемо займатися нісенітницею,додавати та віднімати одиницю в циклі for.
For i = 1 To 100000 iType = iType + 1 iType = iType - 1 Next i
Для тестування різних типів змінних усі змінні (крім лічильника циклу), що використовуються в циклі, зробимо однакового типу, а саме того типу, продуктивність якого будемо досліджувати. Після закінчення кожного циклу ми виводитимемо результати в окремому вікні. Кому цікавий повний код цієї процедури – дивіться приклад до статті. Отже, подивимося на результати: