2012-03-04 10 views
7

क्या मुक्केबाजी और अनबॉक्सिंग में समान प्रदर्शन होता है? या अनबॉक्सिंग तेज है, मान लें?क्या मुक्केबाजी और अनबॉक्सिंग में समान प्रदर्शन होता है?

(हाँ, आप कुछ समय के लिए मुख्य कारण की व्याख्या कर सकते हैं।)

धन्यवाद

+1

मैं मुश्किल तथ्यों की जरूरत नहीं है, लेकिन मैं थोड़ा तेजी से होने की unboxing उम्मीद करेंगे। जब आप किसी मान प्रकार को बॉक्स करते हैं, तो एक नई ऑब्जेक्ट बनाई जानी चाहिए और मान को नई ऑब्जेक्ट में कॉपी करना होगा। अनबॉक्सिंग करते समय, केवल बॉक्स को बॉक्स किए गए उदाहरण से कॉपी किया जाना चाहिए। तो मुक्केबाजी एक वस्तु का निर्माण जोड़ता है। हालांकि, यह वास्तव में .NET में तेज़ है, इसलिए अंतर शायद बहुत बड़ा नहीं है। यदि आपको अधिकतम गति की आवश्यकता है तो पूरी मुक्केबाजी प्रक्रिया को पहली जगह से बचने का प्रयास करें। याद रखें कि मुक्केबाजी उन वस्तुओं को बनाती है जिन्हें कचरा कलेक्टर द्वारा साफ करने की आवश्यकता होती है। –

+0

मैं और अधिक ठोस ज्ञान के साथ किसी एक वास्तविक जवाब लिखने के लिए इंतजार करेंगे, लेकिन unboxing स्मृति आवंटन को शामिल नहीं करता है, इसलिए यह _should_ काफ़ी कम भूमि के ऊपर है, दोनों तुरंत और कचरा कलेक्टर के लिए लंबे समय में। –

+2

(cont'd): और अंत में (अधिक सामान्य संकेत के रूप में): यदि आप कठिन तथ्यों चाहते हैं तो हमेशा अपने विशिष्ट उपयोग मामले के लिए अपना खुद का माप करें। वास्तविक गर्म स्थानों की पहचान करें और समय-समय पर अनुकूलित करने का प्रयास न करें। –

उत्तर

10

यह आंशिक रूप से आप "बॉक्स से निकालना" द्वारा क्या मतलब है निर्भर करता है। आईएल शब्दों में, वास्तव में अनबॉक्सिंग सी # में उससे थोड़ा कम करता है। सी # में, "बॉक्स से निकालना" हमेशा नकल मूल्य कहीं शामिल है, जबकि आईएल में यह केवल बॉक्स के प्रकार की जाँच और मूल्य उपलब्ध कि जिस तरह से बनाने का मतलब है।

वे विभिन्न प्रदर्शन विशेषताओं हालांकि मिल गया है: मुक्केबाजी एक नई वस्तु के आवंटन, लेकिन कोई प्रकार की जाँच की आवश्यकता है।

अनबॉक्सिंग आईएल स्तर पर वास्तव में केवल जांच करने के लिए है कि वस्तु क्या तुम सच में Unbox की कोशिश कर रहे एक ही प्रकार के (या एक संगत एक) की एक बॉक्स्ड मूल्य है की जरूरत है। फिर आपको अनबॉक्सिंग के सी # संस्करण में वैल्यू कॉपी ऑपरेशन जोड़ने की आवश्यकता है।

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

हमेशा की तरह, आपको अपने वास्तविक कोड के संदर्भ में संचालन की प्रदर्शन लागत का मूल्यांकन करना चाहिए। मुझे सबसे आधुनिक .NET अनुप्रयोगों में मुक्केबाजी और अनबॉक्सिंग की लागत की अपेक्षा नहीं है, जहां जेनेरिक आपको संग्रह आदि से बचने की अनुमति देते हैं।

+0

इस तथ्य को इंगित करने के लायक हो सकता है कि अंततः एक या अधिक मशीन शब्दों के रूप में किसी भी मूल्य प्रकार को हमेशा पढ़ने के दौरान कॉपी किया जाना चाहिए। आईएल निर्देश 'isinst' को कहा मूल्य (ओं) की एक प्रति, और इसी तरह किसी भी संकलित सी # कोड करना चाहिए। ऑपरेशन के अर्थशास्त्र का वर्णन करते समय आपका कथन "स्टैक पर उपलब्ध मूल्य] बनाता है, लेकिन यह आसानी से व्याख्या किया जा सकता है, हालांकि इसे आसानी से व्याख्या किया जा सकता है, हालांकि आप इसे" मुफ्त में प्राप्त करेंगे ", जो शायद विषय को महत्व देने के लिए महत्वपूर्ण है –

0

जहां तक ​​मुझे पता है, बॉक्सिंग से अनबॉक्सिंग बहुत सस्ता है। इस पर विचार करें:

Int32 v1 = 5; 

v1 ढेर पर आवंटित किया जाता है।

Object r = v1; // boxing 

संकलक v1 का मूल्य लेता है और उस पर आधारित एक वस्तु बनाता है। इसमें कुछ समय लगता है (कई कारणों से)।

हालांकि, जब इस कोड निष्पादित होने

Int32 v2 = r; //unboxing 

क्या होता है, कि संकलक मूल्य r में बॉक्सिंग में ही है और फिर इसे v2 को प्रतियां के लिए सूचक प्राप्त करता है।

0

बहुत सामान्य शब्दों में, वहाँ कुछ बुनियादी कारकों एक कचरा एकत्र वातावरण में मुक्केबाजी और unboxing प्रदर्शन को निर्धारित कर रहे हैं।

आइए मान लें कि हम एक 64-बिट पूर्णांक (उदा। long सी # में) के बारे में एक x64 मशीन पर बोल रहे हैं। आइए आगे यह मान लें कि यह कचरा कचरा संग्रह का उपयोग कर एक स्टैक-आधारित वर्चुअल मशीन के अंदर होता है।

सबसे पहले, दूसरे के लिए एक स्थान से स्मृति की किसी भी राशि हिलाने की लागत है। रनटाइम को एक बॉक्स वाले पूर्णांक के वास्तविक मूल्य को स्टैक पर प्रतिलिपि बनाना चाहिए, ताकि हम इसके साथ कुछ उपयोगी कर सकें। इसी प्रकार, विपरीत मामले में, इसे मूल्य को ढेर से ढेर तक कॉपी करना होगा (जहां संदर्भ प्रकार संग्रहीत किए जाते हैं)। यह एक काफी शामिल ऑपरेशन है जो हार्डवेयर के उपप्रणाली को छूता है।जहां तक ​​हम चिंतित हैं, इस कारक को एक निश्चित लागत माना जा सकता है, दोनों परिचालनों के लिए समान है।

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

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

चौथा, हमारे बॉक्स्ड पूर्णांक के छिपे हुए लंबे समय तक लागत है कि यह किसी भी अन्य संदर्भ प्रकार की तरह, कचरा संग्रहण में भाग लेने चाहिए। इसका मतलब यह है कि इसके संदर्भों को रिकॉर्ड करना पड़ सकता है, इसे लचीलापन निर्धारित करने के लिए पता लगाया जाना चाहिए और संभावित रूप से एक अलग पीढ़ी की प्रतिलिपि बनाने की आवश्यकता है। हालांकि यह सभी संदर्भ प्रकारों के लिए निश्चित रूप से सच है, यह विचार करने का एक कारक है कि क्या हम इस स्तर पर प्रदर्शन के बारे में सोच रहे हैं।

सारांश में, लागत निश्चित रूप से हार्डवेयर है कि हम पर चल रहे हैं और साथ ही संकलक, क्रम के संस्करण-विशिष्ट व्यवहार की एक संख्या पर निर्भर करता है। इसलिए सीधा जवाब देना आसान नहीं है।

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