Z książek mogę ci polecić:
- Algorytmy + struktury danych = programy - Niklaus Wirth
- Algorytmy i struktury danych - A.V. Aho, J.E.Hopcroft, J.D.Ullman
- Projektowanie i analiza algorytmów - A.V. Aho, J.E.Hopcroft, J.D.Ullman
- Algorytmy (struktury danych i techniki programowania) - Piotr Wróblewski.
Tewux jestem pod wrażeniem. Ja przeczytałem tylko jedną książke (Podstawy pascala, czy jakoś tak). Ale nie jestem zawodowym programistą, tylko amatorem próbującym samemu coś napisać. W każdym razie, nie o tym chciałem tu ględzić..
Swego czasu pisałem program który szukał odpowiedniego kluczaj i wymagana była szybkość. Jak się okazało pętle bardzo spowalniają dany algorytm, jeśli chcesz naprawdę szybkiej procedury wywal wszystkie pętle!!!
Tak wiem program będzie naprawdę duży, ale da to niesamowite przyśpieszenie. Moja aplikacja po optymalizacji liczyła 220 tys kluczy na sekundę. - prawie tyle samo co napisana w c++. Na początku było to jakieś 15 tys na sekunde.
Może podam jakiś przykład:
Przed optymalizacją:
for lf := 6 downto 4 do begin
dd[(lf+2) and $03] := dd[(lf+2) and $03] xor dd[(lf+1) and $03];
dt := (swpdd((lf+1) and $03) + dd[(lf and $03)]) and $ff;
dd[lf and $03] := t2[dt];
end ;
for lf := 3 downto 1 do begin
dd[(lf+2) and $03] := dd[(lf+2) and $03] xor dd[(lf+1) and $03];
dt := (swpdd((lf+1) and $03) + dd[(lf and $03)]) and $ff;
dd[lf and $03] := T1[dt]
end;
Po optymalizacji:
ddd[0] := dd[0] xor dd[3];
dt := ((dd[3] AND $F) SHL 4);
dt := dt OR (dd[3] SHR 4) ;
dt := (dt + dd[2])and $ff;
dd[2] := t2[dt] ;
dd[3] := dd[3] xor dd[2];
dt := ((dd[2] AND $F) SHL 4);
dt := dt OR (dd[2] SHR 4);
dt := (dt + dd[1])and $ff;
dd[1] := t2[dt] ;
dd[2] := dd[2] xor dd[1];
dt := ((dd[1] AND $F) SHL 4);
dt := dt OR (dd[1] SHR 4);
dt := (dt + dd[0])and $ff;
dd[0] := t2[dt] ;
//=============================================
dd[1] := dd[1] xor dd[0];
dt := ((dd[0] AND $F) SHL 4);
dt := dt OR (dd[0] SHR 4) ;
dt := (dt + dd[3])and $ff;
dd[3] := t1[dt] ;
dd[0] := dd[0] xor dd[3];
dt := ((dd[3] AND $F) SHL 4);
dt := dt OR (dd[3] SHR 4);
dt := (dt + dd[2])and $ff;
dd[2] := t1[dt] ;
dd[3] := dd[3] xor dd[2];
dt := ((dd[2] AND $F) SHL 4);
dt := dt OR (dd[2] SHR 4);
dt := (dt + dd[1])and $ff;
dd[1] := t1[dt] ;
Nie pamiętam dokładnie, ale takie proste pozbycie się pętli za każdym razem dodaje nam przyśpieszenie, czasami więcej, a czasami mniej.
Może prostszy przykład:
zamiast:
for c := 1 to 8 do tempu[c] := drec[c];
zrobimy sobie:
tempu[1] := drec[1];
tempu[2] := drec[2];
tempu[3] := drec[3];
tempu[4] := drec[4];
tempu[5] := drec[5];
tempu[6] := drec[6];
tempu[7] := drec[7];
tempu[8] := drec[8];
Taka prosta pętelka, ale gdy jest wywoływana ileś tam milionów razy, potrafi znacznie skrócić czas działania (najlepiej popatrzeć w kod asm i policzyć ile zajmuje taktów procesora)
To tyle na dziś, nie wiem czy się przyda komuś, ale uważałem za istotne o tym napisać.