2015-03-03 3 views
10

आज मैंने इलेक्ट्रॉनिक आर्ट्स एसटीएल कार्यान्वयन की एक नमूना परियोजना डाउनलोड की और बनाई और मानक के मुकाबले ईए के वेक्टर मेरे लिए बहुत धीमे दिखते हैं। मैं सिर्फ आइटम के 1 लाख से 2 वैक्टर और उन्हें अपलोड करने के लिए बनाया:ईएएसटीएल प्रदर्शन

void performance_test(void) 
{ 
    clock_t start; 
    clock_t end; 


    // EA 

    eastl::string strEA = "hello"; 
    eastl::vector<eastl::string> vec_EA; 

    start = clock(); 
    for (size_t i = 0; i < 1000000; i++) 
    { 
     vec_EA.push_back(strEA); 
    } 

    end = clock(); 
    printf("EA  %f\n", (double(end - start)/1000)); 

    // Standard 

    std::string strStandard = "hello"; 
    std::vector<std::string> vec_Standard; 

    start = clock(); 
    for (size_t i = 0; i < 1000000; i++) 
    { 
     vec_Standard.push_back(strStandard); 
    } 

    end = clock(); 
    printf("Standard %f\n", (double(end - start)/1000)); 
} 

और परिणाम हैं:

  1. ईए ०.७५९०००
  2. स्टैंडर्ड 0,064000

तो, वहाँ कुछ भी है मैं क्या गलत कर रहा हूं या मुझे कुछ याद आया? नमूना v100 प्लेटफार्म टूलसेट के साथ संकलित किया गया है।

+0

आपने सी को क्यों टैग किया? कंपाइलर की अपनी मानक लाइब्रेरी विशेष रूप से उस कंपाइलर के लिए अनुकूलित की जा सकती है। मुझे यकीन नहीं है कि यह परिमाण का क्रम होना चाहिए, हालांकि। V100 प्लेटफ़ॉर्म टूलसेट क्या है? –

+2

मुझे यकीन नहीं है कि मैं समय के लिए 'घड़ी' पर भरोसा करता हूं, लेकिन जब अंतर यह महान होता है तो यह ठीक होना चाहिए। समस्या को कम करने के लिए, एक मानक स्ट्रिंग के साथ एक ईएएसटीएल वेक्टर की कोशिश करने के लायक होगा और इसके विपरीत। –

+0

@ मार्ककंसॉम: हम्म। मानक स्ट्रिंग के साथ ईए का वेक्टर मानक वेक्टर की तुलना में तेज़ है, लेकिन स्ट्रिंग भी तेज नहीं होनी चाहिए? – CsOkemf

उत्तर

11

जब मैं वी.एस. 2010 में एक रिलीज के निर्माण के साथ अपने बेंचमार्क चलाने के लिए, मैं परिणाम से एक के लिए क्या आशा है कि हो सकता है के लिए इसी तरह मिलता है:

EA  0.063000 
Standard 0.073000 

हालांकि, जब मैं वी.एस. डिबगर के तहत एक ही रिहाई का निर्माण चलाने के लिए, परिणाम नाटकीय रूप से बदलते हैं:

EA  1.293000 
Standard 0.080000 

और ऑब्जेक्ट क्लीनअप होने के लिए इसमें और भी अधिक समय लगता है (सेकेंड सेकेंड)। ध्यान रखें - यह एक ही रिलीज मोड बिल्ड है, डीबग बिल्ड नहीं।

मैंने देखा नहीं है कि ईएएसटीएल डीबगर पर्यावरण द्वारा इतनी गंभीरता से क्यों प्रभावित हुआ है। मुझे लगता है कि यह डीबग ढेर के साथ कुछ करने के लिए है।


अद्यतन (4 मार्च 2015):

परिणाम प्रभावित करता है एक और विस्तार शामिल स्ट्रिंग की लंबाई है। वीएस std::string में 'शॉर्ट स्ट्रिंग ऑप्टिमाइज़ेशन' का उपयोग करता है जो "hello" जैसे मान वाले स्ट्रिंग ऑब्जेक्ट्स के लिए आवंटित आवंटन की संख्या को कम करेगा। आप "hello" से "hello - but not too short" के उदाहरण में प्रयुक्त स्ट्रिंग्स के लिए प्रारंभ मूल्य बदलते हैं, तो आप और अधिक निम्नलिखित की तरह परिणाम प्राप्त करेंगे:

// release build, run outside of the debugger 
EA  0.078000 
Standard 0.113000 

// release build, run under the debugger 
EA  0.762000 
Standard 1.414000 

और अब यह स्पष्ट हो जाता है कि बेंचमार्क है जब परिमाण अंतर का आदेश डीबगर के तहत चलाने की संभावना है कि डीबग ढेर के कारण स्ट्रिंग मेमोरी आवंटन को ट्रैक करने में काफी समय लगेगा।

+0

हम्म, क्या आप पूरे समाधान को साझा कर सकते हैं? शायद मुझे एक अलग कंपाइलर सेटिंग्स मिल गईं। – CsOkemf

+0

'गिट क्लोन https: // github.com/mburr/eastl-test.git' फिर 'पूर्व-परीक्षण \ vs2010-test \ eastl-test \ eastl-test.sln' में VS2010 समाधान खोलें। आप 'eastl-test \ vs2010-test \ README-vs2010-test.txt' –

+0

भी बहुत कुछ पढ़ना चाहेंगे, अब मुझे यकीन है कि मेरी सेटिंग्स में कुछ गड़बड़ है। अब मुझे आपके परिणाम मिल रहे हैं। – CsOkemf

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