Правило 11.
Правило 10.
Желательно избегать использования смешанной арифметики, так как преобразование типа переменной иногда занимает больше времени, чем сама операция вычисления.
Правило 9.
Необходимо учитывать различие в скорости выполнения операций по отношению к различным типам данных для разных ЭВМ (целые, вещественные и комплексные, с обычной и двойной точностью и т.д.).
Правило 8.
Экономии времени на операциях присваивания можно
Правило 7.
Для экономии времени выполнения вычислительных операций необходимо в арифметических выражениях выделять множители.
Правило 6.
При программировании вычислительных операций необходимо учитывать время их выполнения и использовать более быстрые.
Правило 5.
Оптимизация вычислительных операций
Основные арифметические операции располагаются в порядке возрастания времени выполнения следующим образом: (+,-), (*), (/), (**).
|
|
Это следует учитывать и использовать более быстрые операции. Из вышесказанного следует, что операция 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;
При использовании смешанной арифметики, т.е. выполнение в одном выражении операций с разными типами данных, происходит преобразование типов к наиболее сложному типу. Эти преобразования
также требуют времени на выполнение, поэтому желательно их избегать.
Лучше там, где это возможно, уменьшать число обращений к стандартным функциям путем эквивалентных алгебраических преобразований.
Например, конструкцию
if (SQRT(X ** 2 +Y ** 2) < R then
целесообразно заменить на
if ((X * X +Y * Y) < R * R) then,
конструкцию
a:=ln(x)+ln(y);
на
a:=ln(x*y);,
а конструкцию
a:=sqr(i); - на a:=i*i; a a:=sqrt(i)*sqrt(j) на a:=sqrt(i*j).
Если это возможно, следует путем равносильных математических преобразований упрощать вычисляемые выражения
1) w1:=exp(sin(i/j*pi/20)+ w1:=abs(sin(i*
cos(pi*(0.5+i/j/20))+ pi/6))+1;
ln(sqrt(sin(i*pi/6)*
*sin(i*pi/6))+1));
2) a:=sin(b*c)*sin(b*c); a:=sqr(sin(b*c));
В данном случае поисходит уменьшение времени вычисления, т.к. значение
sin(b*c) вычисляется один раз вместо двух, а затем возводится в квадрат с помощью стандартной функции языка.
Для уменьшения временных затрат на вычисление адресов элементов массивов следует отдавать предпочтение скалярным переменным.
Например
for i:=1 to 5 do for i:=1 to 5 do
|
|
for j:=1 to 5 do begin for j:=1 to 5 do begin
s[i,j]:=0; t:=0;
for k:=1 to 100 do for k:=1 to 100 do
s[i,j]:=s[i,j]+ t:=t+a[i,j,k];
a[i,j,k]; s[i,j]:=t;
end; end;
Таким образон можно выделить следующие процедуры oптимизации
вычислительных oпeраций:
- исключение смешанной арифметики;
- удаление лишних операторов присваивания:
- замена деления и возведения в степень умножением:
- гриппировка переменник одного чипа:
- уменьшение числа обращений к функциям:
- уменьшение числа обращений к элементам массивов.