2009-11-25 17 views
18

मैं एक सरणी के माध्यम से पुनरावृत्ति कर रहा हूं और इसे सप्ताह के दिनों में मूल्यों से क्रमबद्ध कर रहा हूं।तेज़ क्या है: कई ifs, या अन्यथा?

ऐसा करने के लिए मैं कई if कथन का उपयोग कर रहा हूं। क्या यह प्रसंस्करण गति में कोई फर्क पड़ता है यदि मैं if एस का उपयोग करता हूं, तो else if कथन का एक सेट बनाम?

+1

मैं प्रसंस्करण गति के बारे में पता नहीं है, लेकिन आप इतने सारे ब्लॉक अगर है, तो हो सकता है आप एक स्विच कथन का उपयोग पर विचार करना चाहिए। विशेष रूप से एक सप्ताह के दिनों की तरह कुछ के लिए। –

+0

कई if-statement से बदलते समय एक बड़े कार्य परिवर्तन में परिवर्तन होता है यदि अन्यथा कथन। इस बारे में सोचें कि आपका कोड वास्तव में क्या करता है। –

उत्तर

41

हाँ, एक और को उपयोग करते हैं, निम्नलिखित कोड पर विचार करें:

if(predicateA){ 
    // 
} 
else if(predicateB){ 
    // 
} 
की
if(predicateA){ 
    //do Stuff 
} 
if(predicateB){ 
    // do more stuff 
} 

दूसरे मामले में यदि predicateA सत्य है, predicateB (और कोई और भविष्यवाणी) मूल्यांकन करने की आवश्यकता नहीं होगी (और इसलिए पूरा कोड तेजी से निष्पादित होगा), जबकि पहले उदाहरण में अगर predicateA टी है rue, predicateB का हमेशा मूल्यांकन किया जाएगा, और यदि आप predicateA और predicateB परस्पर अनन्य नहीं हैं तो आपको कुछ अप्रत्याशित आश्चर्य भी मिल सकते हैं।

+1

वास्तव में प्रदर्शन अंतर देखने के लिए पर्याप्त मात्रा में स्थितियों की आवश्यकता होगी, हालांकि +1 जैसा कि वैसे भी उचित तरीका होगा। – James

+5

असल में, आपका उदाहरण गलत है, क्योंकि अगर वे दोनों PredicateA और PredicateB को ठीक कर सकते हैं तो वे वही नहीं करेंगे। आप केवल पहले को निष्पादित करेंगे और बाहर निकलेंगे। जबकि पहला कोड दोनों निष्पादित करेगा। –

17

मुझे संदेह है कि इस तरह का माइक्रो ऑप्टिमाइज़ेशन आपके कोड में एक मापन योग्य अंतर देगा।

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

अद्यतन:

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

लेकिन एल्गोरिदम विकल्प के बारे में बिंदु अभी भी खड़ा है - जब तक कि आपका डेटा सेट बहुत छोटा न हो।

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

+5

अधिकांश सॉर्टिंग एल्गोरिदम ने नेस्टेड लूप या रिकर्सन का उपयोग किया है और किसी दिए गए सेट को सॉर्ट करने के लिए बहुत सी तुलना की है। कोड के इस महत्वपूर्ण भाग में कितनी तुलना कर रही है, इस पर निर्भर करते हुए, शुरुआती आउट और अनावश्यक तुलनाओं को छोड़ने से परिणामस्वरूप महत्वपूर्ण प्रदर्शन में वृद्धि हो सकती है। –

+1

सहमत, अच्छा बिंदु, यानिक। – duffymo

+1

अगर कोई अन्य सहायता पठनीयता भी नहीं है, साथ ही संकलक को एक सभ्य संकेत दे रहा है? –

3

else if इस अर्थ में तेज़ होगा कि जब तक आप किसी शर्त को सही नहीं करते हैं, तब तक आप तुलना करते हैं, और आप बाकी if एस छोड़ देते हैं।

अवरोही आवृत्ति के क्रम में तुलनाओं को फिर से करने पर विचार करें।

और उस ऑब्जेक्ट के डेटाटाइप के आधार पर switch कथन का उपयोग करके आप तुलना कर रहे हैं।

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

7

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

switch ($day) 
{ 
    case "Monday": 
     // do something with Monday 
     break; 
    case "Tuesday": 
     // do something with Tuesday 
     break; 
    case "Wednesday": 
     // do something with Wednesday 
     break; 
} 
+0

एक स्विच निश्चित रूप से कई ifs पर एक प्रदर्शन वृद्धि है! – Daniel

2

यदि मान पूर्णांक हैं तो आप तालिका लुकअप का उपयोग करके अनुकूलन प्राप्त कर सकते हैं। जैसे मान लें कि आपके पास 256 मान हैं जो किसी भी तरह से 7 दिनों में मैप करते हैं, आप 256 सेल्स के साथ एक सरणी सेट कर सकते हैं और प्रत्येक सेल में सप्ताह के दिन शामिल होता है।तब के बजाय:


if (value == 0) { 
    dayofweek = 1; 
} else if (value == 1) { 
    dayofweek = 2; 
} else if (value == 2) { 
    dayofweek = 3; 
} else if ... 

.. आप हो सकता था ..


dayofweek = lookuparray[value]; 
बेशक

, अगर आप इस तकनीक का प्रयोग है, तो आप मूल्य की सीमा से पहले जांच होनी चाहिए।

0

सामान्य रूप से, "अन्य अगर" शैली तेज हो सकती है क्योंकि ifs की श्रृंखला में, प्रत्येक शर्त एक दूसरे के बाद की जाती है; एक "अन्य अगर" श्रृंखला में, एक बार एक शर्त मिलान हो जाती है, बाकी को छोड़ दिया जाता है।

सबसे तेज़ एक टेबल प्रेषण होगा, जिसमें एक स्विच स्टेटमेंट अनुकूलित होता है जब इसमें पर्याप्त मामले होते हैं (यदि स्विच में कुछ मामले हैं, तो इसे किसी श्रृंखला में अनुवाद किया जाता है - अन्य चेक इन परिणामी मशीन कोड)।

0

कई if-statement या एक if-elseif-elseif का उपयोग करने का निर्णय ... प्रदर्शन पर भरोसा नहीं करना चाहिए, क्योंकि इस निर्णय में प्रोग्राम प्रवाह बड़े पैमाने पर शामिल है।

मुझे संदेह है कि यदि आप कार्यक्षमता खोने के बिना कई बड़े-से-कथन से स्विच कर सकते हैं तो अन्यथा से स्विच कर सकते हैं।

यह एक डिज़ाइन प्रश्न है, एक परफॉर्मेंस नहीं।

9

आप phpbench

पर एक नज़र हो सकता है लेकिन अगर आप इस स्तर पर अनुकूलित करना चाहते हैं ईमानदारी से, आप php से कुछ और जानने के लिए चाहते हो सकता है।

alt text

0

मैं बजाय एक स्विच() बयान के लिए चयन के लिए में एक और वोट डालेंगे।

2

मैं अगर वहाँ लगातार अगर() और अगर (के बीच एक सच्चे अंतर) में कुछ elseif()

मैं एक बड़ी स्ट्रिंग डाल दिया और (X100 000) के बारे में 20 strpos (हर बार किया था) है तो एक बेंचमार्क बनाया दो विधियों के साथ और यह परिणाम दिखाया:

Try 1 : 0.5094 (including elseif) 
Try 2 : 0.6700 (including only if) 

इसमें कोई संदेह नहीं है। मुझे पहले से ही पता था कि ससुराल() तेजी से थे, भले ही बीच में वापसी हो; उत्तर में कुछ आंकड़े रखना अभी भी अच्छा है।

0

यह प्रश्न विशेष रूप से दिलचस्प है जब if ब्लॉक इस प्रकार विधि को समाप्त करता है। यह जावा काम में तुलनित्रों के तरीके पर सीधे लागू होता है।

मैं इस प्रकार प्रत्येक विधि चलाने (bellow) 250.000.000 बार और परिणाम इस प्रकार हैं है:

two values if/else - 6.43 millis 
three values if/else/if - 8.66 millis 
three values if/if  - 9.01 millis 

सबसे खराब स्थिति में 1.4 गुना सबसे अच्छा एक से अधिक समय लेता है जबकि सूचना है कि यह है 250 मिलियन बार इन तरीकों में से प्रत्येक को फिर से शुरू करने के कुल योग। यह मानते हुए कि मानव के लिए देरी को समझने में 100 मिलियन लगेंगे और सबसे खराब/बेहतर अंतर 2.58 मिलियन है, इसका मतलब यह होगा कि आपको विभिन्न विधियों के बीच अंतर को समझने के लिए लगभग एक ट्रिलियन (1000 * 1000 मिलियन) पुनरावृत्तियों की आवश्यकता होगी।

यह संक्षेप अप: उपयोग if-else यह उन मामलों में जहाँ सबसे तेजी से विकल्प भी अधिक स्पष्टता और त्रुटि-रहित होता के साथ एक है में से एक है।

// methods used to measure difference between if and if/else 

/** equality is not important **/ 
private static int comparatorOfIfElse(int a, int b) { 
    if(a < b) return -1; 
    else return 1; 
} 

/** equality is taken into account using if/else **/ 
private static int comparatorOfIfElseIf(int a, int b) { 
    if(a < b) return -1; 
    else if(a > b) return 1; 
    return 0; 
} 

/** equality is taken into account using only if **/ 
private static int comparatorOfIf(int a, int b) { 
    if(a < b) return -1; 
    if(a > b) return 1; 
    return 0; 
} 
संबंधित मुद्दे