2008-08-29 15 views
5

मैं दो शर्तें (एक OR ऑपरेटर से अलग), स्थितियों की शर्तों कवर में से एक + 70% के साथ एक अगर बयान है और अब तक कम समय कार्रवाई करने के लिए ले जाता है/दूसरी शर्त से निष्पादित, में तो गति की रुचियां मैं केवल दूसरी शर्त को संसाधित करना चाहता हूं यदि पहली स्थिति गलत होने का मूल्यांकन करती है।अगर बयान हालत अनुकूलन

यदि मैं शर्तों को ऑर्डर करता हूं ताकि पहली स्थिति (तेज एक) पहले स्टेटमेंट में दिखाई दे - उन मौकों पर जहां यह स्थिति पूरी हो जाती है और सत्य का मूल्यांकन किया जाता है, दूसरी शर्त भी संसाधित होती है?

if ((condition1) | (condition2)){ 
    // do this 
} 

या मैं घोंसला दो की जरूरत है केवल करने के लिए बयान दूसरी शर्त की जाँच पहले गलत का आकलन करता है, तो होगा?

if (condition1){ 
    // do this 
}else if (condition2){ 
    // do this 
} 

मैं php में काम कर रहा हूं, हालांकि मुझे लगता है कि यह भाषा-अज्ञेयवादी हो सकता है।

उत्तर

9

सी, सी ++, सी #, जावा और अन्य .NET भाषाओं के लिए बूलियन अभिव्यक्तियों को अनुकूलित किया गया है ताकि जैसे ही पर्याप्त ज्ञात हो, कुछ भी मूल्यांकन नहीं किया जाता है।

समझ से परे कोड करने के लिए एक पुरानी चाल इस का उपयोग करने के बनाने के लिए करता है, तो इस तरह के रूप में बयान, था:

a || b(); 

अगर "एक" सच है, "ख()" का मूल्यांकन किया जा कभी नहीं होगा, तो हम कर सकते में पुनर्लेखन:

if(!a) 
    b(); 

और इसी तरह:

a && b(); 

बन जाएगा
if(a) 
    b(); 

कृपया पर ध्यान दें कि यह केवल || और & & ऑपरेटर। दो ऑपरेटर | और & क्रमशः बिटवाइज़ है या, और और, है, और इसलिए नहीं "अनुकूलित" कर रहे हैं।

संपादित करें: जैसा कि दूसरों द्वारा उल्लिखित है, शॉर्ट सर्किट तर्क का उपयोग करके कोड अनुकूलित करने का प्रयास करना बहुत ही कम समय बिताया जाता है।

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

दूसरा, अनुकूलन के लिए जाएं, लेकिन केवल समय और प्रोफाइलिंग के बाद। जिस तरह से कई डेवलपर प्रोफाइलिंग के बिना समयपूर्व अनुकूलन करते हैं।ज्यादातर समय यह पूरी तरह से बेकार है।

0

इस के बाद से मैं में झंकार जाएगा नास्तिक भाषा टैग है। पर्ल कम से कम, पहला विकल्प के लिए पर्याप्त है के लिए, मैं PHP से परिचित नहीं हूँ। यह बाएं से दाएं का मूल्यांकन करता है और जैसे ही स्थिति पूरी हो जाती है, उतनी ही बाहर निकलती है।

3

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

http://en.wikipedia.org/wiki/Short-circuit_evaluation

0

देखें सभ्य अनुकूलन के साथ सबसे अधिक भाषाओं में पूर्व ठीक काम करेंगे।

2

मैंने हाल ही में इस तरह के कई प्रश्नों को देखा है - एनएच डिग्री के अनुकूलन।

मुझे लगता है कि कुछ निश्चित परिस्थितियों में समझ में आता है:

  1. कम्प्यूटिंग हालत 2 एक निरंतर समय ऑपरेशन
  2. आप सख्ती से शैक्षिक उद्देश्यों के लिए पूछ रहे हैं नहीं है - आप, पता है कि कैसे काम करता है भाषा नहीं चाहते 3us बचाने के लिए।

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

जब कोई और (आप हो सकता है!) इस कोड को एक महीने या एक वर्ष में उठाता है, तो सबसे महत्वपूर्ण होने वाला क्या स्पष्टता है।

इस मामले में, आपका पहला उदाहरण छोटा, स्पष्ट है और आपको खुद को दोहराने की आवश्यकता नहीं है।

2

this article के अनुसार PHP शॉर्ट सर्किट मूल्यांकन करता है, जिसका अर्थ है कि यदि पहली स्थिति पूरी हो जाती है तो दूसरा मूल्यांकन भी नहीं किया जाता है। यह (लेख से) भी परीक्षण करने के लिए काफी आसान है:

<?php 
/* ch06ex07 – shows no output because of short circuit evaluation */ 

if (true || $intVal = 5) // short circuits after true 
{ 

echo $intVal; // will be empty because the assignment never took place 
} 

?> 
3

सी, सी ++ और Java, बयान में:

 
if (condition1 | condition2) { 
    ... 
} 

will evaluate both conditions every time and only be true if the entire expression is true.

The statement:


if (condition1 || condition2) { 
    ... 
} 

का मूल्यांकन करेंगे condition2 केवल तभी condition1 गलत है। अंतर 2 महत्वपूर्ण है यदि condition2 एक फ़ंक्शन या दुष्प्रभाव वाला एक अन्य अभिव्यक्ति है।

हालांकि, || केस और if/else केस के बीच कोई अंतर नहीं है।

0

| PHP में थोड़ा सा ऑपरेटर है। इसका मतलब यह नहीं है कि $a OR $b बिल्कुल ठीक है। आप डबल पाइप का उपयोग करना चाहेंगे। और हां, जैसा कि बताया गया है, PHP शॉर्ट-सर्किट मूल्यांकन करता है। इसी तरह, यदि && खंड की पहली शर्त गलत होने का मूल्यांकन करती है, तो PHP शेष खंड का मूल्यांकन नहीं करता है।

1

ऑप्टिमाइज़ेशन के प्रयोजनों के लिए शॉर्ट सर्किटिंग का उपयोग करते समय अक्सर ओवरकिल होता है, इसका उपयोग करने के लिए निश्चित रूप से अन्य अनिवार्य कारण हैं। ऐसा ही एक उदाहरण (C++) पीछा कर रहा है:

if(pObj != NULL && *pObj == "username") { 
    // Do something... 
} 

यहाँ, लघु-सर्किटिंग पर भरोसा किया जा रहा है यह सुनिश्चित करें कि pObj यह अपसंदर्भन से पहले आबंटित की गई है। यह if कथन निहित होने से कहीं अधिक संक्षिप्त है।

0

VB.net दो अद्भुत अभिव्यक्ति "OrElse" और कहा जाता है "andalso"

OrElse शॉर्ट सर्किट होगा ही पहली बार यह एक सच है मूल्यांकन पहुँचता है और कोड आप इच्छा पर अमल।

If FirstName = "Luke" OrElse FirstName = "Darth" Then 
    Console.Writeline "Greetings Exalted One!" 
End If 

andalso शॉर्ट सर्किट ही पहली बार यह एक झूठी मूल्यांकन और न ब्लॉक के भीतर कोड का मूल्यांकन करेंगे।

If FirstName = "Luke" AndAlso LastName = "Skywalker" Then 
    Console.Writeline "You are the one and only." 
End If 

मुझे ये दोनों उपयोगी लगता है।

+1

यह वही है || और क्रमशः, अन्य भाषाओं में & amp करते हैं। –

2

शॉर्ट-सर्किटिंग अनुकूलन के लिए नहीं है। इसका मुख्य उद्देश्य कॉलिंग कोड से बचना है जो काम नहीं करेगा, फिर भी एक पठनीय परीक्षण में परिणाम होगा। उदाहरण: अगर मैं सीमा से बाहर है

if (i < array.size() && array[i]==foo) ... 

ध्यान दें कि सरणी [i] बहुत अच्छी तरह से एक पहुँच उल्लंघन हो और कार्यक्रम क्रैश हो सकता है। इस प्रकार यह कार्यक्रम निश्चित रूप से मूल्यांकन को कम सर्किट करने पर निर्भर करता है!

मेरा मानना ​​है कि अनुकूलन चिंताओं की तुलना में इस तरह अभिव्यक्तियों को लिखने का यही कारण है।

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