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;