kategoria: ANSI C
[#1] [C][SAS/C] Anty-optymalizacja?
Pracujac na Mozaika, przegladalem kod i usuwalem z niego niepotrzebne elementy.
Ku mojemu zaskoczeniu po kompilacji program wynikowy zamiast malec, wprost przeciwnie urusl.
Zdumialo mnie to troche i zaczalem analizowac sprawe.

Znalalzlem i wyodrebnilem taki kawalek kodu (tu tak jak go pozniej testowalem):

#include <stdio.h>

#define UKLADY 16

void PokazUkladyWzorow(void);
void PokazWzor(int Poz_X, int Poz_Y, int P_Wzor);

void PokazUkladyWzorow(void)
{
        int x, y, uklad = 0;
        
        for(y = 0; y < 4; y++)
        {
                for(x = 0; x < 4; x++)
                {
                        if(uklad < UKLADY)
                        {
                                PokazWzor(x * 50 + 3, y * 50 + 3, uklad);
                                
                                uklad++;
                        }
                        else return;
                }
        }
}

Dla czegos takiego kod wynikowy zajmowal 1488 bajtow.

Gdy usunalem ifa i funkcja wygladala tak:
void PokazUkladyWzorow(void)
{
        int x, y, uklad = 0;
        
        for(y = 0; y < 4; y++)
        {
                for(x = 0; x < 4; x++)
                {
                        PokazWzor(x * 50 + 3, y * 50 + 3, uklad);
                                
                        uklad++;
               }
        }
}

to kod wynikowy mial 1700 bajtow. To o 212 bajtow wiecej!

Czy ktos moglby mi wytlumaczyc ten fenomen? Ja za bardzo z asma zielony jestem.
Jesli faktycznie tak sie dzieje to jak sie przed tym ustrzec?

Ostatnia aktualizacja: 16.05.2021 15:05:10 przez Phibrizzo
[#2] Re: [C][SAS/C] Anty-optymalizacja?

@Phibrizzo, post #1

Nie znam się na kompilatorach, ale na chłopski rozum to ja zastąpiłbym na jego miejscu pętlę ze skokami zwykłym ośmiokrotnym wywołaniem PokazWzor. Dłuższy kod nie znaczy wolniejszy. A zajrzyj w asemblera, albo nawet jakimś hexeditorem to będzie widać, czy jakiś kawałek się powtarza.
[#3] Re: [C][SAS/C] Anty-optymalizacja?

@infboras, post #2

Zajrzalem faktycznie w asma i to co zrobil kompilator przeszlo moje najsmielsze oczekiwania.
Nieznajac asma odrazu zobaczylem roznice. Poprostu zamienil obydwie petle w wywolanie sekwencyjne.
Tak, wywolal funkcje PokazWzor() 16 razy, jedna za druga.

Tego sie nie spodziewalem.

Ostatnia aktualizacja: 16.05.2021 19:40:20 przez Phibrizzo
[#4] Re: [C][SAS/C] Anty-optymalizacja?

@Phibrizzo, post #3

Czyli rozpętlił. Widocznie stwierdził, że skoro nie ma warunku if to może, zamiast liczyć 16 razy parametry dla pętli, obliczyć to przy kompilacji i wstawić sparametryzowane wywołania.
[#5] Re: [C][SAS/C] Anty-optymalizacja?

@Phibrizzo, post #3

Efekt końcowy jest ten sam. Przejrzyj flagi kompilatora i pewnie znajdziesz coś by nie rozwijał pętli.
[#6] Re: [C][SAS/C] Anty-optymalizacja?

@hrw, post #5

Ogolnie, ten fragment kodu nie jest jakis krytyczny czasowo.
Poprostu taka ciekawostka na przyszlosc jakbym kiedys jeszcze jakies intro pisal i zalezalo mi na objetosci.
[#7] Re: [C][SAS/C] Anty-optymalizacja?

@Phibrizzo, post #3

16 racja, pała z matmy dla mnie
[#8] Re: [C][SAS/C] Anty-optymalizacja?

@Phibrizzo, post #6

Większość kompilatorów optymalizuje domyślnie na szybkość wykonania, nawet kosztem wielkości kodu. Rozwijanie pętli to typowa, wręcz klasyczna optymalizacja w tym przypadku.
2
[#9] Re: [C][SAS/C] Anty-optymalizacja?

@Phibrizzo, post #1

Troszkę nie związane z tematem pytania, ale mam dla Ciebie Phibrizzo taką małą sugestię ... Zrezygnuj z używania języka polskiego do nazewnictwa zmiennych, stałych, funkcji, metod etc. Taki kod w brew pozorom z czasem będzie bardziej czytelny w języku angielskim. Dużo łatwiej można zadać pytanie na "angielsko języcznych" portalach jak choćby https://stackoverflow.com/, bez problemu wkleisz tam swój kod i będzie bardziej zrozumiały dla każdego. Tak samo jakbyś chciał kiedyć upublicznić swoje źródła choćby na githubie.
Ale to tylko taka moja sugestia. Ja nawet komentarze w swoim kodzie mam po angielsku.

Ostatnia aktualizacja: 17.05.2021 09:35:59 przez Rafael/ARMO
2
[#10] Re: [C][SAS/C] Anty-optymalizacja?

@Rafael/ARMO, post #9

Masz abslutnie racje. Tylko ze moj angielski jest tak dobry jak Google Translator.
Wiec wymyslanie nazw i zastanawiac sie czy bedzie ok dla programu napisanego na szybko,
ktory ma 1000 linijek jest troche bezcelowe.
Nie chce tutaj wyjsc na jakiegos nacjonaliste ale w wiekszosci moich programow daje polskie
nazwy bo tak mi lepiej. Do tej pory chyba nikt nie widzial moich zrodel (i moze nawet lepiej...).
Raz tylko zdarzyl sie przypadek ze jakis zagraniczniak poprosil mnie o zrodla "Change It".
Gdy mu odpisalewm ze "czemu nie, ale ze calosc jest w j. polskim" odpisal ze go to wcale nie przeraza.
1
[#11] Re: [C][SAS/C] Anty-optymalizacja?

@Phibrizzo, post #10

No, tylko właśnie wysilając się z nazewnictwem podszlifujesz swój angielski. ;) Parę razy zajrzysz do translatora żeby znaleźć tłumaczenie a potem już będziesz pamiętał te częściej używane.

Wracając do tematu - nie wiem jak SAS/C ale GCC ma coś takiego jak -Os, czyli optymalizowanie pod rozmiar. Ma jeszcze atrybuty hot/cold które możesz nadać funkcjom i wtedy hotspoty optymalizuje Ci pod prędkość a coldspoty pod rozmiar. Poczytaj doc od SAS, może coś znajdziesz.
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem