2010-07-06 13 views
5

मेरे पास निम्न कोड है (जो बड़े पैमाने पर पहले उदाहरण का पालन करता है: http://www.boost.org/doc/libs/1_42_0/libs/multi_index/doc/examples.html))। कुछ कारणों से, बहु-सूचकांक में केवल 10000 प्रविष्टियों के साथ, कार्यक्रम चलाने में कई मिनट लगते हैं। क्या मैं कुछ गलत कर रहा हूं या क्या यह उम्मीद है?धीमी प्रविष्टि प्रदर्शन के साथ बूस्ट मल्टी-इंडेक्स

struct A 
{ 
    int id; 
    int name; 
    int age; 
    A(int id_,int name_,int age_):id(id_),name(name_),age(age_){} 
}; 


/* tags for accessing the corresponding indices*/ 
struct id{}; 
struct name{}; 
struct age{}; 

typedef multi_index_container< 
    A, 
    indexed_by< 
    ordered_unique< 
     tag<id>, BOOST_MULTI_INDEX_MEMBER(A,int,id)>, 
    ordered_non_unique< 
     tag<name>,BOOST_MULTI_INDEX_MEMBER(A,int,name)>, 
    ordered_non_unique< 
     tag<age>, BOOST_MULTI_INDEX_MEMBER(A,int,age)> > 
> A_set; 



int main() 
{ 
    A_set es; 

    for (int a = 0; a != 10000; a++) { 
    es.insert(A(a,a+1,a+2)); 
    } 
    return 0; 
} 
+1

क्या आप एनडीईबीयूजी मैक्रो सेट करते हैं? अगर मैं इसे सेट करता हूं, तो कोड तेजी से चमक रहा है। – pmr

उत्तर

11

क्या आप डीबग मोड में संकलित किसी भी मौके से हैं? यह पास तुरन्त विजुअल स्टूडियो 2008 में डिफ़ॉल्ट रिलीज विन्यास के साथ खत्म आप डिबग मोड में संकलित कर रहे हैं और आप लगभग पत्र के लिए उदाहरण का पालन किया, पूर्व प्रोसेसर सामान सहित और अभी भी इस भाग था:

#ifndef NDEBUG 
#define BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING 
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE 
#endif 

फिर इन परिभाषाओं को हटाने/अक्षम करने से निष्पादन समय में भी काफी वृद्धि होगी। (मेरी मशीन पर कम से कम 180x तक, इसे खत्म करने की परेशानी नहीं थी।) डीबग बिल्ड में इन चीजों को अक्षम करने या हटाने का क्या परिणाम है, मुझे नहीं पता।

+0

धन्यवाद, मुझे वहां देखने का एहसास नहीं था। मुझे शायद कोड में भी शामिल करना चाहिए था। – tsiki

+0

धन्यवाद! मैंने वही काम किया, और उदाहरण से इन्हें चिपकाया ... – nhed

+0

ध्यान दें कि 'BOOST_MULTI_INDEX_ENABLE_SAFE_MODE' को डीबगिंग के लिए दृढ़ता से अनुशंसा की जाती है। यह उस मंदी का कारण नहीं बनता है जिसे आप देख रहे हैं और आपके कोड में सूक्ष्म बग पाता है। 'BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING' यहां अपराधी है। यह बूस्ट कोड * में बग्स * के लिए जांचता है * और आपको तब तक सेट नहीं करना चाहिए जब तक कि आपको बूस्ट कोड को बग्गी होने पर संदेह न हो। – Chronial

1

boost::bi_map के साथ अपने स्वयं के अनुभव (जो मेरे सबसे अच्छे ज्ञान बहु सूचकांक कंटेनर के आधार पर करने के लिए है) से, मैं कहना है कि उन लोगों के बहु सूचकांक कंटेनर दुर्भाग्य से अपेक्षाकृत धीमी गति से होता है। हालांकि प्रदर्शन को सम्मिलित करने के लिए यह नहीं है। तो मैं वास्तव में समझ में नहीं आता कि यह आपके मामले में इतनी धीमी क्यों है।

मैंने boost::bi_map से दो boost::unordered_map एस की तुलना में एक छोटा बेंचमार्क किया था। 100'000 अद्वितीय मूल्यों का सम्मिलन दोनों दृष्टिकोणों के लिए लगभग 1 सेकंड है। हालांकि, 50000000 मानों की पूछताछ unordered_map के लिए 10 सेकंड और आदेशित मानचित्र के लिए 26 सेकंड (जो पूर्णांक कुंजी का उपयोग कर रहा है) है। (हमारी सर्वश्रेष्ठ इन-हाउस डेटा संरचना लुकअप को लगभग 1 सेकंड में करती है)।

4

कई मिनट बहुत धीमे लगते हैं - मुझे आधुनिक सीपीयू के लिए सबसे अधिक सेकंड की उम्मीद होगी। बूस्ट कई छोटे कार्यों का उपयोग करता है जो डिबग बिल्ड में एक अनुकूलित रिलीज बिल्ड की तुलना में काफी धीमी गति से चलते हैं।

इसके अलावा सत्यापित करें कि BOOST_MULTI_INDEX_ENABLE_SAFE_MODE और BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING सेट नहीं हैं। ये दोनों अतिरिक्त रनटाइम जांच करते हैं।

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