प्रतिबिंब: क्या प्रतिबिंब अभी भी "खराब" या "धीमा" है? 2002 से प्रतिबिंब के साथ क्या बदल गया है?


21

जब मैंने एक्सप्रेशन या एक्सप्रेशन पेड़ों से निपटते हुए देखा है, तो गुणों में मूल्यों को स्थापित करने और पाने के लिए मैं बहुत अधिक प्रतिबिंब का उपयोग कर रहा हूं। यह मेरे लिए हुआ है कि प्रतिबिंब का उपयोग अधिक से अधिक सामान्य हो रहा है। मान्यकरण के लिए DataAnotations जैसी चीजें, भारी ओआरएम देना, इत्यादि, मुझे आश्चर्य है: क्या दिन और साल पहले जब मैं प्रतिबिंब से बचने के लिए कहा जाता था, तब से क्या बदल गया है?

तो क्या, अगर कुछ भी बदल गया है? क्या यह सिर्फ मशीनों की गति है? क्या प्रतिबिंब को गति देने के लिए ढांचे में बदलाव किए गए हैं?

या वास्तव में कुछ भी नहीं बदला है? क्या प्रतिबिंब का उपयोग करना अभी भी "बुरा" या "धीमा" है?


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

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

Enum.Parse () के साथ एक अपवाद को फेंकने की तुलना में Enum में एक आइटम को खींचने के लिए gettype के साथ एक प्रतिबिंब प्रदर्शित करना अभी भी 30 गुना अधिक तेज है। इसलिए प्रतिबिंब कभी-कभी जीतता है।
192000 को Brain2000

जवाबों:


16

प्रतिबिंब न तो बुरा है, न ही धीमा है। यह बस एक उपकरण है। सभी उपकरणों की तरह, यह कुछ परिदृश्यों के लिए बहुत मूल्यवान है, दूसरों के लिए इतना मूल्यवान नहीं है।

यदि प्रदर्शन वास्तव में एक समस्या है, तो आप हमेशा FasterFlect जैसी लाइब्रेरी का उपयोग कर सकते हैं ।

आगे पढ़ना
यदि प्रतिबिंब अक्षम है, तो यह सबसे उपयुक्त कब है?


या dynamic- स्पष्ट रूप से प्रतिबिंब की तुलना में तेजी से परिमाण का एक क्रम।
ऊद

1
प्रदर्शन बिल्कुल भी समस्या नहीं है। मैं सिर्फ स्पष्ट रूप से याद करता हूं कि लोग 2002 में प्रतिबिंब से बचते हैं जैसे यह प्लेग था। मैं सोच रहा हूँ कि तब से क्या बदला है।
बिशेल

3
@ पत्थर: कुछ नहीं। लोग अब इसके साथ अधिक परिचित हैं, और इससे कम डरते हैं।
रॉबर्ट हार्वे

5
मैं यहाँ सब "मेरे लॉन से निकल सकता हूँ" और कह सकता हूँ कि लिस्प ने ओओपी के अस्तित्व में आने से बहुत पहले ...
माइकल के

काफी उचित। मैं बस सोच रहा था कि क्या यह पिछले दस वर्षों में मशीनों में गति बढ़ गई है जिसने अंतर बना दिया है या अगर वास्तव में System.Reflection में परिवर्तन किए गए थे जिन्होंने प्रदर्शन को बढ़ाया है।
मांसल

17

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

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

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

एक विशिष्ट उदाहरण है जब आपको वेब सेवा कॉल के रूप में विधियों को उजागर करने की आवश्यकता होती है (अभी तक .NET में निर्मित प्रोटोकॉल का उपयोग नहीं किया गया है)। कड़ाई से टाइप किया गया OOP दृष्टिकोण काम करता है, लेकिन यह अत्यधिक प्रतिबंधात्मक और अनाड़ी है। लेकिन अगर आप तर्कों के लिए मेप कॉल टू मेथड्स और की / वैल्यू पेयर का उपयोग करते हैं, तो आप एक बार ऐसी वेब सेवा के लिए प्लंबिंग लिख सकते हैं और फिर अपनी पसंद के किसी भी वर्ग पर इसका उपयोग कर सकते हैं।


13

प्रत्यक्ष कॉल की तुलना में प्रतिबिंब अभी भी काफी धीमा है। दो चीजें बदल गई हैं:

  • रनटाइम्स ने प्रतिबिंब तंत्र को अनुकूलित किया है ताकि अंतर छोटा हो जाए
  • सीपीयू तेजी से प्राप्त हुए हैं ताकि छोटी अक्षमताएं सहन करना आसान हो

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


4
अफसोस की बात है कि सीपीयू धीरे-धीरे मोबाइल डिवाइसेस पर धीमा हो गया है, और सर्वर जहां लोग अपने सर्वर से जितना संभव हो उतना दक्षता से उन्हें निचोड़ने की कोशिश कर रहे हैं।
gbjbaanb

@ GBjbaanb: मैं आपको मोबाइल उपकरण दूंगा, लेकिन सर्वर पर, कोड को अनुकूलित करने के बजाय अधिक हार्डवेयर खरीदना, अधिकांश मामलों में स्वीकृत और तर्कसंगत विकल्प है, क्योंकि सर्वर खरीदने और चलाने की लागत बहुत कम है अनुकूलन कोड की लागत।
माइकल बोर्गवर्ड

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

1
@ लॉर्ड टाइडस: यकीन है, लेकिन आपके द्वारा वर्णित मामला दुर्लभ अपवाद है।
माइकल बॉर्गवर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.