2011-03-10 13 views
6

मैं बूस्ट :: multi_index का उपयोग डेटा प्रकार के साथ कर रहा हूं जिसे मैं अपने आकार के आधार पर इंडेक्स करना चाहता हूं। हालांकि, इस डेटा प्रकार का आकार() सदस्य फ़ंक्शन निष्पादित करने के लिए महंगा है। क्या mult_index अपने कुंजी निकालने वाले मानों को कैश करता है?क्या मल्टी_इंडेक्स निकाली गई कुंजी को कैश किया गया है?

उदाहरण के लिए, यदि मैंने एक सदस्य फ़ंक्शन कुंजी (element.size()) के साथ ऑर्डर किए गए इंडेक्स के साथ एक बहु_इंडेक्स कंटेनर बनाया है, और उस तत्व को डाला है जिसका आकार इसे कंटेनर के बीच में कहीं भी रखता है, तो कंटेनर फिर से होगा सही सम्मिलन बिंदु खोजने से पहले अपने आंतरिक डेटा संरचना को पार करते समय सभी तत्वों पर आकार() सदस्य फ़ंक्शन को अन्वॉक करें?

उत्तर

9

खैर, सदस्य समारोह indexers के लिए दस्तावेज़ कहते हैं कि वे संदर्भित सदस्य फ़ंक्शन को कॉल करें: http://www.boost.org/doc/libs/1_46_0/libs/multi_index/doc/reference/key_extraction.html#key_extractors

लेकिन संदेह में जब, प्रोफाइल:

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/mem_fun.hpp> 
#include <boost/multi_index/indexed_by.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/multi_index/ordered_index.hpp> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

namespace bmi = boost::multi_index; 

int g_calls = 0; 
struct A 
{ 
    explicit A(int sz) : m_size(sz) { } 
    int size() const { ++g_calls; return m_size; } 
private: 
    int m_size; 
}; 

typedef boost::multi_index_container< 
    A*, 
    bmi::indexed_by< 
    bmi::ordered_non_unique< 
     BOOST_MULTI_INDEX_CONST_MEM_FUN(A,int,A::size) 
    > 
    > 
> container_t; 

int main() 
{ 
    container_t cont; 
    int n = 100; 
    vector<int> o(2*n+1); 
    for(int i = 0; i != 2*n+1; ++i) 
    o[i] = i; 
    random_shuffle(o.begin(), o.end()); 

    for(int i = 0; i != n; ++i) 
    cont.insert(new A(o[i])); 
    cout << "Calls to A::size(): "<< g_calls << endl; 
    for(int i = n+1; i <= 2*n; ++i) 
    cont.insert(new A(o[i])); 
    cout << "Calls to A::size(): "<< g_calls << endl; 
    cont.insert(new A(o[n])); 
    cout << "Calls to A::size(): "<< g_calls << endl; 
    for(int i = 0; i != o.size(); ++i) 
    cont.find(o[i]); 
    cout << "Calls after calling find " << o.size() << " times: "<< g_calls << endl; 
    return 0; 
} 

निम्नलिखित निर्गम (बूस्ट 1.46 का प्रयोग करके) देता है:

Calls to A::size(): 629 
Calls to A::size(): 1465 
Calls to A::size(): 1474 
Calls after calling find 201 times: 3262 

इसलिए, यह जवाब प्रकट होता है नहीं, यह कैश को महत्व देता नहीं करता है।

+0

बहुत बढ़िया, धन्यवाद। यह बहुत बुरा है। मुझे लगता है कि मुझे अपना प्रकार लपेटना होगा। – vsekhar

संबंधित मुद्दे