Разница в скорости: отдельный оператор против оператора () внутри большого класса с * this - PullRequest
1 голос
/ 12 ноября 2009

Я использую алгоритмы кучи c ++ STL и написал для этого класс-обертку, чтобы я мог делать другие вещи Когда я пытался использовать код ниже, например:

//! 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;
}

Это было намного медленнее, чем когда у меня был отдельный объект функции, подобный этому:

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;
}

Я не уверен, почему это так. Замедление происходит из-за этого, потому что у класса много данных? Это кажется странным. Или это как-то связано с тем, как используется объект функции?

Ответы [ 2 ]

8 голосов
/ 12 ноября 2009

Я не уверен: но, возможно, pop_heap в итоге копирует объект функтора, который вы передаете Копия для вашего FMMHeap будет дороже, чем простой HeapSort

0 голосов
/ 12 ноября 2009

Самое большое ускорение контейнеров STL - это их встраивание, так что компилятор может решить, как удалять и изменять порядок вещей.

Можно предположить, что компилятору удается встроить внешний функтор таким образом, чтобы его использование в медленной версии мешало распространению const.

Что происходит с медленной версией, если оператор bool является const?

...