शायद बूलियन बीजगणित पर Wikipedia article मदद करता है।
सुझाव एक सूक्ष्म अनुकूलन है जो जल्दबाजी में मैक्रो को बदल सकता है। जस्ट-इन-टाइम कंपाइलर if() कथन के लिए एक सशर्त शाखा उत्पन्न करता है, कम से कम माइक्रोसॉफ्ट द्वारा बनाए गए लोग कोड को अनुकूलित करने के लिए पर्याप्त स्मार्ट नहीं हैं। यदि आपको उत्पन्न मशीन कोड को देखकर मोनो जिटर बेहतर काम कर सकता है तो आपको देखना होगा।
if (someBoolVar) anotherBoolVar = true;
00007FFD989F3BB1 movzx eax,cl
00007FFD989F3BB4 test eax,eax
00007FFD989F3BB6 je 00007FFD989F3BBA // <=== here
00007FFD989F3BB8 mov dl,1
00007FFD989F3BBA etc...
ऊपर मशीन कोड में जेई निर्देश के समान सशर्त शाखाओं एक आधुनिक प्रोसेसर लिए परेशानी हैं, यह पाइपलाइन पर काफी निर्भर करता कोड शीघ्रता से संसाधन बनाने के लिए: विशिष्ट कोड पीढ़ी की तरह दिखता है। निर्देश डिकोडिंग और माइक्रो-ऑप्स पीढ़ी समय से पहले की जाती है। प्रीफ़ेचर के साथ भी वास्तव में एक बड़ा सौदा, यह अनुमान लगाने का प्रयास करता है कि कैश में कौन से मेमोरी स्थानों को उपलब्ध होना आवश्यक है ताकि मेमोरी सामग्री की आवश्यकता होने पर निष्पादन इंजन बंद न हो।प्रोसेसर के निष्पादन इंजन की कच्ची निष्पादन गति की तुलना में मेमोरी बहुत धीमी है।
एक प्रोसेसर में शाखा भविष्यवाणी है, यह ट्रैक करता है कि कोड को पहले निष्पादित किए जाने पर लिया गया था या नहीं। और मानता है कि शाखा फिर से वैसे ही व्यवहार करेगी। अगर यह गलत लगता है तो पाइपलाइन को फ्लश करने की जरूरत है। बहुत सारे काम फेंक दिए जाते हैं और जब प्रोसेसर बैक हो जाता है तो प्रोसेसर रुक जाएगा। अतिरिक्त लंबे स्टालों तब हो सकते हैं जब प्रीफेचर ने गलत अनुमान लगाया है, जो उसने किया है। एक good SO post है जो गलत भविष्यवाणी के परिणामों को बताता है।
बूलियन बीजगणित का उपयोग शाखा से बचाता है, यह एक OR या AND निर्देश उत्पन्न करेगा, वे एक चक्र लेते हैं और कभी भी पाइपलाइन को फ्लश नहीं कर सकते हैं। निश्चित रूप से एक माइक्रो-ऑप्टिमाइज़ेशन, यह केवल मैक्रो बदलता है जब यह कोड आपके कोड की ~ 10% के अंदर स्थित होता है जो आपके प्रोग्राम की गति निर्धारित करता है। आईडीई आपको यह बताने के लिए पर्याप्त स्मार्ट नहीं होगा कि यह मामला है, केवल एक प्रोफाइलर आपको दिखा सकता है।
Fwiw, ऐसे माइक्रो-ऑप्टिमाइज़ेशन हैं, प्रोग्रामर & & और || ऑपरेटरों को अनुपयुक्त। उन ऑपरेटरों के संक्षिप्त सर्किटिंग व्यवहार को हमेशा मशीन कोड में एक शाखा की आवश्यकता होती है। उस व्यवहार की हमेशा आवश्यकता नहीं होती है, आमतौर पर यह नहीं है और & और | ऑपरेटर बहुत तेज़ कोड उत्पन्न कर सकता है। यदि बाएं तरफ ऑपरेंड की खराब भविष्यवाणी की जाती है तो यह कोड 500% धीमा कर सकता है।
स्रोत
2015-03-26 14:19:06
मुझे पूरा यकीन है कि आखिरी व्यक्ति '& = ~ कुछ बुल्वर' होना चाहिए; 'आप '~' –
खो रहे हैं आपका आईडीई चाहता है कि आप कम पठनीय कोड लिखें। इसकी सलाह को अनदेखा करें। –
'|' (या), '&' (और) और '~' (नहीं) और बिटवाई ऑपरेटर हैं, इस मामले में इसे इन लाइन-लाइन असाइनमेंट में छोटा किया जा सकता है। आईडीई को अपने कोड को "सही" न होने दें यदि यह आपको भ्रमित करता है :) –