.NET प्रतिबिंब कितना महंगा है?


210

मैं लगातार सुनता हूं कि प्रतिबिंब कितना खराब है। जबकि मैं आम तौर पर प्रतिबिंब से बचता हूं और शायद ही कभी ऐसी स्थितियां पाता हूं जहां इसके बिना मेरी समस्या को हल करना असंभव है, मैं सोच रहा था ...

उन लोगों के लिए जिन्होंने अनुप्रयोगों में प्रतिबिंब का उपयोग किया है, क्या आपने प्रदर्शन हिट को मापा है और क्या यह वास्तव में इतना बुरा है?


आप इस प्रश्न की जाँच करना चाहते हैं। stackoverflow.com/questions/224232/…
smaclell

1
Api का उपयोग fastflect.codeplex.com पर करें। यह गेटर्स / सेटर / इनवोकर्स और कुछ अन्य सामानों के लिए 500x की तरह प्रतिबिंब को गति देगा। स्रोत और जानकारी कि यह कैसे काम करता है, अगर आपको इसे विस्तारित करने की आवश्यकता है तो भी।
ब्रैंडन मूर

3
2014 में यह जानकारी कैसे जांची गई? इन 4 सालों में कुछ भी बदला?
अर्नथोर

1
किसी इंस्टेंस प्रॉपर्टी को वैल्यू असाइन करने का सरल कार्य लगभग 150 बार धीमा होता है, इसे प्रतिबिंब के साथ करते हुए (PropertyInfo.SetValue (उदाहरण, मान)) सीधा कोडिंग के साथ होता है (उदाहरण
.property

जवाबों:


130

यह है। लेकिन यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

मैं प्रतिबिंब को गतिशील रूप से लोड असेंबलियों (प्लगइन्स) में उपयोग करता हूं और इसके प्रदर्शन "जुर्माना" कोई समस्या नहीं है, क्योंकि ऑपरेशन कुछ ऐसा है जो मैं एप्लिकेशन के स्टार्टअप के दौरान करता हूं।

हालांकि, यदि आप प्रत्येक पर प्रतिबिंब कॉल के साथ नेस्टेड छोरों की एक श्रृंखला के अंदर दर्शा रहे हैं, तो मैं कहूंगा कि आपको अपना कोड फिर से आना चाहिए :)

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


मैं कोशिश, कैच में त्रुटि को लॉग करने के लिए वर्तमान विधि के वर्ग नाम पाने के लिए प्रतिबिंब का उपयोग कर रहा हूं। मूल रूप से त्रुटि लॉगिंग करते समय फ़ंक्शन नाम को हार्डकोड करने से बचने के लिए। क्या मुझे चिंता करने की जरूरत है?
संग्राम नंदखिले

@Sangram नोप, यह ठीक है
कार्तिक AMR

@Sangram नहीं, जब तक कि आपको बहुत सी त्रुटियां नहीं होती हैं जिन्हें लगातार पकड़ने की आवश्यकता होती है, जो तब एक अलग समस्या होनी चाहिए :)
मार्टिन मार्कोसिनी

5
@Sangram जबकि प्रतिबिंब प्रदर्शन आपके मामले में मुद्दा नहीं होना चाहिए, ऐसा लगता है कि आप पुन: लागू करने की कोशिश कर रहे हैं जो सादे पुराने अपवाद बॉक्स के बाहर बहुत अधिक सुरुचिपूर्ण तरीके से प्रदान करते हैं ...
Jacek Gorgoń

152

जेफ रिक्टर ने द परफॉरमेंस ऑफ एवरीडे थिंग्स में अपनी बात करते हुए बताया कि परावर्तन द्वारा एक विधि को कॉल करना सामान्य रूप से कॉल करने की तुलना में लगभग 1000 गुना धीमा है।

जेफ की नोक: यदि आपको कई बार विधि को कॉल करने की आवश्यकता है, तो इसे खोजने के लिए एक बार प्रतिबिंब का उपयोग करें, फिर इसे एक प्रतिनिधि को सौंप दें , और फिर प्रतिनिधि को बुलाएं।


18
मैंने Devscovery में भी भाग लिया है, और .NET 3.5 के लिए इन परिणामों के साथ जुट गया हूं। .NET 4 के लिए Devscovery के प्रदर्शन बेंचमार्क कार्यक्रम को फिर से जमा करना भारी सुधार दिखाता है! लागत 100 गुना धीमी हो जाती है। टाइपोफ़ () लुकअप के लिए प्रतिबिंब का उपयोग .NET 3.5 और .NET 4 के बीच अपरिवर्तित है
जॉन विगियर

61

प्रतिबिंब प्रदर्शन कार्यान्वयन पर निर्भर करेगा (दोहराए गए कॉल को कैश किया जाना चाहिए जैसे:) entity.GetType().GetProperty("PropName")। चूँकि अधिकांश प्रतिबिंब मैं एक दिन में दिन के आधार पर देखता हूं, इसका उपयोग डेटा पाठकों या अन्य रिपॉजिटरी प्रकार की संरचनाओं से संस्थाओं को आबाद करने के लिए किया जाता है, जो मैंने विशेष रूप से प्रतिबिंब पर बेंचमार्क प्रदर्शन का फैसला किया है जब इसे ऑब्जेक्ट गुण प्राप्त करने या सेट करने के लिए उपयोग किया जाता है।

मैंने एक परीक्षण तैयार किया जो मुझे लगता है कि यह उचित है क्योंकि यह सभी दोहराई जाने वाली कॉलों और केवल वास्तविक सेटवैल्यू या गेटवैल्यू कॉल को कैश करता है। प्रदर्शन परीक्षण के लिए सभी स्रोत कोड bitbucket पर हैं: https://bitbucket.org/grenade/accessortest । जांच का स्वागत और प्रोत्साहन है।

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

आबादी (x) की संख्या के विरुद्ध समय (y) का ग्राफ

ऊपर दिया गया ग्राफ़ मेरे छोटे बेंचमार्क के आउटपुट को प्रदर्शित करता है और दिखाता है कि जो तंत्र परावर्तन करते हैं, केवल 100,000 चक्र के निशान के बाद ही ऐसा करते हैं। अधिकांश DALs केवल एक बार में कई सौ या शायद हज़ारों पंक्तियाँ लौटाते हैं और इन स्तरों पर परावर्तन ठीक चलता है।


9
जरुरी नहीं। आपकी DAL रूपांतरण केवल कुछ हज़ार वस्तुओं पर ही हो सकता है, लेकिन अपने एप्लिकेशन (यदि यह वेब है) का उपयोग करने वाले समवर्ती उपयोगकर्ताओं द्वारा गुणा करें और यह ऐसे ही जोड़ सकता है जैसे कि आप मिलियन आइटम कनवर्ट करेंगे। यदि विशेष विधि 100 गुना धीमी है, तो यह छोटे और बड़े सेट पर बहुत धीमी हो जाएगी। धीमे धीमे होता है।
रॉबर्ट कोरिटनिक

@RobertKoritnik यह मान रहा है कि आपके सर्वर पर वेब विधियाँ अतुल्यकालिक नहीं हैं
कुर्रेन

@kurren अतुल्यकालिकता प्रतिबिंब को प्रभावित नहीं करती है, बल्कि सर्वर संसाधनों को प्रभावित करती है। अतुल्यकालिक वेब तरीके निश्चित रूप से अधिक उपयोगकर्ताओं की सेवा करने में सक्षम होंगे, लेकिन प्रतिबिंब अभी भी धीमा होगा। और स्वयं AFAIK द्वारा परावर्तन वैसे भी एक समकालिक प्रक्रिया है। दूसरी ओर डेटा लाने का एकमात्र हिस्सा होगा जो अतुल्यकालिक डिजाइन के साथ अच्छी तरह से खेलेंगे।
रॉबर्ट कोरिटनिक

3
चार्ट पर हाइपर विधि क्या है? यह रिफ्लेक्टर से कैसे अलग है?
ब्रायन लीजेंड

मुझे इसका उल्लेख करना चाहिए @LoneCoder: codeproject.com/Articles/18450/… द्वारा stackoverflow.com/users/23354/marc-gravell
ग्रेनेड


12

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

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

मेरा कहना है: जब से मैंने कई बार सहयोगियों के साथ बातचीत में बताया है कि प्रतिबिंब का उनका उपयोग रनटाइम प्रदर्शन करने के बजाय संकलन करने के लिए ऑटोजेनरेट कोड हो सकता है और यह अक्सर विचार करने योग्य है।


यह देखते हुए कि विज़ुअल स्टूडियो के पास इस तरह का एक उत्कृष्ट टेम्पलेट समर्थन है, यह कोड पीढ़ी का उपयोग करने का एक व्यावहारिक तरीका है
सेबस्टियन

12

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

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


5
+1 मुझे एक नया शब्द सिखाने के लिए: अनात्म। साथ ही अतार्किक आशंकाओं का भी जिक्र किया। मुझे ऐसे प्रोग्रामर्स से डर लगता है जो तर्कहीन रूप से डरते हैं - यह दर्शाता है कि वे वास्तव में नहीं जानते कि वे क्या कर रहे हैं और बस यह आधार है कि वे उन अन्य लोगों के साथ क्या करते हैं। खांसी कार्गो पंथ खांसी
bsneeze

1
अहह कार्गो कार्गो। अब जिज्ञासु मानव व्यवहार का एक अच्छा उदाहरण है।
Quibblesome

10

यह काफी बुरा है कि आपको प्रदर्शन-महत्वपूर्ण कोड के लिए .NET पुस्तकालयों द्वारा आंतरिक रूप से किए गए प्रतिबिंब के बारे में भी चिंतित होना चाहिए।

निम्न उदाहरण अप्रचलित है - उस समय (2008) सही, लेकिन बहुत पहले के सीएलआर संस्करणों में बहुत पहले तय किया गया था। सामान्य रूप से प्रतिबिंब अभी भी कुछ हद तक महंगा है, हालांकि!

बिंदु में मामला: आपको उच्च-प्रदर्शन कोड में लॉक (C #) / SyncLock (VB.NET) विवरण में "ऑब्जेक्ट" के रूप में घोषित सदस्य का उपयोग कभी नहीं करना चाहिए। क्यों? क्योंकि सीएलआर एक मूल्य प्रकार पर लॉक नहीं हो सकता है, जिसका अर्थ है कि यह देखने के लिए रन-टाइम प्रतिबिंब प्रकार की जांच करना है कि क्या वास्तव में आपकी वस्तु संदर्भ प्रकार के बजाय एक मूल्य प्रकार है या नहीं।


13
निष्पक्ष होने के लिए, एक प्रतिबिंब प्रकार की जांच तेज है।
जिमी

1
ऐसे 'प्रदर्शन क्रिटिकल कोड' के लिए क्या आपको वास्तव में शुरू करने के लिए .NET का उपयोग करना चाहिए?
Seph

1
@ सिफ: डायनेमिक / प्रतिबिंब अंशों का .NET, नहीं। लेकिन सामान्य तौर पर C # /। NET, क्यों नहीं? C ++ बनाम C # स्पीडअप एप्लीकेशन लेयर पर सीमांत हैं (C ++ अभी भी गहन गणित दिनचर्या पर कुछ% तेज है)। और मैं अनुमान लगा रहा हूं कि आप विधानसभा का सुझाव नहीं दे रहे हैं ...
दीपस्पेस101

एक बॉक्सिंग वैल्यू टाइप (यानी ऑब्जेक्ट) पर लॉक किया जा सकता है। @BryceWagner सही है।
फव्वले

1
निष्पक्ष होना (मेरे लिए), यह कहना अधिक सटीक है कि उत्तर "अप्रचलित" है, बजाय "सादे बकवास" के। लॉक (obj) के व्यवहार के बारे में मेरी टिप्पणी उस समय सही थी जब वे लिखे गए थे, लेकिन सीएलआर के कार्यान्वयन-विशिष्ट व्यवहार लंबे चले गए हैं।
मैकेंजी

5

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

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


3

यदि आप इसे लगातार ऑब्जेक्ट निर्माण के लिए उपयोग करते हैं, तो प्रतिबिंब का प्रदर्शन पर ध्यान देने योग्य प्रभाव हो सकता है। मैंने कम्पोज़िट UI एप्लिकेशन ब्लॉक के आधार पर एप्लिकेशन विकसित किया है जो प्रतिबिंब पर बहुत अधिक निर्भर है। प्रतिबिंब के माध्यम से वस्तुओं के निर्माण से संबंधित ध्यान देने योग्य प्रदर्शन में गिरावट आई थी।

हालांकि ज्यादातर मामलों में प्रतिबिंब उपयोग के साथ कोई समस्या नहीं है। यदि आपकी एकमात्र आवश्यकता कुछ विधानसभा का निरीक्षण करना है तो मैं Mono.Cecil की सिफारिश करूंगा जो बहुत हल्का और तेज है


3

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

जब आप उस विधि को आंतरिक रूप से निष्पादित करते हैं, तो कुछ कोड होते हैं जो सामान की जाँच करते हैं जैसे कि आप वास्तविक लक्ष्य पद्धति को निष्पादित करने से पहले मापदंडों की एक संगत सूची से गुजरते हैं।

यदि संभव हो तो हमेशा यह सिफारिश की जाती है कि यदि कोई व्यक्ति भविष्य में इसका पुन: उपयोग करने जा रहा है, तो एक विधि को संभालता है। सभी अच्छी प्रोग्रामिंग युक्तियों की तरह, यह अक्सर खुद को दोहराने से बचने के लिए समझ में आता है। इस मामले में यह निश्चित मानकों के साथ विधि को लगातार देखने के लिए बेकार है और फिर इसे प्रत्येक और हर समय निष्पादित करेगा।

स्रोत के चारों ओर प्रहार करें और क्या किया जा रहा है पर एक नज़र डालें।


3

सब कुछ के साथ, यह स्थिति का आकलन करने के बारे में है। में DotNetNuke एक काफी महत्वपूर्ण घटक कहा जाता है FillObjectकि का उपयोग करता है प्रतिबिंब datarows से वस्तुओं को भरने के लिए।

यह काफी सामान्य परिदृश्य है और MSDN पर एक लेख है, प्रदर्शन मुद्दों को कवर करने वाले ASP.NET प्रपत्र नियंत्रणों के लिए बिज़ बिज़नेस ऑब्जेक्ट्स के लिए प्रतिबिंब का उपयोग करता है।

एक तरफ प्रदर्शन, एक बात जो मुझे उस विशेष परिदृश्य में प्रतिबिंब का उपयोग करने के बारे में पसंद नहीं है वह यह है कि यह एक त्वरित नज़र में कोड को समझने की क्षमता को कम करता है जो मेरे लिए प्रयास के लायक नहीं लगता है जब आप समझते हैं कि आप भी संकलन खो देते हैं। समय सुरक्षा के रूप में जोरदार टाइप डेटासेट या LINQ से SQL के लिए कुछ के रूप में विरोध किया ।


2

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


1

मुझे लगता है कि आप पाएंगे कि जवाब है, यह निर्भर करता है। यदि आप इसे अपने कार्य-सूची एप्लिकेशन में रखना चाहते हैं तो यह कोई बड़ी बात नहीं है। अगर आप इसे फेसबुक की दृढ़ता लाइब्रेरी में रखना चाहते हैं तो यह बहुत बड़ी बात है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.