Правило 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;
Необходимо учитывать различие в скорости выполнения операций по отношению к различным типам данных для разных ЭВМ (целые, вещественные и комплексные, с обычной и двойной точностью и т.д.).