Optymalizacja programuAby Twoje programy działały naprawdę szybko, powinienneś stosować pewne zasady, które pozwolą Ci robić to samo, ale szybciej. Zobacz kilka konkretnych przykładów jak możesz zoptymalizować swoje kody źródłowe. Uwaga, podane zasady dotyczą również innych języków programowania, np. C++. Niektóre z nich pozwalają efektywniej programować w php i java script. WarunkiZastosowanie standardowe | Oprogramowane optymalnie | Opis |
i:= 1; …
if (i = 1) then i:=2 else i:=1; |
i:= 1; …
i := 3 – i; |
Zamiast stosować warunek, może wystarczy odpowiednie działanie matematyczne | i:= i + 1; if (i>=10) then i:= 0; | i:= (i + 1) mod 10; |
To raczej przykład skrótu zapisu. Warto wykorzystywać resztę z dzielenia do niektórych obliczeń |
if (s = 'napis') and (i = 0) then |
if (i=0) and (s = 'napis') |
Na początku warunku korzystaj z takich wyrażeń, których sprawdzenie jest szybsze. Gdy i będzie inne niż 0, możesz zaoszczędzić czas. Szczególnie ważne przy korzystaniu z czasochłonnych funkcji |
if b = true then | if b then | Jeśli b jest boolean, po co go jeszcze porównywać z true? |
if b = true then a:= 10 else a:=0; |
a:= integer(b) * 10; | Rzutowanie wartości true na integer daje 1, gdy false 0, jak pomnożysz, otrzymasz wynik bez warunku |
Procedury i funkcjeZastosowanie standardowe | Oprogramowane optymalnie | Opis |
procedure nazwa(s : string); | procedure nazwa(const s : string);
lub procedure nazwa(var s : string); |
Zamiast 256 bajtów napisu kopiowanych do procedury, zostanie przesłane tylko 4 bajty -adres napisu w pamięci (zastosowanie daje pewne ograniczenia -tylko do odczytu, lub do zapisu na oryginale) |
a:= funkcja(b); c:= funkcja(b) * 4; |
a:= funkcja(b);
c:= a * 4; |
Jeśli to tylko możliwe, nie wywołuj wiele razy tej samej funkcji. Zapamiętaj jej wartość i korzystaj z zapamiętanej kopii |
Pętle
Zastosowanie standardowe |
Oprogramowane optymalnie |
Opis |
for i:=1 to x*y do |
Ilosc:= x * y;
for i:=1 to Ilosc do |
Jeśli możesz zrobić coś przed pętlą, zrób to. W pętli używaj tego co naprawdę trzeba |
A:= 10;
for i:=1 to 100 do
begin
x := 4 *a;
b := x * i;
end; |
A:=10;
x:= 4*a;
for i := 1 to 100 do
begin
b:= x*i;
end; |
Repeat
zrob_cos;
until keypressed; | Repeat
if naprawde_trzeba then zrob_cos;
until keypressed; |
Operacje matematyczne
Zastosowanie standardowe | Oprogramowane optymalnie | Opis | i:= i + 1; | Inc(i); | W assemblerze Inc jest szybsze niż Add, stąd przy naprawdę dużym obciążeniu Inc zajmie mniej taktów procesora | a := b div 2; | a := b shr 1; w c++
a = b >> 1; | Dzielenie liczb całkowitych przez potęgi dwójki, można zapisać przesunięciem bitowym. Jest znacznie szybsze. | a := y * 640 + x; | a := (y shl 7) + (y shl 9) + x; | Inaczej y * 512 + y * 128 + x to to samo co y * 640 + x, jednak znacznie szybsze. Stosowane przy tworzeniu szybkich operacji graficznych | R: Real; | {$N+} R : Single; |
{$N+} Dotyczy pascala. Użycie dyrektywy {$N+} i stosowanie single zamiast real pozwala na wykonywanie szybszych operacji zmiennoprzecinkowych |
Optymalizacja programuZastosowanie standardowe | Oprogramowane optymalnie | Opis |
SELECT * FROM tabela | SELECT pole1, pole2 FROM tabela | MySQL: Jeśli nie potrzebujesz wszystkich danych, to po co je przesyłać? To może znacznie przyspieszyć | a = 9.81 * t * t / 2; a2 = 9.81 * t2 * t2 / 2; | const g = 9.81;
… function get_a(t : single) : single; begin
get_a := g * sqr(t) / 2; end;
a := get_a(t); a2 := get_a(t2); | Stosuj stałe. Nigdy nie wpisuj w kodzie 2 razy tych samych wyliczeń. Praktyka pokazuje, że później będziesz poprawiał kilka miejsc zamiast jednego. Pisz procedury i funkcje. |
|