double arrow

Правило 8 Оптимизация вычислительных операций

Правило 7.

Правило 6.

Правило 5.

Оптимизация вычислительных операций

Пример 2.

Пример 1.

for i:=1 to 20 do if k=2 then

if k=2 then for i:=1 to 20 do

a[i]:=b[i]+2 a[i]:=b[i]+2

else else

a[i]:=b[i]*c[i]; for i:=1 to 20 do

a[i]:=b[i]*c[i];

В результате выполнения процедуры выноса ветвлений из цикла уменьшается время счета вследствии сокращения количества проверок выполнения условий, равного числу повторений цикла.

Вычислить значение некоторой функции, которое в зависимости от условия заносится то в один, то в другой массив. Напрашивается вопрос: а почему не вынести общий член за операторные скобки begin - end, точно так же, как в математике выносятся за скобки общие множители:

if a > b then y:= f(x); begin if a > b then Massiv1[i]:= y y:= f(x); else Massiv2[i]:= y; Massiv1[i]:= y; endelse begin y:= f(x); Massiv2[i]:= y;

end;

Исходный код стал более компактным, более понятным и меньшим по размеру. К тому же, вместо простого выражения y:=f(x) здесь может использоваться любое количество операторов. При изменении кода в первом случае нужно не забывать вносить изменения в оба места, что может привести к ошибкам.

Задание. Если проанализировать следующий фрагмент программы, окажется то, что проверка условия x < 0 в цикле вообще лишняя.

z:=0;

for i:=1 to N do

begin

x[i]:=sqr(a[i]);

y[i]:=-b[i]+x[i];

if x[i]>=0 then

z[i]:=x[i];

end

Таким образом, основными процедурами по оптимизации циклов являются:

- чистка циклов, т.е. удаление из тела цикла операций, не зависящих от переменной цикла;

- объединение циклов;

- вынос ветвлений из циклов;

- увеличение шага изменения управляющей переменной цикла;

- удаление коротких циклов;

- оптимальное вложение циклов.

При программировании вычислительных операций необходимо учитывать время их выполнения и использовать более быстрые.

Основные арифметические операции располагаются в порядке возрастания времени выполнения следующим образом: (+,-), (*), (/), (**).

Это следует учитывать и использовать более быстрые операции. Из вышесказанного следует, что операция A*A выполняется быстрее, чем A**2, а деление, как правило, гораздо медленнее умножения (почти в 5 раз). Поэтому операция A=B/(C*D*E) лучше, чем операция A=В/С/D/Е.

Для экономии времени выполнения вычислительных операций необходимо в арифметических выражениях выделять множители.

Например, выражение a:=b*(e+f)-c*(e+f)+d*(e+f); лучше использовать в виде a:=(b-c+d)*(e+f);

Экономии времени на операциях присваивания можно

добиться записью выражения без вспомогательных переменных. Например:

t1:=b+c; a:=b+c+d*e;

t2:=d*e;

a:=t1+t2;

Необходимо учитывать различие в скорости выполнения операций по отношению к различным типам данных для разных ЭВМ (целые, вещественные и комплексные, с обычной и двойной точностью и т.д.).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: