2012-12-30 18 views
12

संभव डुप्लिकेट:
What is the relative performance difference of if/else versus switch statement in Java?"स्विच" से धीमा "अगर" धीमा क्यों है?

निम्नलिखित दो तरीकों को देखते हुए:

public static int useSwitch(int i) { 
    switch (i) { 
    case 0: 
     return 1; 
    default: 
     return 0; 
    } 
} 

public static int useIf(int i) { 
    if (i == 0) 
     return 1; 
    return 0; 
} 

परीक्षण से पता चलता है कि switch मामूली तेजी कार्यान्वित (मेरी मशीन पर प्रति कॉल 1.4 नैनोसेकंड) if संस्करण से अधिक।

मैं हमेशा मानना ​​था कि एक स्विच के लाभ में लात नहीं था जब तक कम से कम कुछ ifs बचा जा सकता है,

क्यों switch एक भी if की तुलना में तेजी है?

+4

क्या आप जानते हैं कि वे संकलित कैसे दिखते हैं? शायद आप वहां अपना जवाब पा सकते हैं। – user1306322

+2

@ user1306322- यह जांचने के लिए भी गहराई से देखना होगा कि JVM उस बाइटकोड को कैसे व्याख्या या संकलित कर रहा था। पहला कोड शायद 'लुकअपविच' या 'टेबलविच' निर्देश का उपयोग करेगा, जबकि दूसरा सामान्य कूद का उपयोग करेगा। यह उन्हें तेजी से काम करने के लिए जेवीएम तक है। – templatetypedef

+3

क्या आप अपना बेंचमार्किंग कोड पोस्ट कर सकते हैं? –

उत्तर

7

बाईटकोड परिणाम के रूप में की उम्मीद है की जाँच के द्वारा:

स्विच

public static useSwitch(I)I 
L0 
    ILOAD 0 
    TABLESWITCH 
    0: L1 
    default: L2 
L1 
    INVOKESTATIC Tests.a()I 
    IRETURN 
L2 
    INVOKESTATIC Tests.b()I 
    IRETURN 

यदि

public static useIf(I)I 
L0 
    ILOAD 0 
    IFNE L1 
L2 
    INVOKESTATIC Tests.a()I 
    IRETURN 
L1 
    INVOKESTATIC Tests.b()I 
    IRETURN 

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

क्या आप निश्चित रूप से सब कुछ प्रोफाइल करना सुनिश्चित कर रहे हैं? (जेवीएम को गर्म करने के लिए समय देकर, केवल आत्मविश्वास सीमा के भीतर परिणाम और अन्य सभी चीजें जो पर्याप्त उपयोग करने के लिए पर्याप्त सही प्रोफाइलिंग कर रही हैं)

+0

मुझे कबूल करना होगा कि कई बार परीक्षण चलाने के बाद, * कभी-कभी * स्विच की तुलना में तेज़ होता है। अंतर के बारे में आपकी कोई टिप्पणी नहीं होने के बारे में आपकी टिप्पणी को आगे के परीक्षण के साथ जो मिला वह दर्शाता है – Bohemian

0

इस प्रकार की तुलना If-else vs switch – Which is better? में विश्लेषण की जाती है। हालांकि, gcj का उपयोग करके देशी कोड को संकलित करने का प्रयास करें और बाइटकोड के उपयोग से परिणाम के साथ प्राप्त परिणामों की तुलना करें।