Pok-13-wyk-Slajd17
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).