eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programminggaszcz if-ow kontra wywolanie przez wskaznik/wirtualneRe: gaszcz if-ow kontra wywolanie przez wskaznik/wirtualne
  • Data: 2010-02-21 02:10:18
    Temat: Re: gaszcz if-ow kontra wywolanie przez wskaznik/wirtualne
    Od: bartekltg <b...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 21 Lut, 01:48, Mariusz Marszałkowski <m...@g...com> wrote:
    > On 20 Lut, 23:51, bartekltg <b...@g...com> wrote:
    >
    > > On 20 Lut, 21:42, bartekltg <b...@g...com> wrote:
    >
    > > Wyniki najlepisze:
    > > wsk    333   100%
    > > case   339  101.8%
    > > if        348   104.5%
    >
    > Kurka wodna... inny kompilator, inna maszyna no i inne wyniki. No ale
    > tak to już jest z językami wysokiego poziomu. Może ja walczę z
    > wiatrakami
    > próbując optymalizować kod w jezyku wysokiego poziomu.

    Jakbys pisal w asm zaleznosc od sprzetu byla by podobna.


    > U mnie machanie myszka zaburzalo wyniki co najwyzej o 0.1%

    >=dwa rdzenie?


    >
    > > Kompilator - tradycyjnie VC.
    >
    > A moze vc jest na tyle sprytny, ze zobaczyl tablice const i
    > rozwinal inline?

    Nie. W asm dla wskaznikow jest call na wyliczona funkcje z tabelki.

    A dalej sie robi ciekawie.
    Wersja z if nie przeszukuje tego 'binarnie' ale liniowo,
    sprawdza, czy r==0, jak tak, to wykonuje kod i skacze na koniec,
    jak nie, przeskakuje do porownanie r==1 i robi to samo.
    Czyli dla r=7 wykona 8 porownan.

    Wersja z case jest sprytniejsza. Dla r>6 (default, 7 i wiecej)
    robi skok, w przeciwnym wypadku robi
    jmp DWORD PTR $LN36@proc3[eax*4]
    gdzie
    $LN36@proc3:
    DD $LN8@proc3
    DD $LN7@proc3
    DD $LN6@proc3
    DD $LN5@proc3
    DD $LN4@proc3
    DD $LN3@proc3
    DD $LN2@proc3

    to tablice etykiet w rozpisanym kodzie. Czyli dokaldnie to, co
    podejrzewam, chciales uzyskac tablicami.

    Zrobilem jeszcze wersje z recznym wyszukiwaniem binarnym,
    zawsze mamy 3 porownania.
    Widac jednak duzo skakania, bo mimo tego, ze 3<8/2, to ta
    wersja dziala minimalnie dluzej niz liniowe if.

    Sprobuj pomoc kompilatorowi, wyrzuc definicje fp poza funkcje,
    zmiej ja na int (* const fp[])(const int,const int,const int) =
    {f0,f1,f2,f3,f4,f5,f6,f7};
    pozmieniaj argumenty f0..f7 na const int.


    Gdzie indziej w tym watku, o case>=ifelse
    > > To jest naprawde dziwne:)

    >Nie az tak dziwne. Nie wiem jak to jest naprawde, ale wyobrazam sobie,

    Tu zupelnie nie o to chodzi. Nie siedze az tak gleboko, ale
    czy case nie mozna traktowac jako lukier syntaktyczny na taka
    drabinke if? W ten sposob moze byc realizowana. Czemu kompilator
    mialby ja realizowac gorzej, zwlaszcza, ze to najprostrzy sposob.

    Przedzej podejrzewam, ze gcc chcialo zbyt dobrze i za bardzo
    'zoptymalizowalo', tworzac, jak ja w tym watku, wyszukiwanie binarne.
    Co okazalo sie minimalnie gorsze. Ale czy to dobry strzal, musialbys
    zerknac do wynikowego asm.

    pozdrawiam
    bartekltg


Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: