2012-02-12 14 views
6

मैं वर्तमान में जहाजों के लर्निंग XNA 4.0 पढ़ रहा हूँ और मैंने देखा है कि लेखक एक struct मूल्य, प्रदर्शन के लिए कोई संबंध के साथ इस तरह के रूप Vector2 या Rectangle कई बार बनाने की संभावना है।प्रदर्शन को महत्व देता

उदाहरण के लिए, एक SquareCollision() विधि, कि दो खेल संस्थाओं के बीच टकराव की जाँच करता है किसी भी अधिक struct बनाने के बिना बस प्रत्येक खेल इकाई का अपना Rectangle क्षेत्र पकड़ और क्षेत्रों की तुलना होने के दो Rectangle रों हर बार यह कहा जाता है बनाता है, बजाय मान।

मैं कई स्थानों में इस पैटर्न में कई बार देखा है और है कि मुझे आश्चर्य बनाया:
struct मानों सी # में नगण्य के निर्माण है?
क्या यह वास्तव में माइक्रो-अनुकूलन अनुभाग के अंतर्गत आता है?

शायद क्योंकि मेरे अनुभव जावा के साथ ज्यादातर है, ValueType रों की अवधारणा मेरे लिए अजीब है, लेकिन ऐसा लगता है कि एक struct से एक मूल्य पुनः बनाने (और यह निर्माता है कह कर बुलाया) कई बार संसाधनों का एक विशाल बेकार की तरह लगता है।

+2

क्या आपने इसे प्रोफाइल करने का प्रयास किया था? –

+0

मुझे लगता है कि यह प्रोफ़ाइल के लिए थोड़ा मुश्किल है, क्योंकि वास्तव में महत्वपूर्ण बात यह है कि समग्र प्रदर्शन हिट होता है। यहां तक ​​कि यदि एक ही मूल्य को पुनर्निर्मित करना फ़ील्ड का उपयोग करने से 10,000 गुना धीमा है, तो यह अभी भी कम होगा यदि यह प्रदर्शन पर केवल 0.0001% हिट है। (मनमाने ढंग से संख्याओं के लिए खेद है, बस यह सुनिश्चित करने की कोशिश कर रहा हूं कि मुझे समझा जा रहा है।) जो मैं समझने की कोशिश कर रहा हूं वह यह है कि वास्तव में यह कितना बुरा है (अगर बिल्कुल) और क्या मुझे इसे करने से बचने की कोशिश करनी चाहिए या नहीं। – Acidic

+1

आप कोड को दिखाकर प्रश्न को थोड़ा और ठोस बना सकते हैं। गलतफहमी रोकता है। –

उत्तर

6

स्टैक पर संक्षिप्त उपयोग के लिए एक संरचना बनाना बहुत सस्ता है, और उन सभी मूल्यों के लिए स्थानीय चर सेट करने के लिए बहुत अलग नहीं है, लेकिन घटककरण के साथ। हालांकि, ऑब्जेक्ट के हिस्से के रूप में यह प्रति ऑब्जेक्ट के समान डेटा का एक अतिरिक्त डुप्लिकेट होगा।

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

यदि यह किसी ऑब्जेक्ट पर एक संपत्ति थी, तो आपको इसे कई बार कॉपी करना होगा।

यदि यह किसी ऑब्जेक्ट पर एक फ़ील्ड था, हाँ: इसे बिना किसी प्रतिलिपि के स्थान पर इस्तेमाल किया जा सकता है, लेकिन: यह ज्यादातर मामलों में अपेक्षाकृत छोटा है।

हमेशा की तरह, आपको यह जानने के लिए प्रोफ़ाइल की आवश्यकता होगी कि यह mattered है या नहीं।

+0

मुझे ऐसा लगता है कि संरक्षित का उपयोग करने के लिए है इस से बाहर एक ही रास्ता/सार्वजनिक ** क्षेत्रों ** यकीन है कि एक ही struct हर समय प्रयोग किया जाता है, बजाय इसे अनावश्यक रूप से डुप्लिकेट की जा रही बनाने के लिए। या शायद एक विधि जो 'ref' कीवर्ड का उपयोग करके संदर्भ द्वारा structs प्राप्त करता है? – Acidic

+0

@ एसीडिक यदि आप स्ट्रक्चर ** सीधे ** (एक चर आदि को असाइन नहीं करते) का उपयोग करते हैं, तो उसे प्रतिलिपि की आवश्यकता नहीं है; लेकिन हां - इस परिदृश्य में "रेफरी" के माध्यम से structs लेने वाले तरीकों काफी आम हैं। मैं कुछ पागल अनुकूलित स्थानों में खुद को उस दृष्टिकोण का उपयोग करता हूं। –

1

वह चीज़ जो आपके (कहें) Mesh ऑब्जेक्ट के अंदर उस संरचना को मूल रूप से लाभ नहीं पहुंचाएगी। अनुरोध के पल के कारण, संरचना का मूल्य कॉपी किया जाएगा। उदाहरण पर विचार करें:

public class Mesh 
{ 
    public Vector3 MeshCogVector {get;set}; 
} 

और कोड में कहीं आप तो अपने परिस्थितियों में इस तरह से उपयोग करते हुए

public void CollisionDetection 
{ 
    for(int i=0;....) 
    { 
     Mesh curmesh = listofmashes[i]; 
     Vector3 vec3 = curmesh.MeshCogVector; //value copied 

    } 
} 

है, तो आप मूल रूप से कोई लाभ नहीं मिलता है + आप अपने Mesh उदाहरण आकार में वृद्धि।

वास्तविक विधि के अंदर Vector3 उदाहरण का उपयोग/निर्माण करने के बजाय, वास्तव में आपको वास्तव में इसकी आवश्यकता होती है, तो आप स्टैक आवंटन और तेज़ कचरा संग्रह पर तेजी से प्राप्त करते हैं।

यदि आप संरचनाओं में प्रदर्शन से संतुष्ट नहीं हैं, तो डेटा के non safe सरणी का उपयोग करने पर विचार कर सकते हैं। लेकिन यह कुछ ऐसा है जिसे आपको मापना चाहिए, यह समझने के लिए कि क्या यह आपके लिए उपयुक्त परिदृश्य है।

+0

क्या यह हल नहीं किया जाएगा यदि मैं सार्वजनिक संपत्ति के बजाय सार्वजनिक क्षेत्र का उपयोग करता हूं? जैसा कि मैं इसे समझता हूं, संरचना गुण गेटटर कॉल पर संरचना की एक नई प्रति बनाते हैं। – Acidic

+0

@ एसिडिक: नहीं, यह कुछ भी नहीं बदलेगा। यह संपत्ति/फ़ील्ड/फ़ंक्शन रिटर्न पैरामीटर तक पहुंचने के तरीके के बारे में नहीं है, यह [सी # मान प्रकार] (http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx) के बारे में है। यदि आप 'ट्रिगर' कीवर्ड को 'CollisionDetection 'जैसे कार्यों को पास करने के लिए, कक्षा के अंदर' वेक्टर 'रखना चाहते हैं, तो आप ** ** कोशिश कर सकते हैं। इस मामले में, मूल्य की प्रतिलिपि नहीं बनाई जाएगी, लेकिन संदर्भ ** द्वारा ** पास की गई। लेकिन यह फिर से कुछ है, आपको मापना है। मैं जाऊंगा, अगर 'वेक्टर' वर्ग बड़ा नहीं है, तो आपके द्वारा पहले से देखे गए समाधान के लिए, इसलिए जब आवश्यक हो तो उस समय आवंटित किया जाए। – Tigran

+0

मुझे ऐसे प्रश्न पूछने से नफरत है, लेकिन * बड़ा * क्या है? एक 'वेक्टर 2' बड़ा नहीं हो सकता है, लेकिन 'वेक्टर 4' या' आयत 'के बारे में क्या है? मुझे लगता है कि * इस * केवल रूपरेखा के साथ उत्तर दिया जा सकता है ... – Acidic

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