Inżynieria oprogramowania Optymalizacja czasowa programów

Transkrypt

Inżynieria oprogramowania Optymalizacja czasowa programów
Inżynieria oprogramowania
Optymalizacja czasowa programów – ćw. laboratoryjne nr 4
Należy przygotować zestaw testów, pozwalający przeanalizować co najmniej pięć metod optymalizacji czasowej kodu,
w tym dwie dotyczące pętli. Ponadto należy przygotować dwa testy sprawdzające wydajność operacji wejścia/wyjścia:
do pliku tekstowego oraz na konsolę. Łącznie przeprowadzonych testów powinno być więc siedem dla każdego języka.
Jako pojedynczy test rozumiemy przeprowadzenie pomiaru kodu przed optymalizacją i po optymalizacji celem
porównania wyników.
Testy należy przygotować tak, aby zminimalizować wpływ czynników dodatkowych, takich jak działanie maszyny
wirtualnej, systemu operacyjnego, innych programów i elementów kodu nie związanych z prowadzonymi pomiarami.
Pomiary należy wykonać wielokrotnie. Rozmiar danych należy dostosować tak, aby różnice czasu wykonania były
czytelne, ale jednocześnie przeprowadzanie testów nie było uciążliwe.
Zestaw testów należy przygotować w językach:
C, PHP i C# (łącznie 21 testów)
•
Testy w PHP można wykonywać na maszynach wirtualnych za pomocą programu server2go, lub innego podobnego. W
wynikach należy zaznaczyć, czy testy w C i C# były wykonywane na maszynie wirtualnej, czy fizycznym komputerze.
PHP można zastąpić językiem Javascript, uwzględniając jego ograniczenia.
Narzędzia do pomiaru czasu należy przygotować we własnym zakresie, korzystając ze źródeł w internecie. Pomiar
czasu należy przetestować (np. za pomocą zwykłego stopera)!
W sprawozdaniu powinny się znajdować kody źródłowe programów, odpowiednio przedstawione wyniki pomiarów
(podstawowe wskaźniki statystyczne, wykresy) oraz wnioski.
Sprawozdanie sporządzone w systemie LaTeX (nazwiska autorów na stronie tytułowej!) należy wysłać na adres:
[email protected] z tytułem „IO cw nr 4” w formacie PDF plus źródła tex, całość spakowana w formacie ZIP!
Załącznik:
Lista przykładowych metod optymalizacji czasowej wraz z kodami w pseudokodzie:
Zmniejszanie siły operacji
w:=a^3;
w:=a*a*a;
w:=2*b;
w:=b+b;
Usuwanie
x :=
w :=
u :=
p1
p2
x
w
u
wyrażeń nadmiarowych
sqrt(z) / sin(y) + 16;
sqrt(z);
fn( sqrt(z) / sin(y) );
w
pom
x
u
:=
:=
:=
:=
:=
:=
:=
:=
:=
sqrt(z);
p1 / sin (y);
p2 + 16;
p1;
fn( p2 );
sqrt(z);
w / sin (y);
pom + 16;
fn( pom );
Usuwanie wyrażeń niezmienniczych
for i:= 1 to 100 do
t[i] := sin(y)*t[i];
pom := sin(y);
for i:= 1 to 100 do
t[i] := pom*t[i];
Rozszczepianie
for i:= 1 to nmax do
if dodawanie=true then
a := a + n
else
a := a - n;
if dodawanie=true then
for i:= 1 to nmax do
a := a + n
else
for i:= 1 to nmax do
a := a - n;
Rozwijanie pętli
i:=0;
while (i < 300) do
begin
a[i] := 0;
a[i+1] := 0;
a[i+2] := 0;
i := i + 3;
end;
Łączenie pętli
for i := 1 to 100 do
t[i]:=0;
for i := 1 to 100 do
w[i]:=0;
for i := 1 to 100 do
begin
t[i]:=0;
w[i]:=0;
end;
Reorganizacja pętli
for i := 1 to 100 do {start 1 raz}
for j := 1 to 20 do {start 100 razy}
for z := 1 to 5 do {start 2000 razy}
t[i,j,z]:=0;
{zamknięcie 10000 razy}
{zamkniecie dla j 2000 razy}
{zamkniecie dla i 100 razy}
for z := 1 to 5 do {start 1 raz}
for j := 1 to 20 do {start 5 razy}
for i := 1 to 100 do {start 100 razy}
t[i,j,z]:=0;
{zamknięcie 10000 razy}
{zamkniecie dla j 100 razy}
{zamkniecie dla z 5 razy}
Optymalizacja instrukcji warunkowych
if x = 1 then p1;
if x = 2 then p2;
if x = 2 then p3;
if x = 1 then p1
else
if x = 2 then p2
else
if x = 2 then p3;
Odwołania do elementów tablic
x := t[i] + t[i] + t[i];
for i:= 1 to 100 do
t[i] := w[ k + 2*j ];
pi := t[i]; x := pi + pi + pi;
wp := w[ k + 2*j ];
for i:= 1 to 100 do
t[i] := wp;