Page 57 - 4761
P. 57
Способи оптимізації
Розрізняють дві категорії оптимізуючих перетворень: перетворення вихідної
програми в її внутрішній формі, яка не залежить від об'єктного коду (машинно-незалежні)
і перетворення, які здійснюються на рівні об'єктної програми (машинно-орієнтовані).
На практиці використовують досить широкий набір машинно-незалежних
оптимізуючих перетворень. До них відносяться:
1. Розвантаження ділянок, що повторюються.
2. Спрощення дій.
3. Реалізація дій.
4. Чистка програми.
5. Економія пам'яті.
6. Скорочення програми.
Розвантаження ділянок, що повторюються.
Таку назву отримав спосіб оптимізації, що складається у винесенні обчислень з
багаторазово виконуваних ділянок програми на ділянки програми, рідко прохідні.
До цього виду перетворень відносяться різні чистки зон, тіл циклів і тіл
рекурсивних процедур, коли інваріантні (за результатом виконання) у відповідних
ділянках повторення вирази, лінійні компоненти виносяться з них і розміщуються перед
входом до ділянки, яка повторюється - чистка вгору, або коли знищують свої попередні
результати лінійні компоненти або групи лінійних компонент, ділянки повторюваності
виносяться з нього і розміщаються за межами ділянки повторюваності - чистка вниз.
Зазвичай виносяться тільки такі вирази і лінійні фрагменти програми, які
обов'язково виконуються при кожному проходженні ділянки повторюваності.
Скорочення глибини операції.
Скорочення глибини операції - процедура виносу за межі циклу операторів,
аргументи яких є функціями рекурсивних змінних, і заміна їх всередині циклу простими
рекурсивними операторами присвоювання, аргументи яких не залежить від інших
змінних.
Сенс цієї операції в тому, що вона дозволяє виносити з циклу навіть ті оператори,
операнди яких залежать від керуючої змінної циклу. На відміну від зсуву інваріантних
операторів при скороченні глибини операцій, оператори зсуву заміняють більш простими
і швидше виконуваними операторами
Видалення індуктивних змінних і виразів.
Ряд перетворень цього типу пов'язаний з так званими індуктивними обчисленнями
в ділянці повторюваності програми. Такими перетвореннями є видалення індуктивних
змінних, яке означає заміну кількох індуктивних змінних циклу однією індуктивною
змінною, а також видалення індуктивних виразів з циклу.
Заміна складних операцій на більш прості.
Дуже важливим перетворенням з цієї групи є заміна в індуктивних обчисленнях
складних операцій на більш прості. Наприклад, зведення до степеня або ділення
замінюється множенням (наприклад, вираз Х / 4 можна замінюється на вираз Х * О.25), а
множення – додаванням.
Заміна складних операцій на більш прості не завжди призводить до оптимізації,
насправді це може навіть призвести до сповільнення, наприклад для програм з циклами,
що складаються з декількох частин.
Виключення надлишкових виразів.
До групи перетворень щодо спрощення дій входять виключення надлишкових
(зайвих) виразів. Воно полягає в знаходженні і видаленні з об’єктного коду операцій, які
повторно обробляють одні і ті ж операнди.
55