2010-05-03 12 views
14

मैं पाठ्यक्रम 3354 कर रहा हूं (.NET Framework 2.0 में सिस्टम प्रकार और इंटरफेस को कार्यान्वित करना) और ऐसा कहा जाता है कि सदस्यों के चर और कार्यों के साथ सरल वर्गों के लिए, ओवरहेड की वजह से कक्षा से अधिक संरचना का उपयोग करना बेहतर होता है।"ओवरहेड"?

मैंने इस तरह की बात कभी नहीं सुना है, इस दावे की वैधता क्या है?

उत्तर

12

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

सी # structs के सदस्यों को अनुमति देते हैं, लेकिन वे एक अच्छा सा अलग तो वर्गों (subtyped नहीं किया जा सकता है, कोई आभासी प्रेषण, पूरी तरह से ढेर पर रह सकते हैं) काम करते हैं और व्यवहार उठाने, आदि के आधार पर बदल जाता है (लिफ्टिंग एक मूल्य प्रकार को ढेर में बढ़ावा देने की प्रक्रिया है - आश्चर्य!)

तो, प्रश्न का उत्तर देने के लिए: मुझे लगता है कि सी # में सबसे बड़े गलत नामकों में से एक "प्रदर्शन के लिए" structs का उपयोग कर रहा है। इसके लिए कारण 'ओवरहेड' को वास्तव में नहीं देखा जा सकता है कि यह बाकी प्रणाली और भूमिका के साथ कैसे बातचीत करता है, यदि नोट की कुछ भी है, तो यह खेलता है। इसके लिए प्रोफाइलिंग की आवश्यकता है और इस तरह के एक छोटे से कथन के साथ "कम ओवरहेड" के रूप में सारांशित नहीं किया जा सकता है।

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

+0

मुझे लगता है कि आप का मतलब है कि आपने कभी संरचना को परिभाषित नहीं किया है। आप शायद इसके बारे में सोचने के बिना रोज़ाना उनका इस्तेमाल करते हैं। – Gabe

+0

@Gabe सही, मैंने तय किया कि :-) –

+0

@pst: मुझे लगता है कि गेबे कहां कह रहा है "मैं कभी भी संरचना का उपयोग करने की अनुशंसा नहीं करता"। जाहिर है यह तुम्हारा मतलब नहीं है। –

0

संरचना एक मूल्य प्रकार है और कक्षा एक संदर्भ है। यह एक कारण हो सकता है।

1

सी # में, कक्षाएं और structs पूरी तरह से अलग जानवर हैं। वाक्यविन्यास दोनों के लिए लगभग समान है लेकिन व्यवहार पूरी तरह से अलग है (संदर्भ बनाम मूल्य)। एक संरचना का एक व्यक्तिगत उदाहरण समकक्ष वर्ग की तुलना में कम स्मृति का उपयोग करेगा, लेकिन एक बार जब आप संग्रह का निर्माण शुरू कर देते हैं या उन्हें चारों ओर गुजरते हैं, तो वैल्यू टाइप अर्थशास्त्र आपको प्रदर्शन के संदर्भ में मार देगा (और संभवतः मेमोरी खपत जो आप कर रहे हैं उसके आधार पर) संरचना में डेटा बहुत छोटा है। मुझे नहीं पता कि हार्ड नंबर क्या है लेकिन हम 8 बाइट्स या उससे कम के आदेश पर बात कर रहे हैं।

यह रखरखाव और पठनीयता के मामले में भी चोट पहुंचा सकता है क्योंकि दोनों समान दिखते हैं लेकिन बहुत अलग व्यवहार करते हैं।

+0

अनुशंसित आकार 16 बाइट से छोटा है। – ChaosPandion

+0

आह, धन्यवाद कैओसपैंडियन! –

+0

यह प्रदर्शन प्रकार हत्यारे के मूल्य प्रकारों के लिए अनुकूलक समर्थन की कमी थी। अब यह तय है (कम से कम x86 आर्किटेक्चर पर), आपको प्रदर्शन समस्याओं को देखने से पहले 128 बाइट्स ऊपर होना होगा। –

-1

structs आवंटित/डिलीकेट करने की कोई आवश्यकता नहीं है।

+1

-1: यह सी # में सच नहीं है। –

+0

@ जॉन सैंडर्स शायद आपके पास इसका संदर्भ है? मैंने जो कुछ भी पढ़ा है, वह इंगित करता है कि संकलक आपके लिए structs आवंटित और हटा देता है। आप अभी भी उन्हें प्रारंभ करते हैं, लेकिन यह एक अलग मुद्दा होगा। – Trisped

+0

कंपाइलर यह आपके लिए कर सकता है, लेकिन यह _does_ किया जाता है। –

0

रखने के लिए सरल प्रकार के लिए जहां आप मदद कर सकते हैं उनमें से कई हैं, विरासत की आवश्यकता नहीं है, और अपरिवर्तनीय होने के लिए एक अच्छे उम्मीदवार हैं, structs एक अच्छी पसंद है। इसके उदाहरण प्वाइंट, आयत, दशमलव, और दिनांक समय हैं।

यदि आपके पास उनमें से अधिकतर नहीं हैं, तो ओवरहेड अप्रासंगिक है और इसे आपके निर्णय में कारक नहीं होना चाहिए। यदि आपको कभी भी इसे प्राप्त करने की आवश्यकता होगी (या इसे व्युत्पन्न प्रकार बनाएं), तो इसे एक वर्ग होना चाहिए। यदि आइटम अपरिवर्तनीय नहीं हो सकता है, तो संरचना एक अच्छा उम्मीदवार नहीं है क्योंकि एक उदाहरण को म्यूट करने से इसकी कोई प्रतियां नहीं बदलेगी।

0

मेरा मानना ​​है कि सबसे अधिक उद्धृत ब्रेक-इवेंट पॉइंट आपकी संरचना में लगभग 12 बाइट डेटा है। तो उदाहरण के लिए, 3 पूर्णांक। मूल्य प्रकार और संदर्भ प्रकार के बीच का अंतर हालांकि अधिक मौलिक है, और आपको अपनी पसंद को उस पर आधारित कुछ सदस्यों के साथ बनाना चाहिए।

अगर कुछ बड़ा है, तो वर्ग :)

+0

ऑप्टिमाइज़र को पहले दो सर्विस पैक तय कर दिए गए थे, और अब 3 या 4 युगल (32 बाइट्स) कहने के साथ structs बहुत तेज़ हैं। नया ब्रेक-इवेंट पॉइंट थोड़ा बड़ा है, मुझे लगता है कि 128 बाइट्स। –

2

आप एक वर्ग के लिए समय की लगभग 95% का उपयोग करने जा रहे हैं। वैल्यू टाइप सेमेन्टिक्स आपको गधे में सड़क से नीचे की तुलना में अधिक बार काटते हैं।

यदि आप एक संरचना के साथ जा रहे हैं, तो सुनिश्चित करें कि यह अपरिवर्तनीय है।

+3

क्या आप समय के 5% structs का उपयोग करते हैं ?! : पी – Pedery

8

जब सी # बीटा में था, तो मुझे वर्ग और संरचना के बीच अंतर का प्रदर्शन करने के लिए इलाज किया गया। डेवलपर्स ने मंडलब्रॉट सेट व्यूअर बनाया था, जो इसके परिणाम को पूरा करने के लिए बहुत जटिल संख्याओं को पीसता है। पहले उदाहरण में, उन्होंने एक वास्तविक और कल्पनाशील क्षेत्र के साथ एक वर्ग के रूप में प्रतिनिधित्व जटिल संख्याओं के साथ कोड चलाया। फिर, उन्होंने class से struct शब्द बदल दिया और फिर से संकलित किया। प्रदर्शन में अंतर बहुत बड़ा था।

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

9

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

एमएसडीएन का पृष्ठ choosing between classes and structures पर एक पृष्ठ है।

सार है:

जब तक प्रकार निम्नलिखित विशेषताओं के सभी है एक संरचना को परिभाषित नहीं है:

  • यह तार्किक एकल मान, आदिम प्रकार के लिए इसी तरह का प्रतिनिधित्व करता है (पूर्णांक, डबल, और इतने पर)।
  • इसका एक उदाहरण आकार 16 बाइट से छोटा है।
  • यह अपरिवर्तनीय है।
  • इसे अक्सर बॉक्सिंग नहीं करना पड़ेगा।

वहाँ कभी कभी एक मामले में जहां एक प्रकार वास्तव में एक वर्ग होना चाहिए हो सकता है लेकिन आप इसे जरूरत प्रदर्शन के कारणों के लिए एक struct किया जाना है। यह दुर्लभ है और आपको यह सुनिश्चित करना चाहिए कि आप यह जान लें कि आप इस मार्ग को लेने से पहले क्या कर रहे हैं। यदि आप structs के लिए अपरिवर्तनीय दिशानिर्देश तोड़ते हैं तो यह विशेष रूप से खतरनाक हो सकता है। उत्परिवर्तनीय structs ऐसे तरीकों से व्यवहार कर सकते हैं जो अधिकांश प्रोग्रामर अपेक्षा नहीं करते हैं।

+5

और अब ऑप्टिमाइज़र स्ट्रक्चर एक्सेस (कम से कम x86 पर) को रेखांकित करने का समर्थन करता है, 16 बाइट्स की आकार सीमा अब उचित नहीं है। कहीं लगभग 128 बाइट्स शायद एक अच्छी नई ऊपरी सीमा है। –

0

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

1

एक नियम आप का अनुसरण कर सकते अपने आप को पूछने के लिए यह नहीं है, तो आप वास्तव में वास्तव में structs का उपयोग करने के अपने निर्णय सवाल करना चाहिए है, तो या नहीं, तुम क्या करने की कोशिश कर रहे हैं System.Date की तरह है।

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