Pok-13-wyk-Slajd17

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Optymalizacja kodu(1)

Optymalizacja kodu(1)


Ulepszenia kodu źródłowego mogą być wykonywane na trzech poziomach: kodu źródłowego, reprezentacji pośredniej i kodu wynikowego.

Wyprofilowanie programu, odnalezienie miejsc gdzie tracone jest najwięcej czasu i zmiana algorytmu na poziomie kodu źródłowego może czasami dać najbardziej zauważalne rezultaty.

Niektóre typy kompilatorów (czasami używa się terminu superkompilatory) dokonują zaawansowanej analizy algorytmów i przetwarzają je na równoważne, wydajniejsze. Ma to szczególne znaczenie w przypadku generacji kodu dla maszyn równoległych i wektorowych.

Czasami, już na poziomie konstruowania algorytmu, warto wziąć pod uwagę specyfikę reprezentacji danych w określonym języku i cechy maszyny docelowej. Macierz można przeszukiwać kolumnami albo wierszami – zazwyczaj pierwsze rozwiązanie da lepsze efekty w Fortranie niż w Pascalu, drugie – odwrotnie. W Fortranie tablice wielowymiarowe są przechowywanie w pamięci kolumnami, w Pascalu – wierszami. Różnica w wydajności wynika z organizacji i sposobu działania pamięci notatnikowej, która operuje na blokach pamięci (zwanych liniami).

Pewne optymalizacje mogą zostać jednak wykonane dopiero na poziomie kodu pośredniego. Dobrym przykładem są odwołania do elementów tablic w Pascalu, gdzie programista nie ma żadnej kontroli nad niepotrzebnymi obliczeniami adresu, ponieważ są one ukryte w implementacji języka, a nie jawnie umieszczone w kodzie źródłowym. Na poziomie języka pośredniego można wykonać również istotne ulepszenia pętli, które zostaną omówione dalej.

Szczególnej rangi nabrała w ostatnich czasach optymalizacja na poziomie kodu wynikowego. Oprócz tradycyjnych optymalizacji, takich jak odpowiedni przydział rejestrów i wykorzystanie idiomów maszynowych ogromne znaczenie ma np. szeregowanie instrukcji (ze względu na potoki i zwielokrotnione jednostki wykonawcze procesora) czy reorganizacja instrukcji warunkowych i pętli (ze względu na mechanizm przewidywania skoków).

Optymalizacje mogą być lokalne (ograniczone do bloków podstawowych) albo globalne (wychodzące ponad poziom bloków podstawowych).


<< Poprzedni slajd | Spis treści | Następny slajd >>