2012-08-24 13 views
7

मुझे पता है कि जावा में स्विच कथन का उपयोग तब नहीं किया जाना चाहिए जब आपके पास कुछ मामले हों, और इस मामले में यह बेहतर है if else ifग्रोवी 'स्विच' बनाम 'अगर' प्रदर्शन

क्या यह ग्रोवी के लिए भी सच है?

इन दोनों कोड के बीच अधिक प्रदर्शन कौन सा है?

myBeans.each{ 
    switch it.name 
    case 'aValue': 
     //some operation 
    case 'anotherValue: 
     //other operations 
} 

या:

myBeans.each{ 
    if(it.name == 'aValue'){ 
     //some operation 
    } 
    else if (it.name =='anotherValue){ 
     //other operations 
    } 
} 
+3

क्या यह एक वास्तविक चिंता है या सिर्फ जिज्ञासा है? यह संभव नहीं है कि वास्तविक एप्लिकेशन में कहीं भी प्रदर्शन बाधा होगी। यदि आप वास्तव में उत्सुक हैं, तो आप कुछ परीक्षण क्यों नहीं चलाते और पता लगाते हैं? –

+0

यह जानने के लिए जिज्ञासा थी कि जब मैं _switch_ – rascio

उत्तर

13

जावा में, "स्विच" धारावाहिक की तुलना में अधिक effient है अगर ब्लॉक क्योंकि संकलक एक tableswitch अनुदेश जहां लक्ष्य एक कूद मेज से निर्धारित किया जा सकता उत्पन्न करता है।

ग्रोवी में, स्विच पूर्णांक मानों तक ही सीमित नहीं है और इसमें बहुत से अतिरिक्त अर्थशास्त्र हैं, इसलिए संकलक उस सुविधा का उपयोग नहीं कर सकता है। कंपाइलर तुलना की श्रृंखला उत्पन्न करता है, जैसे ब्लॉक के लिए सीरियल के लिए ऐसा होगा।

हालांकि, प्रत्येक तुलना के लिए ScriptBytecodeAdapter.isCase(switchValue, caseExpression) कहा जाता है। यह CaseExpression ऑब्जेक्ट पर isCase विधि के लिए हमेशा एक गतिशील विधि कॉल है। यह कॉल संभावित रूप से ScriptBytecodeAdapter.compareEqual(left, right) से अधिक महंगा है जिसे एक तुलना के लिए बुलाया जाता है।

तो ग्रोवी में स्विच आमतौर पर ब्लॉक के सीरियल से अधिक महंगा होता है।

+1

जिज्ञासा से बाहर हूं, तो क्या आप जानते हैं कि स्थिर संकलन का उपयोग करके ग्रोवी 2.0 में इसके बारे में क्या परिवर्तन है? – cdeszaq

+0

दिलचस्प सवाल, मैंने अभी इसे चेक किया है। जैसा कि मैंने उम्मीद की थी, यह स्क्रिप्टबाइटकोड एडाप्टर में कॉल नहीं बदलता है। तो हालांकि @CompileStatic चयनित विधि में स्थैतिक विधि आमंत्रण, "स्विच" और "अगर" अभी भी ScriptBytecodeAdapter के माध्यम से गतिशील विधि कॉल में खींचें। –

+0

मुझे आश्चर्य है कि यह संभव गति अनुकूलन के लिए जगह नहीं है? – cdeszaq

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