फरसेर 2.x अस्थायी सदस्यों को सदस्य के रूप में क्यों रखता है और स्टैक पर नहीं है? (.NET)


10

अद्यतन: यह प्रश्न फारसी 2.x को संदर्भित करता है। नया 3.x ऐसा करने के लिए प्रतीत नहीं होता है।

मैं इस समय Farseer Physics Engine का उपयोग बड़े पैमाने पर कर रहा हूं, और मैंने देखा है कि यह वर्ग के सदस्यों के रूप में बहुत सारे अस्थायी मूल्य प्रकारों को संग्रहीत करने के लिए लगता है , और स्टैक पर नहीं जैसा कि कोई उम्मीद कर सकता है।

यहाँ Bodyवर्ग से एक उदाहरण है :

private Vector2 _worldPositionTemp = Vector2.Zero;

private Matrix _bodyMatrixTemp = Matrix.Identity;
private Matrix _rotationMatrixTemp = Matrix.Identity;
private Matrix _translationMatrixTemp = Matrix.Identity;

public void GetBodyMatrix(out Matrix bodyMatrix)
{
    Matrix.CreateTranslation(position.X, position.Y, 0, out _translationMatrixTemp);
    Matrix.CreateRotationZ(rotation, out _rotationMatrixTemp);
    Matrix.Multiply(ref _rotationMatrixTemp, ref _translationMatrixTemp, out bodyMatrix);
}

public Vector2 GetWorldPosition(Vector2 localPosition)
{
    GetBodyMatrix(out _bodyMatrixTemp);
    Vector2.Transform(ref localPosition, ref _bodyMatrixTemp, out _worldPositionTemp);
    return _worldPositionTemp;
}

यह अपने हाथ से प्रदर्शन अनुकूलन की तरह दिखता है। लेकिन मैं नहीं देखता कि यह संभवतः प्रदर्शन में कैसे मदद कर सकता है? (अगर कुछ भी मुझे लगता है कि यह वस्तुओं को बहुत बड़ा बनाकर चोट पहुंचाएगा)।

जवाबों:


6

यद्यपि .NET मान प्रकार स्टैक पर संग्रहीत किया जाता है, जिसके परिणामस्वरूप न्यूनतम आवंटन लागत होती है, लेकिन यह आरंभिक लागत को समाप्त नहीं करता है।

इस मामले में हमारे पास एक या दो अस्थायी मेट्रिसेस का उपयोग करते हुए फ़ंक्शन का एक सेट है, जिसके परिणामस्वरूप 16-32 फ़्लोट कॉल के साथ प्रारंभ हो जाएगा। हालांकि यह महत्वहीन लग सकता है, अगर तरीकों का अक्सर उपयोग किया जाता है (जैसे, प्रति फ्रेम हजारों और हजारों बार), कुल ओवरहेड का सार्थक प्रभाव हो सकता है। यदि इस तरह की तकनीक को इस तरह के सभी तरीकों में व्यवस्थित रूप से उपयोग किया जाता है, तो समाप्त ओवरहेड काफी हो सकता है।

जबकि इस तरह की तकनीक का उपयोग प्रति-ऑब्जेक्ट स्तर पर थ्रेड सुरक्षा प्रदान करने की क्षमता को समाप्त कर देता है, यह आमतौर पर इस तरह के एक दानेदार स्तर पर गारंटी प्रदान करने के लिए नासमझ है।


क्या अापको उस बारे में पूर्ण विशवास है? एक विचार मेरे पास था कि यह कॉल करने वाले निर्माणकर्ताओं से बचने के लिए हो सकता है। लेकिन मूल्य प्रकारों के लिए आपको एक निर्माता को कॉल करने की आवश्यकता नहीं है - डिफ़ॉल्ट पैरामीटर रहित निर्माता सहित - यदि आप सभी सदस्यों को सेट करने जा रहे हैं (या इसे एक outपैरामीटर के रूप में पास करते हैं )। मुझे पूरा यकीन है कि इस नियम का पूरा बिंदु यह है कि संकलक उस मेमोरी को शून्य करना छोड़ सकता है - ठीक है? ( स्टैक पॉइंटर को स्थानांतरित करने के लिए क्या यह वास्तव में धीमा है?)
एंड्रयू रसेल

हैरानी की बात है, नहीं? दुर्भाग्य से, यदि आप उत्पन्न आईएल का निरीक्षण करते हैं, तो अस्थायी मेट्रिसेस को प्रारंभ किया जाता है। कुछ त्वरित परीक्षणों से पता चलता है कि सदस्य-अस्थायी संस्करण ~ 10-15% तेज है।
जेसन कोज़ाक

1
मैं स्तब्ध हूं । "अंडरस्टैंडिंग एक्सएनए फ्रेमवर्क परफॉरमेंस" (जीडीसी २०० Sha) में शॉन हैरग्रेव स्ट्रक्चर के बारे में कहते हैं: "[जेआईटी] आमतौर पर यह पता लगाएगा : 'अगली पंक्ति में वह तुरंत सभी तीन क्षेत्रों [वेक्टर 3 का] सेट करता है, इसलिए मुझे इसकी आवश्यकता भी नहीं है। इसे शून्य करने के लिए " । मेरी जानकारी कहाँ से आ रही है। लेकिन अब फिर से सुनने पर, वह केवल "आमतौर पर" कहता है। प्रस्तुति में तत्काल अगला बिंदु यह है कि JIT डिबगर संलग्न के साथ अलग तरह से व्यवहार करता है, प्रदर्शन को प्रभावित करता है (आपने परीक्षण कैसे किया?)। इसके अलावा: वह यहाँ जेआईटी के बारे में बात कर रहा है, इसलिए शायद आईएल "अच्छा" (वेरिफ़िबिलिटी?) रहता है।
एंड्रयू रसेल

आईएल को परावर्तक के माध्यम से निरीक्षण किया गया था, और परीक्षण रिलीज़ में निर्मित आईडीई के बाहर चलाए गए थे (विंडोज पर, मेरे पास अब परीक्षण करने के लिए सीसी सदस्यता नहीं है)
जेसन कोज़ाक

1
इसके आधार पर - मुझे आश्चर्य है कि अगर उन सदस्य-अस्थायी static(और / या अधिक आक्रामक तरीके से उनका पुन: उपयोग ) करना बेहतर होगा (और यह कितना बेहतर होगा )। जैसा कि यह है, उदाहरण के लिए, Bodyफारसीर में वर्ग में "अनावश्यक" सदस्यों के कुछ 73 झंडे हैं।
एंड्रयू रसेल

-1

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

ईमानदारी से, अगर मुझे नियमित रूप से तीसरे पक्ष के ढांचे में इस तरह के कोड का सामना करना पड़ा, तो मैं शायद एक और रूपरेखा खोजने की कोशिश करूंगा।


3
वास्तव में इस सवाल का जवाब नहीं है।
ब्रायन ओर्टिज़

हाँ, सबसे अच्छा मैं कर सकता हूँ कि वह पागल नहीं है, और इस तरह से कोडित होने का कोई वास्तविक लाभ प्रतीत नहीं होता है। केवल सही इरादे का पता लगाना उस व्यक्ति से पूछना है जिसने कोड लिखा है :)।
माइक स्ट्रोबेल

धन्यवाद, माइक। मुझे संदेह होने लगा है कि मूल डेवलपर पागल है, मैं नहीं। लेकिन यह हमेशा जांचने में मदद करता है;)
एंड्रयू रसेल

थ्रेड सुरक्षा कभी-कभी प्रदान करने के लिए एक महंगी गारंटी हो सकती है, खासकर जब एक प्लेटफॉर्म के लिए एफपी कम्प्यूटेशन भारी पुस्तकालय लिखना जो सिम कार्ड निर्देशों का उपयोग नहीं करता है।
जेसन कोज़ाक

-1

360 पर जीसी मूल रूप से केवल जनरल 2 संग्रह करता है, जो महंगे हैं, इसलिए अस्थायी चर जो प्रत्येक फ्रेम (जैसे अस्थायी ऑब्जेक्ट) को बनाते और हटाते हैं, एक पूरे संग्रह को चलाने का कारण बनते हैं, जो प्रदर्शन को बहुत तेजी से मार देगा।

मुझे संदेह है कि उन्होंने इसे उस वस्तु के पुन: उपयोग के लिए किया और इसे एकत्र नहीं किया।


1
यह मेरे साथ भी हुआ, लेकिन अस्थायी सदस्य मूल्य प्रकार के प्रतीत होते हैं, इसलिए उन्हें प्रबंधित हीप पर वैसे भी आवंटित नहीं किया जाएगा।
माइक स्ट्रोबेल

2
सही है, लेकिन केवल अगर वे वर्ग के सदस्य हैं। यदि वे स्थानीय (विधि-विहीन) हैं, तो उन्हें स्टैक पर आवंटित किया जाएगा। सवाल यह है कि वे बस उस मार्ग पर क्यों नहीं गए।
माइक स्ट्रोबेल

1
@Blair - MSDN ( msdn.microsoft.com/en-us/library/bb203912.aspx ) के अनुसार Xbox360 .NET कॉम्पैक्ट फ्रेमवर्क का उपयोग करता है। ऐसा लगता है कि जीसी का अंतर उसी से संबंधित है, इसलिए मैं इस मामले पर आगे अनुसंधान के लिए प्रयास करूंगा।
लोगान किनकैद

1
@ ब्लेयर: @ लोगान किन्किद सही है। सीएफ का कचरा कलेक्टर नियमित रूपरेखा की तुलना में अलग व्यवहार करता है। XNA गेम स्टूडियो 3.0 अनलिस्टेड में इस विषय पर एक अच्छी बात है - हालांकि वह किताब जल्द ही 4.0 की रिलीज के साथ पुरानी हो जाएगी।
स्टीवन एवर्स

1
@ ब्लेयर: 360 (और CF के माध्यम से लक्षित अधिकांश उपकरणों) के सीमित स्मृति वातावरण के कारण, एक मार्क और स्वीप जीसी का उपयोग किया जाता है। परिणामस्वरूप, बहुत सारे छोटे आवंटन एक संग्रह को ट्रिगर करेंगे, और संग्रह का समय # संदर्भों के सापेक्ष है। यहाँ विवरण के बहुत सारे: download.microsoft.com/..//obility/…
जेसन Kozak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.