Jak unikać Asemblera

Ogólne wskazówki do osiągnięcia wydajnego kodu

W tym celu należy zastosować się do poniższych kroków:

Pracując w ten sposób uzyskujemy najlepszą efektywność kodu, przy możliwie najmniejszym nakładzie pracy.

Języki z kompilatorami optymalizującymi

Do takich języków można m.in. zaliczyć ObjectiveCAML, SML, CommonLISP, Scheme, ADA, Pascal, C i C++. Każdy z nich posiada właśnie taki kompilator, który zoptymalizuje olbrzymią cześć naszego kodu, robiąc to czasem skuteczniej, niż gdyby był on dostrajany ręcznie. Dzięki nim możemy skoncentrować się na bardziej wysokopoziomowych szczególach, jednocześnie mając możliwość wprowadzania pewnych poprawek tak jak było to przedstawione powyżej. Istnieją również komercyjne programy optymalizujące kod, mogące poprawiać szybkość działania naszych programów.

Jak przyspieszyć nasz kod?

Poniższych kroków nie należy wykonywać dla całego programu, a tylko dla fragmentów zidentyfikowanych przez nas jako "wąskie gardło". Spróbujmy więc dla każdego z nich:

Ostatecznie, kiedy już poprawimy kod w asemblerze, należy sprawdzić, czy rzeczywiście daje on lepsze rezultaty. Bardzo często może się zdarzyć, że wcale nie udało się nam poprawić kodu wygenerowanego przez kompilator, jest to najbardziej prawdopodobne w nowoczesnych wielowątkowych architekturach. Przy szybkich procesorach opóźnienia wynikają zazwyczaj z dostępu do pamięci, dlatego też optymalizacja rejestrów nie ma w tym momencie większego znaczenia. W takich przypadkach należy skupić się raczej na przeorganizowaniu struktur i wątków w taki sposób, aby osiągnąć większą lokalność w obszarach pamięci.

Analizowanie kodu genrowanego przez kompilator

Jest wiele powodów, dla których możemy potrzebować nadzorowania kodu generowanego przez kompilator. Oto niektóre z nich:

O tym jak wygenerować kod asemblera powiemy przy okazji omawiania wstawek asemblerowych gcc_inline.