2011-02-05 6 views
8

मुझे किसी अन्य प्रकार के अंतर से अलग करने के लिए एक प्रकार के पैरामीटर के रूप में एक निहित में मार्कर के रूप में एक प्रकार (किसी भी प्रकार) का उपयोग करने की आवश्यकता है। यह अजीब है, लेकिन यह एक और सवाल हो सकता है।स्कैला का सबसे सस्ता प्रकार क्या है?

जब से मैं किसी भी प्रकार का उपयोग कर सकते हैं, मैं सबसे सस्ता एक का उपयोग कर के बारे में सोच रहा था, स्मृति पदचिह्न और प्रारंभ समय के संदर्भ में। यह इस मामले में प्रदर्शन को बहुत अधिक प्रभावित नहीं कर सकता है, लेकिन सवाल दिलचस्प है: स्कैला का सबसे सस्ता प्रकार कौन सा है?

जावा में, उत्तर स्पष्ट रूप से java.lang.Object है। लेकिन स्कैला में कुछ "रोचक" प्रकार हैं: Any, AnyVal प्रकार, और उनके आसपास संभावित अनुकूलन के साथ नीचे के प्रकार। Nothing प्रकार को तत्काल नहीं किया जा सकता है, इसलिए इसे इस तुलना से बाहर रखा गया है।

+3

दिलचस्प, मैंने कहा होगा कि जावा में सबसे सस्ता प्रकार एक साधारण int था। – Yahel

+0

मुझे यकीन नहीं है कि यह "सस्ता" कैसे है, लेकिन कुछ भी उपयोग करने योग्य नहीं हो सकता है: 'def x (_: कुछ भी नहीं) =(); एक्स (null.asInstanceOf [कुछ भी नहीं]) 'बस * नहीं * उस कुछ भी उपयोग करने की कोशिश नहीं करें :-) –

+0

"रूट" मुद्दे पर एक प्रश्न देखना भी दिलचस्प होगा। –

उत्तर

3

यदि आप Any या AnyVal चुनते हैं, तो आपके द्वारा पारित किसी भी आदिम को बॉक्स किया जाएगा, इसलिए शायद यह बाहर हो गया है।

AnyRef वास्तव में एक अच्छा विकल्प है।

यदि कोई प्रकार पैरामीटर नहीं चल रहा है, तो "primitives" भी अच्छे विकल्प हैं - Boolean या Int, उदाहरण के लिए।

और Null भी है, जो एक बहुत ही रोचक विकल्प है क्योंकि यह कुछ भी आवंटित नहीं करता है, और यह एक शाब्दिक है, इसलिए यह तेज़ होना चाहिए। यह जानने के बिना कि आप इसके साथ क्या कर रहे हैं, मैं यह नहीं बता सकता कि यह वैध विकल्प है या नहीं।

क्योंकि यह गारंटी देता है छोटे मानों के लिए संदर्भ समानता (आप डॉक्स की जाँच करने के क्या सटीक रेंज है देखने के लिए होगा), वहाँ कोई आवंटन शामिल है जिसका अर्थ है एक और दिलचस्प विकल्प, java.lang.Integer (स्थिर विधि valueOf का उपयोग) है।

+0

'java.lang.Integer' छोटे मानों के लिए संदर्भ समानता की गारंटी नहीं देता है। अभिव्यक्ति 'नया इंटीजर (5)' हमेशा एक नया अलग उदाहरण बनाता है। आप autoboxing के बारे में सोच रहे हो सकता है। 'इंटीजर i = 5' हमेशा एक ही ऑब्जेक्ट को' i' पर असाइन करेगा। –

+0

मैं 'नया' नहीं सोच रहा था। मैंने इसे अब स्पष्ट किया है, धन्यवाद। –

1

चूंकि स्कैला जावा के शीर्ष पर चलता है, इसलिए मुझे लगता है कि वही उत्तर स्कैला दुनिया में भी काम करेगा। प्रकार का एक स्कैला ऑब्जेक्ट किसी भी प्रकार का जावा ऑब्जेक्ट है।

जावा में मुझे लगता है कि एक प्राचीन प्रकार जैसे int, छोटा या बाइट ऑब्जेक्ट से सस्ता होगा, लेकिन उन प्रकारों को स्कैला में लपेटा/बॉक्स किया जा सकता है। (हालांकि नहीं 100% इस बारे में सुनिश्चित।)

अद्यतन

किसी कारण यह एक वस्तु और नहीं एक आदिम प्रकार हो गया है के लिए, स्ट्रिंग सबसे अच्छा, हो सकता है के बाद से तार वी एम में प्रशिक्षु रहे हैं । इसलिए आमतौर पर पूरे एप्लिकेशन में ऑब्जेक्ट का केवल एक उदाहरण होगा।

+0

"स्कैला कंपाइलर जावा सरणी, आदिम प्रकार, और मूल अंकगणित का उपयोग करता है जहां संकलित कोड में संभव है" ("प्रोग्रामिंग इन स्कैला" पुस्तक से) - ऐसा लगता है जैसे वे लपेट नहीं पाए जाते हैं (कम से कम रनटाइम के दौरान)। – Maxym

+0

रैपिंग से बचने के लिए कोड का विश्लेषण नहीं करना सिर्फ आलसी, आलसी कोडिंग होगा; तारों का 'इंटर्न' रिसाव प्रवण है और यह प्रदर्शन में सुधार नहीं करता है – bestsss

4

मुझे यकीन नहीं है कि मुझे "सबसे सस्ता प्रकार" के साथ क्या मतलब है ... जावा में सस्ता संख्यात्मक प्रकार स्मृति बाइट हो सकता है, लेकिन प्रदर्शन से पीओवी जावा int के साथ काम करने के लिए अनुकूलित किया गया है। असल में कई (या अधिक) भाषाओं को int (यहां तक ​​कि डीबी इंजन) के साथ काम करने के लिए अनुकूलित किया जाता है। स्कैला जेवीएम भाषा है, इसलिए मैं कहूंगा कि int का उपयोग करना बेहतर है।

अद्यतन: यदि प्रश्न उपयुक्त डेटा प्रकार के "चिह्नित/चिह्नित नहीं" के बारे में है, तो मैं बूलियन आदिम का उपयोग करूंगा।

यदि आप एक स्काला कार्यक्रम में बूलियन टाइप करें, प्रकार आप वास्तव में मिलेगा scala.Boolean है। या यदि आप फ्लोट टाइप करते हैं, तो आपको स्कैला मिलेगी। फ्लोट। जब आप bytecodes जावा के लिए अपने स्काला कोड संकलन है, तथापि, स्काला जावा के आदिम प्रकार के इन प्रकार जहां संभव प्रदर्शन प्राप्त करने के जावा के आदिम प्रकार के लाभों को संकलित कर देगा।

कुछ भी नहीं है एक किसी भी है, जो जावा में वस्तु की तरह है, और किसी भी वस्तु किसी भी आदिम प्रकार की तुलना में अधिक स्मृति की आवश्यकता

और btw, बूलियन का उपयोग कर के रूप में मार्कर प्राकृतिक है, यह आपके कोड पठनीयता में सुधार (और इसलिए दूसरों द्वारा समर्थन, समझना)। यहां तक ​​कि यदि कुछ और है, तो अधिक अनुकूलन मैं समयपूर्व अनुकूलन नहीं करता और बूलियन चुनता हूं।

+0

बाइट स्मृति में "एक" बाइट नहीं लेता है लेकिन इसे गठबंधन किया जाना चाहिए, इसलिए 4/8। अपवाद बाइट [] – bestsss

+0

@bestsss: सहमत है, मैं 1byte आकार के बारे में बात कर रहा था (यह जावडोक के अनुसार है जो 8 बिट के बारे में बताता है); दूसरी ओर यह वास्तव में कितना लेता है JVM कार्यान्वयन पर निर्भर करता है (जैसा कि मुझे पता है कि ओवरहेड है, http://stackoverflow.com/questions/229886/size-of-a-byte-in-memory-java के संदर्भ में भी)। कुछ जेवीएम बाइट प्रकार को 32 बिट नंबर के रूप में "इलाज" कर सकते हैं ... मैंने आपकी टिप्पणी के अनुसार अपना जवाब बदल दिया। धन्यवाद – Maxym

13

यह आपकी सटीक समस्या पर निर्भर करता है, लेकिन स्कैला में सबसे सस्ता निर्माण - या किसी भी भाषा में - ऐसा होना चाहिए जो बिल्कुल मौजूद नहीं है ...(कम से कम, रनटाइम पर नहीं)

मुझे Phantom Types पेश करने की अनुमति दें, जिससे संकलक स्थिर रूप से सही चीज करने की इजाजत देता है, लेकिन JVM को हिट करने से पहले शून्यता में मिटा दिया जाता है।

इसी तरह की नस में, आप किसी भी मार्कर फ़ील्ड की आवश्यकता के बिना आसानी से दो अलग-अलग टाइप की गई वस्तुओं को अलग कर सकते हैं। यह case object एस के लिए एक अच्छा उम्मीदवार है, और पैटर्न मिलान के साथ वास्तव में अच्छी तरह से काम करता है।

0

स्कैला प्राचीन प्रकार के लपेटता है, जब आप रैपर की विधि कॉल चलाते हैं, जो कि आदिम प्रकार लागू नहीं होता है। तो यानी। 1024 * 512 लपेटा नहीं गया है लेकिन 1024.toInt * 512 में 1024 लपेटा जा रहा है।

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