J'utilise les algorithmes de tas STL C++, et j'ai écrit une classe wrapper pour pouvoir faire autre chose. Quand j'ai essayé d'utiliser le code ci-dessous, par exemple:Différence de vitesse: functor séparé VS operator() dans une grande classe avec * this
//! Min-heap wrapper class.
class FMMHeap{
public:
FMMHeap(Vector &phi) : _phi(phi) {}
bool operator()(unsigned p1, unsigned p2) {return fabs(_phi(p1)) > fabs(_phi(p2)); }
inline void pop(){ pop_heap(_heap.begin(),_heap.end(),*this); _heap.pop_back(); }
[...lots of other stuff...]
vectorU32 _heap;
Vector &_phi;
}
Il était wayyyyy plus lent que quand j'avais un objet de fonction séparée comme ceci:
struct HeapSort{
public:
HeapSort(Vector &phi) : _phi(phi) {}
bool operator()(unsigned p1, unsigned p2) {return fabs(_phi(p1)) > fabs(_phi(p2)); }
private:
Vector &_phi;
};
class FMMHeap{
public:
FMMHeap(Vector &phi) : cmp(phi) {}
inline void pop(){ pop_heap(_heap.begin(),_heap.end(),cmp); _heap.pop_back(); }
[...lots of other stuff...]
vectorU32 _heap;
HeapSort cmp;
}
Je ne sais pas pourquoi. Est-ce que le ralentissement vient de * ceci parce que la classe a beaucoup de données? Cela semble étrange. Ou est-ce quelque chose à voir avec la façon dont l'objet fonction est utilisé?
Vous devriez faire votre opérateur() const. Les prédicats ne devraient pas avoir d'effets secondaires. – sellibitze