-
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/