वहां केवल एक ही प्रकार का "if" कथन है। दूसरा एक सशर्त अभिव्यक्ति है। जिसके लिए बेहतर प्रदर्शन होगा: वे एक ही बाइटकोड को संकलित कर सकते हैं, और मैं उनसे अपेक्षा करता हूं कि वे समान रूप से व्यवहार करें - या इतने करीब हैं कि आप निश्चित रूप से प्रदर्शन के मामले में एक दूसरे को चुनना नहीं चाहते हैं।
कभी-कभी if
कथन अधिक पठनीय होगा, कभी-कभी सशर्त ऑपरेटर अधिक पठनीय होगा। विशेष रूप से, मैं सशर्त ऑपरेटर का उपयोग करने की अनुशंसा करता हूं जब दो ऑपरेंड सरल और दुष्प्रभाव रहित होते हैं, जबकि यदि दो शाखाओं का मुख्य उद्देश्य उनके दुष्प्रभाव हैं, तो शायद मैं if
कथन का उपयोग करता हूं। यहाँ
public class Test extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]
Code:
0: aload_0
1: arraylength
2: ifle 10
5: iconst_1
6: istore_1
7: goto 12
10: iconst_2
11: istore_1
12: return
public static void main2(java.lang.String[
Code:
0: aload_0
1: arraylength
2: ifle 9
5: iconst_1
6: goto 10
9: iconst_2
10: istore_1
11: return
}
आप देख सकते हैं, वहाँ एक मामूली बाईटकोड में अंतर है - istore_1
होता है या नहीं:
public class Test {
public static void main(String[] args) {
int x;
if (args.length > 0) {
x = 1;
} else {
x = 2;
}
}
public static void main2(String[] args) {
int x = (args.length > 0) ? 1 : 2;
}
}
Bytecode javap -c Test
साथ decompiled:
यहां एक नमूना कार्यक्रम और बाईटकोड है ब्रान्स के भीतर या नहीं (मेरे पिछले बेहद खराब प्रयास के विपरीत :) लेकिन अगर मैं जेआईटीटर अलग-अलग देशी कोड के साथ समाप्त हुआ तो मुझे आश्चर्य होगा।
स्रोत
2011-01-16 17:02:11
मुझे लगता है कि बिल्कुल कोई अंतर नहीं है। यह सिर्फ वाक्यविन्यास है। जब तक कि कंपाइलर्स कुछ हद तक बुरा न हो (या कुछ और) और मैं गलत हूं – sinelaw
क्या आपने (माइक्रो) इसे बेंचमार्क किया था? परिणाम साझा करें। – BalusC
दोनों को jit'ed मिल जाएगा। बिल्कुल कोई फर्क नहीं पड़ेगा। और सामान को अपनाना परेशान मत करो।पहली बात यह है कि HotSpot करता है ** javac द्वारा लागू किए गए सभी ** अनुकूलन को निकालना है। –