Portál AbcLinuxu, 26. dubna 2024 09:59


Dotaz: zrychlení opakovaného volání virtuálních funkcí pomocí boost::bind?

14.11.2009 22:34 vencas | skóre: 32
zrychlení opakovaného volání virtuálních funkcí pomocí boost::bind?
Přečteno: 171×
Odpovědět | Admin
Zdravím,

chci se zeptat (než to budu pořádně zkoušet a měřit), jestli je možné urychlit časté a opakované volání virtuální funkce na objektu tak, že udělám virtuální funkci vracející pointer na nevirtuální funkci, která se příště bude (přes ten pointer) volat přímo, nevirtuálně. Využiju k tomu navázání pointeru na instanci pomocí boost::bind.

Původní scénář:
struct A{
   virtual int compute(int foo){ /* výpočet A */ }
};
struct B: public A{
   virtual int compute(int foo){ /* výpočet B */ }
};

vector<objekt*> objekty; // naplnit pole etc.

for(int i=0; i<100000; i++){
   // tady se pro každý objekt v každém kroku resolvuje virtuální funkce, přitom výsledek pro kažedý objekt vždy stejný
   BOOST_FOREACH(const objekt*, objekty){ sum+=objekt->compute(bar); }
}
   
kde je nějaká množina objektů, na kterých se compute mnohokrát opakovaně volá.

Nový scénář:
struct A{
   typedef boost::function<int(int)> computePtrT;
   computePtrT compuptePtr;
   int computeA(int foo){ /* výpočet A */ } // neni virtualni!
   virtual computePtrT getComputePtr(){ return boost::bind(&A::computeA,this,_1); }
};
struct B: public A{
   int computeB(int foo){ /* výpočet B */ } // neni virtualni
   virtual computePtrT getComputePtr(){ return boost::bind(&B::computeB,this,_1); }
};

for(int i=0; i<100000; i++){
   BOOST_FOREACH(const objekt*, objekty){
      // při prvním cyklu se voláním virtuální funkce nastaví pointer na nevirtuální funkci (computeA nebo computeB)
      if(!objekt->computePtr) objekt->computePtr=objekt->getComputePtr();
      sum+=objekt->computePtr(bar);
   }
}
Díky za komentáře.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.11.2009 23:06 Jirka P.
Rozbalit Rozbalit vše Re: zrychlení opakovaného volání virtuálních funkcí pomocí boost::bind?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Silně pochybuji - dokonce myslím, že zrychlení není možné, protože samotný boost::function při volání používá virtuální funkci.
15.11.2009 16:36 vencas | skóre: 32
Rozbalit Rozbalit vše Re: zrychlení opakovaného volání virtuálních funkcí pomocí boost::bind?
Tak jsem to zkoušel, a kód byl dokonce pomalejší. (Myslel jsem nejdřív, že bude třeba změnit program na mnoha místech, tak jsem s tím nechtěl nejdřív hned experimentovat, ale šlo to vcelku snadno.) Díky.
14.11.2009 23:06 Jirka P.
Rozbalit Rozbalit vše Re: zrychlení opakovaného volání virtuálních funkcí pomocí boost::bind
Odpovědět | | Sbalit | Link | Blokovat | Admin
Silně pochybuji - dokonce myslím, že zrychlení není možné, protože samotný boost::function při volání používá virtuální funkci.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.