kategorie: Amiga E, ANSI C, C++
[#1] [C / C++] Czy taka optymalizacja kodu ma sens?
Hej,
Czy taka optymalizacja kodu dla Amigowych kompilatorów czy cross-compilatorów ma sens?
W przypadku wymuskanych kompilatorów microsoftu pod windowsa, korzystających z heurystyk itp pewnie nie, ale przy kodowaniu na Amigę liczy się każda linijka.

Chodzi o ominięcie instrukcji warunkowych IF lub SWITCH w przypadku kiedy mamy ich np. 10
i sa wykonywane 50 razy na sekunde. Np. stany obiektu w gameloop().

void funkcja_01(int, int) {}
void funkcja_02(int, int) {}
void funkcja_03(int, int) {}
...
void funkcja_10(int, int) {}


i teraz zamiast standardowych instrukcji warunkowych IF lub SWITCH:
int main()
{
   switch (stan)
   {
      case 1: funkcja_01()..);
      case 2: funkcja_02(..);
      ...
      case 10: funkcja_10(...);
   };
}


zamiast tego używamy tablicy wskażników do funkcji:

int main ()
{
    void (*funkcje[]) (int, int) = { &funkcja_01, &funkcja_02, &funkcja_03 ... &funkcja_10 

   // i zamiast sprawdzac stan zmiennej 'stan' po prostu uzywamy:
   funkcje[stan](a,b);
}


A moze ewentulanie, Ktoś jest w stanie skompilować podobny kod i porównać z "normlanym", i zobaczyć jakie sa róznice pod asemblerem.
Nie mówię, że Amigowe kompilatory sa jakieś głupie czy coś oczywiście :)

Ostatnia aktualizacja: 23.09.2020 14:14:39 przez mateusz_s
[#2] Re: [C / C++] Czy taka optymalizacja kodu ma sens?

@mateusz_s, post #1

Compiler Explorer prawdę Ci powie. Możesz sobie porównać Amiga 6.5.0b od Bebbo z 10.2-elf którego używa wtyczka od Bartmana. Jest też tam też amigowy SAS/C i VBCC, ale możesz je bezpiecznie zignorować.

Switch ma zbliżony narzut co tablica, zwłaszcza jak case'y są ciągłe.

W ACE jest menedżer stanu, który operuje na callbackach - jak wołasz stateProcess() to wykonuje Ci funkcję process() aktualnego stanu. Używam tego od lat, narzut niewielki a całkiem fajnie porządkuje kod. Tu możesz popatrzeć jak to jest zrobione.

Ostatnia aktualizacja: 23.09.2020 14:32:26 przez teh_KaiN
[#3] Re: [C / C++] Czy taka optymalizacja kodu ma sens?

@mateusz_s, post #1

Nie zajmuj sie optymalizacja zanim nie sprawdzisz, ze faktycznie masz w kodzie jakies waskie gardlo - najgorsza optymalizacja to przedwczesna optymalizacja.
Zaimplementuj to, co zaplanowales w najbardziej przejrzysty dla ciebie sposob, przetestuj i upewnij sie, ze dziala jak powinno. Jesli beda jakies miejsca, ktore ewidentnie sa za wolne - uzyj profilera do weryfikacji I zlokalizowania problemu. Dopiero wtedy mysl o optymalizacji. Zaczynaj od najbardziej czasochlonnych fragmentow - nie ma sensu optymalizowanie kodu, ktory zajmuje np 5% czasu, bo nawet jak przyspieszysz 2 razy, to wciaz bedzie gora 2-3% zysku.
[#4] Re: [C / C++] Czy taka optymalizacja kodu ma sens?

@mateusz_s, post #1

Ja dodam, że warto pisać w jak najprostszy sposób (o ile tak się da). Najszybsze są te funkcje, których nie ma.

@teh_KaiN
Dzięki za informację o Compiler Explorer. Nie byłbym sobą, gdybym nie sprawdził i jak zwykle żaden kompilator nie wygenerował kodu takiego jakbym chciał (albo chociaż zbliżonego). Marzy mi się by kompilator był w stanie użyć rozkazów dbcc.
A to ten przykładzik
void clear(int* screen)
{
    int i = 10240;

    do
    {
        *screen = 0;
        screen++;
    } while (--i, 0!=i);
}
[#5] Re: [C / C++] Czy taka optymalizacja kodu ma sens?

@asman, post #4

Nie byłbym sobą, gdybym nie sprawdził i jak zwykle żaden kompilator nie wygenerował kodu takiego jakbym chciał (albo chociaż zbliżonego). Marzy mi się by kompilator był w stanie użyć rozkazów dbcc.
A to ten przykładzik


Twoj przykladzik jest tak skonstruowany, ze nie pozwala kompilatorowi uzyc dbcc. Oto wersja poprawna:

void clear(int* screen)
{
    unsigned short i = 10239;

    do
    {
        *screen = 0;
        screen++;
    } while (--i != 0xffff);
}


Zapomniales, ze dbcc operuje na typie short, a kompilatory zakladaja ze int ma 32 bity. Oto co wyplul gcc 2.95 z powyzszego kodu (kompilowane z -Os -fomit-frame-pointer):

_clear(int *):
        movel sp@(4),a0
        movew #10239,d0
L6:
        clrl a0@+
        dbra d0,L6
        rts
        nop
[#6] Re: [C / C++] Czy taka optymalizacja kodu ma sens?

@mschulz, post #5

I to jest temat. Dzięki wielkie.
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