2009-06-11 43 views
10

वापस दिन जब मैं C और C++ में अपने अधिकतर कार्य किया था, निश्चित रूप से एक मामले के रूप में, मैं मैन्युअल रूप से होगा किसी भी गैर-तुच्छ बूलियन अभिव्यक्ति को अनुकूलित करने के लिए deMorgan's theorem लागू करें।DeMorgan की प्रमेय लागू करने के लिए मैन्युअल रूप से सशर्त बयान में बूलियन अभिव्यक्ति अनुकूलन करने के लिए सी # में यह उपयोगी है (उदाहरण के लिए अगर स्थिति)

यह सी # में यह करने के लिए उपयोगी है या अनुकूलक इस अनावश्यक प्रस्तुत करना है?

उत्तर

31

प्रोसेसर पर इस तेजी से, यह बूलियन भाव उलटफेर गति में कोई वास्तविक अंतर बनाने के लिए के लिए लगभग असंभव है। और सी # कंपाइलर बहुत स्मार्ट है, यह इसे अनुकूलित भी करेगा। पठनीयता और स्पष्टता के लिए अनुकूलित करें!

+6

+1। मैं अक्सर अपने कोड में बूलियन परीक्षण को अनुकूलित करता हूं, विशेष रूप से पठनीयता के लिए। – Cheeso

+0

कंपाइलर्स? होशियार? – Kekoa

+4

एक कंपाइलर अलग-अलग समय पर मूल्यांकन किए बिना अभिव्यक्ति के तर्क को अनुकूलित नहीं कर सकता है। फिरोजो का जवाब देखें। यह जानना काफी समझदार हो सकता है कि यह पर्याप्त स्मार्ट नहीं है। – Kekoa

3

मुझे लगता है कि संकलक पहले से ही ऐसा करेगा। आप परीक्षण कर सकते हैं और संकलित आईएल को परावर्तक के माध्यम से देख सकते हैं।

पठनीयता और रखरखाव के लिए अनुकूलित करें। खुद से पूछें कि क्या आप एक वर्ष में अपने चालाक अनुकूलन को समझेंगे और यदि आपको लगता है, तो कोड कुछ टिप्पणियों का उपयोग कर सकता है, कोड स्वयं दस्तावेज़ बनाते हैं।

2

खाते में पठनीयता और रखरखाव लें। यदि आपके पास बूलियन अभिव्यक्तियों का एक जटिल सेट है जो पढ़ने में मुश्किल है, तो डीमोर्गन का तूफान कुछ अभिव्यक्ति को पढ़ने/बनाए रखने के लिए अभिव्यक्ति को कम करने का एक शानदार तरीका हो सकता है लेकिन यह अभी भी मूल अभिव्यक्ति के साथ मान्य/संगत है।

यदि दूसरी तरफ, अभिव्यक्ति को पढ़ने और कम करने के लिए एक और वर्बोज अभिव्यक्ति बहुत आसान है, जबकि तर्कसंगत रूप से समतुल्य है, इसे समझना अधिक कठिन हो जाता है, इसे छोड़ दें।

8

आपका पहला लक्ष्य डेवलपर समझ और रखरखाव में आसानी के लिए ऐसे बयानों को अनुकूलित करना चाहिए।

डीमोर्गन का प्रमेय इस के लिए एक उपयोगी उपकरण हो सकता है।

7

JIT में अनुकूलन, अपने मौजूदा रूप में, (मैं क्या पढ़ा से) आप के लिए यह अनुकूलन नहीं करता। यदि आपको इसे अनुकूलित करने की आवश्यकता है, तो आपको इसे अभी भी ध्यान में रखना होगा।

कहा जा रहा है, यह काफी छोटा माइक्रो-ऑप्टिमाइज़ेशन है। आम तौर पर, मैं आपके "गैर-तुच्छ बूलियन अभिव्यक्तियों" को अधिक अभिव्यक्तिपूर्ण रूप में लिखना पसंद करूंगा ताकि उन्हें समझना आसान हो। मेरे लिए, यह डीमोर्गन के प्रमेय को लागू करने से प्राप्त होने वाले किसी भी बहुत छोटे अनुकूलन से अधिक मूल्यवान है।

2

लगभग सभी व्यावहारिक मामलों मैं के बारे में सोच सकते हैं, बूलियन ऑपरेटरों की व्यवस्था समग्र प्रदर्शन पर कोई उल्लेखनीय प्रभाव पड़ता है। यदि आपका प्रोग्राम डेटाबेस, नेटवर्क इत्यादि के लिए इंतजार कर रहा है, तो यह उन छोटे परिचालनों की तुलना में कहीं अधिक समय तक खर्च करेगा। क्या आपको एक ऐसा प्रोग्राम लिखना चाहिए जहां यह वास्तव में एक फर्क पड़ता है, बेहतर सी # को छोड़ दें और इसके बजाय सी ++ का उपयोग करें।

+2

काउंटर उदाहरण है 'fnThatHitsDB && flagVar' C# स्थानीय चर की जांच करने से पहले डीबी को हिट करेगा। – BCS

1

मैं सामान्य कथनों से सहमत हैं कि पठनीयता और अनुरक्षणीयता सबसे महत्वपूर्ण है जब यह बूलियन भाव इन दिनों के अनुकूलन के लिए आता है। इसलिए, डीमोर्गन का प्रमेय आम तौर पर बहुत उपयोगी होता है।

इस नियम के लिए एक अपवाद है। यदि बुलियन अभिव्यक्ति एक डेमोरगन की प्रमेय-अनुकूलित अभिव्यक्ति को बदलती है तो इसे बनाए रखना अधिक कठिन हो सकता है। कई इनपुट के साथ एक अभिव्यक्ति पर विचार करें जिसे केवल कुछ बूलियन स्थितियों को दिखाने के लिए अनुकूलित किया गया है। जरूरी बुलियन तर्क में एक बदलाव किसी को फिर से सभी संभव बुलियन संयोजनों को सूचीबद्ध करने के लिए मजबूर कर सकता है और फिर फिर से बदल सकता है। अगर अभिव्यक्ति को एक अपरिवर्तित प्रारूप में छोड़ा गया था, तो एक बदलाव ने पूरा करने के लिए कम कदम उठाए होंगे।

एक अचूक परिप्रेक्ष्य से अधिक, मुझे आश्चर्य है कि डीमोर्गन के प्रमेय और कर्णघ मैप्स आदि के बारे में एक टीम को शिक्षित करने से अनावश्यक/अक्षम बूलियन अभिव्यक्तियां कम हो जाएंगी। शायद अगर किसी को इन तरीकों की अच्छी समझ है, तो वह बेहतर अभिव्यक्ति उत्पन्न करेगा। उदाहरण के लिए, मैं हाल ही में सॉफ्टवेयर के कोड में इस बूलियन अभिव्यक्ति में आए मैं बनाए रखने:

if ({boolean variable} != true && false) 
+1

जो भी लिखा है वह अभी तक मॉर्गन और कर्णघ के लिए तैयार नहीं है। आइए बुनियादी बेवकूफों को रास्ते से बाहर निकालें, और फिर पठनीयता के लिए लिखें। –

+0

यिक्स! मुझे लगता है कि "&& false" छोड़ा जा सकता है डिबगिंग तर्क ('अस्थायी रूप से' यह सुनिश्चित करना कि अगर ब्लॉक निष्पादित नहीं किया गया हो), लेकिन यह आश्चर्य की बात है कि आप कितनी बार इस तरह क्रूर पर दौड़ते हैं। –

7

मेरा मानना ​​है कि इस सवाल का सही जवाब है कि, बस कारण है कि संकलक नहीं (सामान्य रूप से) बूलियन मूल्यांकन का अनुकूलन करता है तार्किक लघु सर्किटिंग के लिए, उदाहरण के लिए:

if (GetFlagA() || GetFlagB()) 
{ 
    ...do something 
} 

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

ए | बी | =

एफ | एफ | एफ

एफ | टी | टी

टी | एफ | बी के रिटर्न वैल के बावजूद टी सच है।

टी | टी | बी के रिटर्न वैल के बावजूद टी सच है।

तो संक्षेप में, पूछें कि क्या आप डेमोरगन या किसी भी चीज़ का उपयोग कर अनुकूलित कर सकते हैं, वास्तव में बाकी कंप्यूटर विज्ञान और सॉफ्टवेयर इंजीनियरिंग की तरह ही है। "निर्भर करता है।" यदि आप गैर-कार्यात्मक मूल्यांकन का उपयोग कर रहे हैं, तो इसे शायद अनुकूलित किया जा सकता है। ईमानदारी से आप एक बेहद तेज़ मंच पर कुछ परिचालनों की बात कर रहे हैं, तो आप अपना समय लेखन दस्तावेज खर्च करने से बेहतर होंगे।

मुझे उम्मीद है कि इससे मदद मिलती है।

+1

डेमोरगन को निष्पादन को नहीं बदला जाना चाहिए। क्योंकि तर्क चारों ओर फिसल जाता है। ! (! ए &&! बी) अभी भी बी को निष्पादित करता है यदि ए झूठा है। –

+0

@ बेंजामिनऑटिन मैं इसके बारे में सोच रहा था। क्या आपने जिस व्यवहार को वर्णित किया है वह अधिकांश भाषाओं में विशिष्ट है जो शॉर्ट सर्किटिंग को लागू करता है, या सी # के लिए अद्वितीय है? –

+0

होना चाहिए, एक बार अंतिम परिणाम सेट हो जाने के बाद, आवश्यक से अधिक काम क्यों करें? –

3

एकमात्र बार आपको पुनर्व्यवस्थित करना चाहिए, बूलियन बीजगणित या डेमोरगन तब होता है जब तर्क इसे एक और तरीके से करने के लिए जटिल होता है। यदि यह बहुत जटिल नहीं है, तो इसे पठनीय रखें। तर्क को सरल बनाने के लिए एक मामला है।

कभी-कभी जब तर्क मुश्किल होता है तो मुझे तर्क को सरल बनाने के लिए Karnaugh Map बनाने की आवश्यकता होती है जिसे मैं लिख भी सकता हूं। अक्सर, के-मैप्स का उपयोग करके आप अपने तर्क को व्यक्त करने के अधिक संक्षिप्त तरीकों के साथ आने में मदद कर सकते हैं। परिणाम समझ में आता है या नहीं हो सकता है, लेकिन यह बराबर होगा।

और मैं यह भी कहूंगा कि डीमोरगन वास्तव में एक अनुकूलन नहीं है जो एक फर्क पड़ेगा, यदि आधे से अधिक शब्द नकारात्मक हैं (नहीं), तो आपको कुछ नॉट्स को हटाने का प्रदर्शन सबसे अच्छा होगा, जो प्रति सीपीयू के लिए एक ही निर्देश है। सबसे बुरी स्थिति में, आप जितनी दूर लेते हैं उतने नोट्स जोड़ सकते हैं, और यदि आपको डीमोर्गन का उपयोग नहीं करना चाहिए तो आपको पहले स्थान की तुलना में अधिक नोट्स मिलेंगे।

यदि आप तर्क को अनुकूलित करने जा रहे हैं, तो कुछ बूलियन बीजगणित, या मेरे व्यक्तिगत पसंदीदा K-Maps का उपयोग शर्तों की संख्या को कम करने के लिए करें (यदि संभव हो)। बस बुलियन ऑपरेटर को चारों ओर न चलाएं, यह मूर्खतापूर्ण है।

0

रखरखाव के साथ पहला सौदा, और high-level optimization

फिर निम्न-स्तरीय अनुकूलन से निपटें।

2

शॉर्ट सर्किट मूल्यांकन की उपस्थिति में स्वयं ही डीमोर्गन पूरी तरह से अप्रासंगिक हो सकता है।

return !(exp1 || exp2); 
return !exp1 && !exp2; 

if( exp1) return !(true); else return !(exp2); 
if(!(!exp1)) return false; else return !(exp2); 
not रों रद्द कर दिया और मुड़ा हुआ स्थिरांक साथ

को संकलित करने के लिए, इन समान हैं।

अधिक महत्वपूर्ण मामला मूल्यांकन का आदेश है; चीप चीजें डालें जो अभिव्यक्ति के सामने शॉर्ट सर्किट को ट्रिगर करने की संभावना है। संकलक आप के लिए यह अनुकूलित नहीं कर सकते क्योंकि यह कठिन है यह दुष्प्रभाव की तरह अर्थ मुद्दों का पता लगाने के लिए या बाद में अभिव्यक्ति पहले वाले के आधार पर अनुमान है, तो:

return validState() && checkAssumuingValidState(); 
0

सभी के लिए हमें गैर सीएस बड़ी कंपनियों:

wikipedia on De Morgan's laws:

डी मॉर्गन के कानूनों अर्थात् निषेध माध्यम से एक दूसरे के मामले में संबंधित तार्किक ऑपरेटरों "और" और "या" नियम, हैं:

+०१२३५१६४१०

नहीं (पी या क्यू) = (नहीं पी) और (नहीं क्यू)
नहीं (p और q) = (नहीं पी) या (नहीं क्यू)

0

डी मॉर्गन के नियम को कम करने के लिए उपयोगी है यह एक सामान्य रूप में, उदाहरण के लिए विस्फोटक सामान्य रूप (डीएनएफ) या संगत सामान्य रूप (सीएनएफ)। मूल रूप से इसका मतलब है कि यह या तो

DNF है: (एक और बी और सी) या (ई और एफ और जी) ...

या

CNF: (एक या ख या ग) और (ई या एफ या जी) ....

आप नॉट को निम्नतम स्तर पर फेंक सकते हैं।

मैं पिछले पोस्टर्स से सहमत हूं कि आपको पठनीयता और समझ के लिए अनुकूलित करना चाहिए।

1

सी # अनुकूलक वास्तव में तार्किक अभिव्यक्ति मूल्यांकन के लिए शॉर्ट सर्किटिंग नियमों को बहुत अधिक नहीं कर सकता है। तो डीमोर्गन के कानून को लागू करने से अधिक कुछ नहीं होगा जब तक कि यह आपको अन्य उपयोगी रिफैक्टरिंग देखने की अनुमति नहीं देता है (और निश्चित रूप से यह आपके कोड को स्पष्ट करने में मदद कर सकता है)।

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

if (costly_boolean_function() && cheap_often_false_boolean_function()) 

SQL क्वेरी अनुकूलक पाठ्यक्रम के एक मामले के रूप में ऐसा करते हैं, के बाद से एसक्यूएल शॉर्ट सर्किट नहीं है। एक क्वेरी ऑप्टिमाइज़र कम से कम महंगे परिस्थितियों को रखने के लिए आक्रामक रूप से संयोजन को फिर से व्यवस्थित करेगा (फॉर्म c1 AND c2 AND ... cn), क्योंकि वे अधिक महंगे लोगों का मूल्यांकन करने की आवश्यकता को झूठा और मोटापा कर सकते हैं।

3

बूलियन अभिव्यक्ति मूल्यांकन शॉर्टकट अर्थ विज्ञान का उपयोग करता है के बाद से, आप सामने से गणना करने के लिए subexpressions कि सस्ता है स्थानांतरित कर सकते हैं:

if (CountAllFilesOnDrive('C:\') > 7 && useFileScan) { ... } 

कॉल किसी भी समय महंगा expresison ewvaluated है चलेंगे, भले ही यह आवश्यक नहीं है । कि बयान चारों ओर मुड़ते फ़ाइल की जांच को छोड़ देता है, तो useFileScan गलत है:

if (useFileScan && CountAllFilesOnDrive('C:\') > 7) { ... } 

DeMorgan आप सामने करने के लिए "जल्दी बाहर निकलता है" ले जाते हैं, और इस तरह बेहतर औसत प्रदर्शन प्राप्त करने में मदद कर सकते हैं।

ध्यान दें कि बाएं से दाएं मूल्यांकन की गारंटी के कारण, अनुकूलक को अभिव्यक्ति को संशोधित करने की अधिक स्वतंत्रता नहीं है।

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

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