Рассмотрим приведенный ниже код. Предполагается, что этот код обрабатывает данные с фиксированной скоростью, за одну секунду, он является частью общей системы и не может занимать слишком много времени.
При выполнении более 100 лотов данных объемом 1 секунда программа занимает 35 секунд (или 35%), выполняя эту функцию в цикле. Цикл тестирования рассчитан специально с Ada.RealTime. Данные предварительно генерируются, поэтому большая часть времени выполнения определенно находится в этом цикле.
Как мне улучшить код, чтобы сократить время обработки до минимума?
Код будет работать на Intel Pentium-M, который представляет собой P3 с SSE2.
package FF is new Ada.Numerics.Generic_Elementary_Functions(Float);
N : constant Integer := 820;
type A is array(1 .. N) of Float;
type A3 is array(1 .. 3) of A;
procedure F(state : in out A3;
result : out A3;
l : in A;
r : in A) is
s : Float;
t : Float;
begin
for i in 1 .. N loop
t := l(i) + r(i);
t := t / 2.0;
state(1)(i) := t;
state(2)(i) := t * 0.25 + state(2)(i) * 0.75;
state(3)(i) := t * 1.0 /64.0 + state(2)(i) * 63.0 /64.0;
for r in 1 .. 3 loop
s := state(r)(i);
t := FF."**"(s, 6.0) + 14.0;
if t > MAX then
t := MAX;
elsif t < MIN then
t := MIN;
end if;
result(r)(i) := FF.Log(t, 2.0);
end loop;
end loop;
end;
psuedocode для тестирования
create two arrays of 80 random A3 arrays, called ls and rs;
init the state and result A3 array
record the realtime time now, called last
for i in 1 .. 100 loop
for j in 1 .. 80 loop
F(state, result, ls(j), rs(j));
end loop;
end loop;
record the realtime time now, called curr
output the duration between curr and last