2015-12-09 3 views
5

मेरे पास कोड में कई सत्यापन जांच हैं जहां कोई चेक विफल होने पर प्रोग्राम क्रैश हो जाता है। तो सभी चेक अधिक संभावना नहीं हैं।प्रदर्शन सुधारों की संभावना/संभावना क्यों नहीं दिखती है?

if((msg = newMsg()) == (void *)0)//this is more unlikely 
{ 
    panic()//crash 
} 

तो मैं मैक्रो संभावना नहीं जो शाखा भविष्यवाणी में संकलक संकेत इस्तेमाल किया है। लेकिन मैंने इसमें कोई सुधार नहीं देखा है (मेरे पास कुछ प्रदर्शन परीक्षण हैं)। मैं gcc4.6.3 का उपयोग कर रहा हूँ।

कोई सुधार क्यों नहीं है? क्या ऐसा इसलिए है क्योंकि इसके लिए कोई और मामला नहीं है? क्या मुझे अपना आवेदन बनाते समय किसी भी अनुकूलन ध्वज का उपयोग करना चाहिए?

+2

हार्ड डेटा की इस राशि के साथ बताने के लिए, लेकिन शायद बस क्योंकि संकेत आप संकलक दिया पहले से ही विचार किया गया? – MatthewRock

+3

प्रदर्शन लाभ संभावित/असंभव मैक्रोज़ प्रोसेसर चक्रों का एक मुट्ठी भर हो सकता है। शायद आपके प्रदर्शन परीक्षण केवल कुछ माइक्रो सेकंड, या यहां तक ​​कि मिलीसेकंड के लिए सटीक हैं। शायद संकलक ने आपके मैक्रोज़ के बिना भी इष्टतम कोड उत्पन्न किया। – nos

+1

यदि आप अपने कोड के प्रदर्शन में सुधार करना चाहते हैं, तो अनुमान लगाएं नहीं। आप गलत होंगे प्रोफाइल करें और ** जानें ** आपको किस पर काम करने की आवश्यकता है। –

उत्तर

3

क्या मुझे अपना आवेदन बनाते समय किसी भी अनुकूलन ध्वज का उपयोग करना चाहिए?

बिल्कुल! जीसीसी/क्लैंग/आईसीसी के लिए ऑप्टिमाइज़ेशन निम्नतम स्तर पर भी -O1 पर बदल गए हैं, जो आपके अधिकांश अनुकूलन प्रयासों को बेहतर प्रदर्शन करने की संभावना है। अनिवार्य रूप से मुफ्त में, तो क्यों नहीं?

मैं gcc4.6.3 का उपयोग कर रहा हूं।

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

लेकिन मैंने इसमें कोई सुधार नहीं देखा है (मेरे पास कुछ प्रदर्शन परीक्षण हैं)।

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

यह ध्यान देने योग्य है कि अनुक्रमिक माइक्रो-ऑप्टिमाइज़ेशन अभी भी आपके कोड को तेज़ लूप के रूप में बहुत तेज बना सकता है। स्टालों, शाखा गलतफहमी से बचने, कैश उपयोग को अधिकतम करने के लिए डेटा के हिस्सों को संभालने में एक फर्क पड़ता है। और SO's most voted question स्पष्ट रूप से दिखाता है कि।

यह भी जीसीसी पुस्तिका पर कहा गया है:

- निर्मित फंक्शन: लंबे __builtin_expect (लंबी exp, लंबे ग)
आप __builtin_expect उपयोग कर सकते हैं शाखा भविष्यवाणी जानकारी के साथ संकलक प्रदान करने के लिए।सामान्य रूप से, आपको इस (-फ्रोफाइल-आर्क) के लिए वास्तविक प्रोफ़ाइल प्रतिक्रिया का उपयोग करना पसंद करना चाहिए, क्योंकि प्रोग्रामर वास्तव में खराब हैं कि उनके प्रोग्राम वास्तव में कैसे कार्य करते हैं। हालांकि, ऐसे एप्लिकेशन हैं जिनमें इस डेटा को एकत्र करना मुश्किल है।

(जोर मेरा)

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