2009-11-12 2 views
1

저는 C++ STL 힙 알고리즘을 사용하고 있습니다. 다른 것들을 할 수 있도록 랩퍼 클래스를 작성했습니다. 내가 예를 들어, 아래의 코드를 사용하려고 할 때 :속도 차이 : 별도의 펑터 VS 연산자() * this가있는 큰 클래스 내부

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

나는이 왜 확실하지 않다 :

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

그것은이 같은 별도의 함수 객체를했을 때보다 더 wayyyyy 느렸다. 클래스에 많은 데이터가 있기 때문에 속도 저하가 * 여기에서 오는 것입니까? 이상하게 보입니다. 아니면 함수 객체가 사용되는 것과 관련이 있습니까?

+0

operator()를 const로 설정해야합니다. 술어에는 부작용이 없을 것으로 예상됩니다. – sellibitze

답변

8

나는 확실하지 않다 :하지만 어쩌면 pop_heap는 당신이 전달하는 펑터 오브젝트를 복사 끝 당신의 FMMHeap의 사본이 STL 컨테이너의 가장 큰 속도 향상이되는 간단한 HeapSort

+1

예, 값으로 비교 함수 객체를 전달합니다. –

+0

보다 일반적으로 대부분의 STL 알고리즘은 값으로 조건 자 객체를 전달하므로 별도의 객체를 사용하는 것이 좋습니다. –

0

보다 더 비싼 것입니다. 컴파일러가 일을 제거하고 순서를 바꾸는 방법을 알아낼 수 있도록 이들의 인라이닝을 수행합니다.

const 컴파일러가 느린 버전에서 그렇게하지 못하게하는 방식으로 컴파일러가 외부 펑터를 인라인하는 것을 잘 추측합니다.

bool 연산자가 const 인 경우 느린 버전은 어떻게됩니까?