2012-03-15 10 views
6

VS11 बीटा के साथ खेलने के दौरान मैं कुछ अजीब देखा: इस कोड COUTSstd :: chrono :: system_clock :: अब() पर कॉल पर कंपाइलर रीडर कोड कर सकते हैं?

च ले लिया 0 मिलीसेकंड

int main() 
{ 
    std::vector<int> v; 
    size_t length =64*1024*1024; 
    for (int i = 0; i < length; i++) 
    { 
     v.push_back(rand()); 
    } 

    uint64_t sum=0; 
    auto t1 = std::chrono::system_clock::now(); 
    for (size_t i=0;i<v.size();++i) 
     sum+=v[i]; 
    //std::cout << sum << std::endl; 
    auto t2 = std::chrono::system_clock::now(); 
    std::cout << "f() took " 
     << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count() 
       << " milliseconds\n"; 


} 

लेकिन जब मैं तो यह योग की couting के साथ लाइन uncomment करने का फैसला एक उचित संख्या प्रिंट करता है।

यह व्यवहार मैं अनुकूलन के साथ मिलता है उन्हें विकलांग के साथ सक्षम किया गया है, मैं अदालत

च() 471 मिलीसेकेंड

तो यह मानक अनुरूप व्यवहार है ले लिया "सामान्य" मिल सकता है? महत्वपूर्ण: ऐसा नहीं है कि मृत कोड अनुकूलित हो जाता है, मैं कंसोल से चलते समय अंतराल देख सकता हूं, और मैं कार्य प्रबंधक में सीपीयू स्पाइक देख सकता हूं।

उत्तर

9

मेरा अनुमान है कि इस मृत कोड अनुकूलन है - और अपने लोड कील काम वेक्टर दूर अनुकूलित नहीं की जा रही है आरंभ की वजह से है कि है, लेकिन अपने अप्रयुक्त sum चर की गणना है।

लेकिन जब मैं राशि के couting के साथ लाइन को अपूर्ण करने का निर्णय लेता हूं तो यह एक उचित संख्या प्रिंट करता है।

यह मेरे सिद्धांत के साथ चला जाता है, हाँ - जब आपको गणना के परिणाम का उपयोग करने के लिए मजबूर किया जाता है, तो गणना स्वयं को अनुकूलित नहीं किया जा सकता है।

यदि आप इसे और पुष्टि करना चाहते हैं, तो अपने प्रोग्राम को तब तैयार करें जब यह तैयार हो और वापसी के लिए आपके लिए रोकें - जिससे आप किसी भी सीपीयू स्पाइक को वापसी के पहले स्पष्ट रूप से "चला गया" होने की प्रतीक्षा कर सकेंगे, जो होगा इसके कारण आपको अधिक विश्वास दिलाता है।

+0

चेक किया गया, आप सही हैं, लेकिन अब मैं उलझन में हूं, अगर यह समझने में बुद्धिमान है कि योग का उपयोग नहीं किया गया है तो यह प्रारंभिक क्यों कर रहा है? मुझे लगता है कि यह साबित नहीं कर सकता कि रैंड() का कोई साइड इफेक्ट नहीं है ... – NoSenseEtAl

+0

आउच ... केसी यह साबित नहीं कर सकता कि रैंड का कोई दुष्प्रभाव नहीं है-रैंड एक शुद्ध कार्य नहीं है ... इसमें राज्य है। :) लेकिन यहां तक ​​कि रैंड() को भी बदलना है, मैं अभी भी प्रारंभिकरण को रोकता नहीं है ... – NoSenseEtAl

+0

@NoSenseEtAl: ठीक है प्रारंभिक 'push_back' का उपयोग करके काम करता है ... तो मेरा अनुमान है कि संकलक यह कहने में सक्षम हो सकता है कि v 'बाद में इसका इस्तेमाल केवल उन तरीकों से किया जा सकता है, जो इसे छोड़ सकते हैं, यह मानकर खुशी नहीं है कि' push_back() 'का कोई अन्य दुष्प्रभाव नहीं होगा। हालांकि मैं निश्चित रूप से कहना नहीं चाहूंगा। –

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