2011-08-15 11 views
5

मुझे यह निर्धारित करने की आवश्यकता है कि InetSocketAddress आईपीवी 6 या आईपीवी 4 कुशलतापूर्वक है या नहीं। ऐसा करने के लिए केवल दो तरीकों से मैं instanceof ऑपरेटर का उपयोग कर रहा हूं, या getAddress() की लंबाई की जांच कर रहा हूं (जो byte[] लौटाएगा)। ये दोनों आदर्श से कम हैं (instanceof धीमा है, और getAddress को सरणी की एक प्रति बनाना होगा)।यह निर्धारित करें कि कोई इनसेटसेट एड्रेस आईपीवी 6 या आईपीवी 4

क्या कोई बेहतर विकल्प है?

+3

[इस] के अनुसार [http://stackoverflow.com/questions/103564/the-performance-impact-of-using-instanceof-in-java), 'exampleof' आपके जैसा लगता है उतना धीमा नहीं हो सकता है। व्यक्तिगत रूप से, जब तक कि आपने अपना ऐप प्रोफाइल नहीं किया है और यह आपके रन टाइम का 5% लेने के उदाहरण के उदाहरण के बारे में है, तो मैं बाद में 'exampleof' को ऑप्टिमाइज़ करना बंद कर दूंगा। –

उत्तर

4

मुझे नहीं लगता कि आपको instanceof से कुछ भी तेज मिलेगा। इस विशेष मामले में, मैं उम्मीद करता हूं कि जेआईटी कंपाइलर इसे पॉइंटर्स की एक जोड़ी लोड करने और तुलना करने के लिए अनुकूलित करेगा; यानी लगभग 5 मशीन निर्देश।

लेकिन अगर instanceof मुझे समझने की तुलना में काफी धीमा है, तो यह बेहद असंभव है कि इसका आपके आवेदन के समग्र प्रदर्शन पर महत्वपूर्ण प्रभाव पड़ेगा।

मेरा सुझाव है कि आप केवल instanceof का उपयोग करें और यदि आप हार्ड सबूत इस बिंदु पर एक बाधा के हैं तो इसे अनुकूलित करने के लिए केवल परेशान हैं; जैसे एक यथार्थवादी वर्कलोड पर अपने आवेदन प्रोफाइलिंग से सबूत।

1

आप instanceof पसंद नहीं है, तो आप की कोशिश कर सकते:

Inet4Address.class.isAssignableFrom(IPtoCheck); 
Inet6Address.class.isAssignableFrom(IPtoCheck); 

मुझे नहीं लगता कि instanceof या इसके बाद के संस्करण की तुलना में एक तेजी से समाधान है।

+1

वह धीमा होगा कि 'exampleof'। जेआईटी कंपाइलर प्रतिबिंबित प्रकार की जांच को अनुकूलित करने में सक्षम नहीं है। –

1

इनेट एड्रेस बनाने के ऊपरी हिस्से की तुलना में अपने अंतर्निहित DNS ओवरहेड के ऊपर ओवरहेड के साथ अगर instanceof में से कोई भी मामूली है।

4

एक तेज़ समाधान प्रकारों की तुलना करना है। Inet4Address और Inet6Address प्रकार अंतिम हैं, इसलिए उन्हें उप-वर्गीकृत नहीं किया जा सकता है।

Inet4Address.class == IPtoCheck.getClass(); 
Inet6Address.class == IPtoCheck.getClass(); 

परीक्षण से पता चलता है कि इस दोगुनी गति से के रूप में instanceof तुलना में अधिक है और तुलना की जा रही, प्रकार से प्रभावित नहीं है जबकि Inet4 और Inet6 पर instanceof के प्रदर्शन को संबोधित करते अलग है।

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