2011-11-04 16 views
6

मैं वर्तमान में आने वाले संदेशों के प्रकारों को संभालने के लिए एक स्विच स्टेटमेंट का उपयोग कर रहा हूं जिसमें 20 या उससे अलग मामले हैं। इनमें से कुछ मामलों में परिमाण के आदेश दूसरों की तुलना में अधिक होने की संभावना है।कई मामलों के साथ जावा स्विच स्टेटमेंट अनुकूलित करना?

हॉटस्पॉट संकलक मामलों की जांच निष्पादित करने के लिए सही मामले को खोजने के लिए के आदेश अनुकूलित करने में सक्षम है या मैं अपने कोड की संरचना इतनी है कि सबसे आम मामलों पहले दिखाई देनी चाहिए:

switch(messageType) 
{ 
    case MOST_COMMON: 
     // handle it 
     break; 

... 
    case LEAST_COMMON: 
     // handle it 
     break; 
} 

सभी मामलों परस्पर अनन्य हैं ।

क्या मैं संदेश पैटर्न पर रणनीति पैटर्न और मानचित्र लुकअप का उपयोग करना बेहतर कर दूंगा?

प्रदर्शन महत्वपूर्ण चिंता है क्योंकि मैं प्रति सेकंड हजारों संदेशों को संभालने में सक्षम हूं और ऑब्जेक्ट सृजन और विधि कॉल ओवरहेड पर कटौती करने की कोशिश कर रहा हूं।

बहुत धन्यवाद,

क्रिस

संपादित करें: संकेत के लिए धन्यवाद। संदेश टाइप एक मूल्यवान श्रेणी के साथ एक int है, ऐसा लगता है कि यह "टेबलविच" बाइटकोड को संकलित करेगा, इसलिए मामलों को पुन: व्यवस्थित करने की आवश्यकता नहीं है। जब तक आप यह सुनिश्चित करें कि इस स्विच का बयान आप प्रदर्शन की समस्याओं, तो मैं सुझाव है कि आप समय से पहले ही अनुकूलित कर रहे खड़ी कर रहा है कर रहे हैं JVM कल्पना की

प्रासंगिक हिस्सा यहाँ http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14942

+1

आईआईआरसी अधिकांश कंपाइलर सी और सी ++ में लुकअप टेबल के साथ 'स्विच' कथन संभालते हैं। जावा एक ही काम कर सकता है। लेकिन मुझसे गलती हो सकती है। – NullUserException

+0

[जावा: यदि बनाम स्विच] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1061101/java-if-vs-switch) –

+0

JIT * निष्पादन के दौरान पथ को अनुकूलित करना चाहिए। मैं निश्चित रूप से देखने के लिए दोनों तंत्र प्रोफाइल होगा। –

उत्तर

3

है। इसके अलावा, the accepted answer to this question देखें।

+0

हाय माइक, पॉइंट लिया गया :) यह कोड संबंधित है प्रति दिन कुछ सौ मिलियन कार्यक्रम और कार्यक्रम के लिए लगभग 30% सीपीयू चक्र के लिए खाते हैं। जेवीएम स्पेक में गोता लगाने से पहले बस जेआईटी पर एक राय चाहिए। – ChrisWhoCodes

3

मामलों enum मान हैं या घनी int मूल्यों वितरित कर रहे हैं, तो आदेश एक बार JIT कम्पाइलर में लात मारता है यह सब चालू करने के लिए एक लुकअप तालिका में आप मदद नहीं करेगा के साथ mucking हैं।

यदि आप जावा 7 स्ट्रिंग स्विच या स्पर्सली वितरित मानों का उपयोग कर रहे हैं, तो सबसे सामान्य पहले जाना चाहिए क्योंकि यह if के कैस्केडिंग सेट में बदल जाता है-जैसे परीक्षण और शाखा संचालन।

+0

जावा 7 स्ट्रिंग स्विच के साथ यह धीमा हो जाएगा क्योंकि यह कथित तौर पर 'अगर' कथन की तरह बदल जाता है, यह कथन की तरह 'बराबर' का उपयोग करेगा – maks

+0

हाय माइक, स्विच मूल्यों की एक तंग सीमा के साथ एक int पर है, इसलिए मुझे लगता है कि जवाब है लुकअप टेबल और खंडों को पुन: व्यवस्थित करने की कोई आवश्यकता नहीं है। – ChrisWhoCodes

+0

@maks, मुझे लगता है कि मैं सहमत हूं। क्या आप मुझे मेरे उत्तर के एक हिस्से में इंगित करने की कोशिश कर रहे हैं जो सामान्य रूप से स्ट्रिंग स्विच पर गलत है या सिर्फ टिप्पणी कर रहा है? –

1

एक स्विच स्टेटमेंट यह निर्धारित करने के लिए एक लुकअप करता है कि कोड का कौन सा ब्लॉक कूदना है। यह अगर/अन्य जांच की श्रृंखला नहीं है और ब्लॉक घोषित किए गए आदेश का प्रदर्शन पर कोई प्रभाव नहीं पड़ता है। यानी वे सभी केस मान समान रूप से और एक बार चेक किए जाते हैं।

एक छद्म कोड के रूप में (एक छोटे पूर्णांक मूल्य श्रृंखला के लिए) एक ही

goto case_label[messageType.ordinal()]; 

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

सीपीयू शाखा भविष्यवाणी का उपयोग कर सकता है और यदि एक मामला अधिक आम है कि अन्य यह निष्पादन गतिशील रूप से अनुकूलित कर सकते हैं।

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