Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OPI_konspekt.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
5.78 Mб
Скачать

6.5.2. Скорочення глибини операції

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

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

Наведемо приклад скорочення глибини операції стосовно оператора t4:=K*10+I з n-го блоку :

n-й блок

L:t4:=K*10+I

t5:=t6+K

z(t2):=z(t2)+x(t4)+y(t5)

K:=K+1

перехід на L

у результаті виконання цієї операції оператор t4:=K*10+I

зсувається в (n-1)-й блок, а в n-му блоці він заміняється оператором t4:=t4+10:

(n-1)-й блок

. . .

t4:=K*10+I

n-й блок

L: z(t2):=z(t2)+x(t4)+y(t5)

K:=K+1

t4:=t4+10

t5:=t6+K

перехід на L

6.5.3. Спрощення дій

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

6.5.3.1. Видалення індуктивних змінних і виразів

Ряд перетворень цього типу пов'язаний з так називаними індуктивними (чи лінійно-рекурсивними) обчисленнями в ділянці повторюваності програми, тобто тими, значення яких регулярно змінюються від повторення до повторення.) Такими перетвореннями є видалення індуктивних змінних , що означає заміну кількох індуктивних змінних циклу однієї індуктивною змінною, а також видалення індуктивних виразів з циклу

Наприклад, застосування зазначених перетворень перетворить фрагмент

for I:=1 to 99 do

begin

K:=I+J;

A[K]:= A[K]+1

end;

K:=10;

у фрагмент

I:=1;

for K:=I+J to 99+J do

begin

A[K]:= A[K]+1

end;

K:=10;

Тут I,K - індуктивні змінні. У даному випадку з циклу видалений індуктивний вираз K:=I+J.

6.5.3.2. Заміна складних операцій на більш прості

Дуже важливим перетворенням з цієї групи є зниження сили операцій, що заміняє в індуктивних обчисленнях складні операції на більш прості; наприклад, піднесення до степеня або ділення заміняється множенням ( наприклад, вираз Х/4.0 заміняється на вираз Х* О.25), а множення - додаванням

Наприклад, застосування цього перетворення дозволяє переходити від циклу

for K:=1 to 100 do

V:=(K-1)*N+I

до більш ефективно працюючого фрагмента:

V:=I;

for K:=1 to 100 do

begin

A[V]:=A[V]+1;

V:=V+N

end

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

6.5.3.3 Виключення надлишкових виразів

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

Наприклад, ця операція здійснює перехід від фрагмента

if B>0 then

begin

A:=A+2;

X:=A*B+C

end

else Y:=A*B+D;

Z:= A*B;

до фрагмента

if B>0 then

begin

A:=A+2;

W:=A*B;

X:=W+C

end

else

begin

W:=A*B;

Y:=W+D

end;

Z=W;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]