eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingWywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
Ilość wypowiedzi w tym wątku: 7

  • 1. Data: 2009-08-05 23:16:57
    Temat: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Od: "Mariusz Marszałkowski" <b...@g...pl>

    Witam

    Mam pytanie:
    Czy w kompilatorach C++ ktoś zaimplementował jakieś optymalizacje do
    metod wirtualnych? Chodzi mi o jakąś technikę, dzięki której kompilator
    może wygenerować szybszy kod dla wywołań wirtualnych niż dla zwykłych
    wskaźników do funkcji.

    Można w C stworzyć np. taką strukturę:

    struct X {
    void (*metoda_1)( struct X *x );
    void (*metoda_2)( struct X *x , int a , int b );
    int a,b;
    };

    A następnie posługiwać się nią bardzo podobnie jak klasą z metodami
    wirtualnymi:

    struct X *x = malloc(sizeof(struct X));
    inicjalizacja( x );
    x->metoda_1( x );
    x->metoda_2( x , 1 , 2 );

    Pozdrawiam.




    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 2. Data: 2009-08-06 07:22:36
    Temat: Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Od: Paweł Kierski <n...@p...net>

    Mariusz Marszałkowski wrote:
    > Witam
    >
    > Mam pytanie:
    > Czy w kompilatorach C++ ktoś zaimplementował jakieś optymalizacje do
    > metod wirtualnych? Chodzi mi o jakąś technikę, dzięki której kompilator
    > może wygenerować szybszy kod dla wywołań wirtualnych niż dla zwykłych
    > wskaźników do funkcji.
    >
    > Można w C stworzyć np. taką strukturę:
    >
    > struct X {
    > void (*metoda_1)( struct X *x );
    > void (*metoda_2)( struct X *x , int a , int b );
    > int a,b;
    > };
    >
    > A następnie posługiwać się nią bardzo podobnie jak klasą z metodami
    > wirtualnymi:
    >
    > struct X *x = malloc(sizeof(struct X));
    > inicjalizacja( x );
    > x->metoda_1( x );
    > x->metoda_2( x , 1 , 2 );

    Wątpię - implementacja w C++ może być nawet wolniejsza, bo odpowiada
    raczej:

    struct X {
    vptr_X* vptr;

    int a, b;
    };

    struct vptr_X {
    void (*metoda_1)( struct X *x );
    void (*metoda_2)( struct X *x , int a , int b );
    };

    a wywołania są niejawnie rozwijane do:

    x->vptr->metoda_1(x);

    Oszczędza to miejsce w obiekcie, upraszcza RTTI (vptr_X tak naprawdę
    może zawierać więcej informacji o klasie, np. informacje o klasach
    bazowych), upraszcza inicjalizację obiektu (wypełnienie jednego pola).

    Optymalizacja może dotyczyć sytuacji ze znanym statycznym typem -
    wtedy po prostu wołana odpowiednia jest metoda (statycznie znany adres).

    To "wolniejsze" to jednak co najwyżej dodatkowe odwołanie do pamięci.
    A jeśli bijesz się o nanosekundy (bo wszystkie inne możliwości
    optymalizacji wykorzystąłeś), to i tak raczej omijasz polimorfizm,
    jakkolwiek zaimplementowany.

    --
    Paweł Kierski
    n...@p...net


  • 3. Data: 2009-08-06 09:52:49
    Temat: Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Od: Jakub Debski <d...@w...pl>

    on 2009-08-06, Mariusz Marszałkowski supposed :
    > Czy w kompilatorach C++ ktoś zaimplementował jakieś optymalizacje do
    > metod wirtualnych? Chodzi mi o jakąś technikę, dzięki której kompilator
    > może wygenerować szybszy kod dla wywołań wirtualnych niż dla zwykłych
    > wskaźników do funkcji.

    Visual C++ od wersji 2005 przy użyciu Profile-Guided Optimization robi:

    Virtual Call Speculation. Virtual calls can be expensive due to the
    jumping through the vtable to invoke method. With PGO, the compiler can
    speculate at the call site of a virtual call and inline the method of
    the speculated object into the virtual call site; the data to make this
    decision is gathered with the instrumented application. In the
    optimized code, the guard around the inlined function is a check to
    ensure that the type of the speculated object matches the derived
    object.

    G++ od wersji 3.0 ma:

    If the library exports constructors to the user,
    all the user callable virtual functions of the
    class and its ancestors must be exported. Although
    virtual functions are normally called
    via the vtable (and therefore their names are
    not needed, just the index in the vtable), by exposing
    the constructor it might be possible to
    determine the dynamic type of an expression at
    compile time. Should the compiler do that, it
    may elect to replace a virtual call with a direct
    call, and hence require the name of the virtual
    function.

    pozdrawiam,
    Jakub



  • 4. Data: 2009-08-09 20:17:27
    Temat: Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Od: MaciejS <h...@g...com>

    On 6 Sie, 01:16, "Mariusz Marszałkowski" <b...@g...pl>
    wrote:
    > Witam
    >
    > Mam pytanie:
    > Czy w kompilatorach C++ ktoś zaimplementował jakieś optymalizacje do
    > metod wirtualnych? Chodzi mi o jakąś technikę, dzięki której kompilator
    > może wygenerować szybszy kod dla wywołań wirtualnych niż dla zwykłych
    > wskaźników do funkcji.
    Wyniki testow jakie robilem jakis czas temu:
    http://msinilo.pl/blog/?p=401


  • 5. Data: 2009-08-10 03:43:03
    Temat: Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>

    MaciejS <h...@g...com> napisał(a):

    > On 6 Sie, 01:16, "Mariusz Marsza=B3kowski" <b...@g...pl>
    > wrote:
    > > Witam
    > >
    > > Mam pytanie:
    > > Czy w kompilatorach C++ kto=B6 zaimplementowa=B3 jakie=B6 optymalizacje d=
    > Wyniki testow jakie robilem jakis czas temu:
    > http://msinilo.pl/blog/?p=3D401

    Wyniki bardzo podobne do moich. Koszt wywołania wirtualnego jest żaden w
    stosunku do zwykłego. Natomiast koszt wywołania jakiegokolwiek w stosunku
    do rozwinięcia inline bywa (nie zawsze) ogromny.

    Pozdrawiam i dziękuję wszystkim





    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 6. Data: 2009-08-10 07:42:00
    Temat: Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Od: MaciejS <h...@g...com>

    On Aug 10, 5:43 am, "Mariusz Marszałkowski" <b...@g...SKASUJ-
    TO.pl> wrote:
    > MaciejS <h...@g...com> napisał(a):
    >
    > > On 6 Sie, 01:16, "Mariusz Marsza=B3kowski" <b...@g...pl>
    > > wrote:
    > > > Witam
    >
    > > > Mam pytanie:
    > > > Czy w kompilatorach C++ kto=B6 zaimplementowa=B3 jakie=B6 optymalizacje d=
    > > Wyniki testow jakie robilem jakis czas temu:
    > >http://msinilo.pl/blog/?p=3D401
    >
    > Wyniki bardzo podobne do moich. Koszt wywołania wirtualnego jest żaden w
    > stosunku do zwykłego. Natomiast koszt wywołania jakiegokolwiek w stosunku
    > do rozwinięcia inline bywa (nie zawsze) ogromny.
    Zalezy od procesora, to sa wyniki z dosyc nowoczesnego x86, ktore
    radza sobie calkiem niezle. Na X360 (PPC) roznica pomiedzy 'zwykla' a
    wirtualna f-kcje jest juz duzo bardziej widoczna.


  • 7. Data: 2009-08-10 10:39:31
    Temat: Re: Wywołanie wirtualne kontra wskaźnik do funkcji - optymalizacja
    Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>

    MaciejS <h...@g...com> napisał(a):

    > On Aug 10, 5:43=A0am, "Mariusz Marsza=B3kowski" <b...@g...SKASUJ-
    > TO.pl> wrote:
    > > MaciejS <h...@g...com> napisa=B3(a):
    > >
    > > > On 6 Sie, 01:16, "Mariusz Marsza=3DB3kowski" <brodacz100.WYT...@gazeta.=
    > pl>
    > > > wrote:
    > > > > Witam
    > >
    > > > > Mam pytanie:
    > > > > Czy w kompilatorach C++ kto=3DB6 zaimplementowa=3DB3 jakie=3DB6 optym=
    > alizacje d=3D
    > > > Wyniki testow jakie robilem jakis czas temu:
    > > >http://msinilo.pl/blog/?p=3D3D401
    > >
    > > Wyniki bardzo podobne do moich. Koszt wywo=B3ania wirtualnego jest =BFade=
    > n w
    > > stosunku do zwyk=B3ego. Natomiast koszt wywo=B3ania jakiegokolwiek w stos=
    > unku
    > > do rozwini=EAcia inline bywa (nie zawsze) ogromny.
    > Zalezy od procesora, to sa wyniki z dosyc nowoczesnego x86, ktore
    > radza sobie calkiem niezle. Na X360 (PPC) roznica pomiedzy 'zwykla' a
    > wirtualna f-kcje jest juz duzo bardziej widoczna.

    Lubię mieć program podzielony na dużo małych funkcji. Lubię także mieć
    dużo funkcji wirtualnych zamiast gąszczu if-ów. Niestety taka praktyka
    może spowolnić program nawet 10 razy :(

    Pozdrawiam



    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

strony : [ 1 ]


Szukaj w grupach

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: