मुझे तकनीकी कारणों को जानने में दिलचस्पी है: क्यों प्रतिबिंब .NET में अच्छा प्रदर्शन नहीं करता है?प्रतिबिंब .NET में अच्छा प्रदर्शन क्यों नहीं करता है?
उत्तर
प्रतिबिंब अच्छी तरह से प्रदर्शन करता है, यह स्थिर कोड से बहुत अधिक है।
typeof(SomeClass).GetMethod("SomeStaticMethod").
Invoke(null, new object[] { 1, 2, 3 });
यह इस रूप में ही है:
आप इस कोड स्निपेट कहो
SomeClass.SomeStaticMethod(1, 2, 3);
लेकिन यह स्पष्ट पहले एक करने के लिए एक बहुत अधिक काम है कि किया जाना चाहिए। इसे टाइप जानकारी प्राप्त करनी है, यह देखने के लिए कि क्या कोई StStaticMethod विधि है, जांचें कि यह किस तरह की विधि है, उदाहरण पर विधि का आह्वान करें, या नहीं, यह स्थिर है और ऑब्जेक्ट सरणी पास करने के पैरामीटर है, मुक्केबाजी/पूर्णांक अनबॉक्सिंग इस मामले में भी।
और यह शायद एक बहुत व्यापक सारांश है, इसमें कोई संदेह नहीं है कि और भी आगे बढ़ रहा है। इसके बावजूद, प्रतिबिंब अभी भी बहुत तेज़ है और कई क्षेत्रों में प्रयोग किया जाता है, WinForms पर डाटाबेसिंग से एएसपी में बाध्यकारी मॉडल।नेट एमवीसी (एमवीसी पर निर्मित इस साइट पर आपके द्वारा किए गए हर अनुरोध में प्रतिबिंब का पूरा समूह शामिल है और फिर भी, साइट बहुत तेज है और एमवीसी को बहुत तेज ढांचे के रूप में माना जाता है)।
क्योंकि इसमें रन-टाइम पर स्ट्रिंग लुकअप (प्रकार और सदस्य नाम) के साथ-साथ मूल्य प्रकारों के लिए अतिरिक्त मुक्केबाजी/अनबॉक्सिंग शामिल है।
एमएसडीएन पर उस पर भयानक लेख: Dodge Common Performance Pitfalls to Craft Speedy Applications। असल में, यह देर से और जल्दी बाध्यकारी का सवाल है। यही है, संकलन समय पर क्या तय किया जा सकता है और रनटाइम पर क्या निर्णय लिया जाना चाहिए। उस लेख से ...
देर बाध्य मामलों MethodBase.Invoke, आह्वान, Type.InvokeMember, और देर बाध्य प्रतिनिधि कॉल (Delegate.DynamicInvoke के माध्यम से प्रतिनिधियों पर कॉल) के माध्यम से DynamicMethod हैं। इन सभी विधियों में प्रारंभिक बाध्य मामलों की तुलना में प्रदर्शन प्रभावों के साथ अधिक नकारात्मकके साथ आते हैं। यहां तक कि सबसे अच्छे मामले में, वे आम तौर पर धीमे प्रारंभिक बाध्य मामले की तुलना में परिमाण धीमा हो जाते हैं।
वह प्रारंभिक और देर से बाध्य कॉल करने के विभिन्न तरीकों के हमारे कुछ प्रदर्शन परीक्षणों को तोड़ देता है। पढ़ने के लायक है।
प्रतिबिंब में टोकेन्स के नामों को हल करने के लिए मेटाडेटा में जाना शामिल है, फिर यह देखने के लिए इस टोकन का उपयोग करता है और इच्छित डेटा को पुनर्प्राप्त करता है (उदाहरण के लिए, विधि विधि, पैरामीटर के बारे में जानकारी प्राप्त करने के लिए एक विधि टोकन का उपयोग किया जाता है .. ।आदि)।
यह प्रक्रिया 2 कारणों से महंगा है। 1- बहुत सारे लुकअप चल रहे हैं। 2- उन पृष्ठों को स्पर्श करना जो आम तौर पर स्पर्श नहीं होते हैं (ठंडे पृष्ठ), जिनमें मेटाडेटा टेबल होते हैं।
मेटाडाटा तक पहुंच सीधे महंगा है, सीएलआर इस प्रक्रिया को तेजी से बनाने के लिए कैश बनाए रखता है और जब आप प्रतिबिंबित करने के लिए चीजों तक पहुंचते हैं तो मेटाडेटा टेबल को छूने से बचने के लिए, हालांकि हम इन कैशों को बाईपास करते हैं और सीधे जाते हैं स्रोत के लिए।
प्रतिबिंब अच्छी तरह से
एक बहुत ही भरी हुई बयान है कि प्रदर्शन नहीं करता। "अच्छा प्रदर्शन करें" रिश्तेदार है। स्थिर कोड की तुलना में, परावर्तक कॉल के साथ-साथ निष्पादित नहीं करते हैं। हालांकि, लगभग सभी मामलों में, .NET में प्रतिबिंब बेहद तेज़ है। मैं इतना कम नहीं कर सकता। प्रतिबिंब को .NET 1.x दिनों और शायद अन्य भाषाओं से खराब प्रतिष्ठा मिली है, लेकिन .NET 2.0+ में प्रतिबिंब ब्लिस्टरिंग त्वरित है।
99% मामलों में, "प्रतिबिंब बहुत धीमा है" एक अप्रासंगिक चिंता है। मुझे संदेह है कि आपको एक प्रतिबिंबित कॉल के प्रदर्शन प्रभाव को एक स्थिर बनाम मापने की आवश्यकता होगी।
प्रतिबिंब .NET में अच्छा प्रदर्शन करता है - इसके लिए यह क्या करता है।
हालांकि, प्रतिबिंब, क्योंकि यह पहले से संकलित प्रकारों का रनटाइम विश्लेषण है, इसके लिए काफी अधिक ओवरहेड की आवश्यकता है। आम तौर पर, स्थिर प्रकार की जानकारी के स्ट्रिंग लुकअप जैसी चीजें करना, और कक्षा मेटाडाटा चलाना आदि कुछ समय ले रहा है।
यह कहना नहीं है कि यह वास्तव में धीमा है - यह पूरी तरह से संकलित, स्ट्रेट विधि कॉल और लुकअप की तुलना में बहुत धीमी है। यह होना चाहिए - लेकिन मैं वास्तव में इसके बारे में अधिक सोचता हूं क्योंकि किसी भी प्रणाली में संकलित कोड गतिशील रूप से जानकारी की तुलना में तेज़ है।
बस यह बताते हुए कि "प्रतिबिंब" धीमा करता है, बहुत व्यापक कंबल के नीचे बहुत सारी कार्यक्षमता का नरक लंप रहा है। .NET में प्रतिबिंब कई वर्गों में आता है, प्रत्येक "प्रदर्शन" के एक अलग स्तर के साथ। एक के लिए, typeof()
ऑपरेटर का उपयोग वास्तव में प्रतिबिंब का एक रूप है ... यह एक प्रकार के लिए सीएलआर मेटाडेटा से पूछताछ करता है। हालांकि, typeof()
अत्यधिक तेज़ (निकट-मुक्त समय में) निष्पादित करता है। अन्य प्रकार से संबंधित "प्रतिबिंब" का उपयोग करें, जैसे कि ऑपरेटर, sizeof()
ऑपरेटर इत्यादि भी लगभग निःशुल्क हैं (वे मूल रूप से ऐसा करते हैं जैसे वे स्थिर कोड थे।)
typeof()
से धीमे होने पर प्रतिबिंब एक प्रकार के बारे में जानकारी पुनर्प्राप्त करने के लिए उपयोग किया जाता है, यह भी पॉइंटर ट्रैवर्सल और मेटाडेटा जांच की मात्रा पर विचार करने के लिए बहुत तेज़ है। मेटाडेटा प्रोबिंग .NET कोड के साथ एक काफी आम प्रथा है, खासकर जब यह कस्टम विशेषताओं के साथ काम करने की बात आती है।
प्रतिबिंब के संबंध में बड़ी प्रदर्शन चिंता को आमंत्रण के साथ करना है। प्रकार की जानकारी तक पहुंचना और मेटाडेटा पढ़ना बहुत हल्का वजन है। जिस क्षण आप गुणों, सूचकांक, विधियों, या गतिशील रूप से प्रतिबिंब के माध्यम से नए प्रकार का निर्माण गतिशील आमंत्रण शामिल करते हैं, आप ऑर्डर-ऑफ-आयाम प्रदर्शन हिट लेते हैं।
प्रतिबिंब अभी भी एक प्रक्रिया में निष्पादन है, इसलिए, इससे पहले कि आप थोड़ा गतिशील आमंत्रण के प्रदर्शन हिट के बारे में चिंता करें, सुनिश्चित करें कि कोई भी बड़ी प्रदर्शन बाधाएं नहीं हैं, जैसे इंटर-प्रोसेस निष्पादन, नेटवर्क कॉल (यानी डेटाबेस, वेब सेवा इत्यादि) जब प्रदर्शन की बात आती है, तो सबसे बड़ी प्रदर्शन हिट से शुरू करें, और वहां से अपना रास्ता कम करें। गतिशील आमंत्रण सहित प्रतिबिंब आमतौर पर उन अंतिम चीजों में से एक होता है जिन्हें आपको प्रदर्शन दृष्टिकोण से चिंता करना चाहिए।
परिशिष्ट:
सोचा के बाद एक के बारे में थोड़ी है, लेकिन अगर आप देर से बाध्य प्रकार के सदस्यों के गतिशील मंगलाचरण के एक उच्च स्तर की आवश्यकता होती है, तो आप हल्के कोड पीढ़ी पर गौर करना चाहिए। सिस्टम का उपयोग करना। रिफ्लेक्शन। नेमस्पेस दर्ज करें, आप रनटाइम पर लाइटवेट कोड जेनरेट करने के लिए डायनामिक मोड जैसे यूटिलिटीज का उपयोग कर सकते हैं जो प्रारंभिक बाध्य कॉल कर सकते हैं। इस जेनरेट किए गए कोड को कैशिंग करने से प्रारंभिक लागत कम हो जाती है, जिससे आप प्रारंभिक बाध्य प्रदर्शन के साथ देर से कॉल किए गए कॉल का लाभ प्राप्त कर सकते हैं।
- 1. (क्यों) प्रतिबिंब इतना महंगा है .Net?
- 2. .NET में प्रतिबिंब का उपयोग क्यों किया जाता है?
- 3. यह प्रदर्शन में सुधार क्यों करता है?
- 4. .NET प्रतिबिंब कितना महंगा है?
- 5. .NET में प्रतिबिंब क्या उपयोग है?
- 6. प्रतिबिंब धीमा क्यों है?
- 7. .NET में system.float क्यों मौजूद नहीं है?
- 8. पैरामीटर प्रदर्शन नहीं करता है साथ ही
- 9. जावा प्रतिबिंब रन-टाइम प्रदर्शन
- 10. मोडोपेट और .NET प्रतिबिंब
- 11. प्रदर्शन करता है: कोई नहीं अभी भी
- 12. मल्टीथ्रेड फ़ाइल स्थानांतरण प्रदर्शन में सुधार क्यों करता है?
- 13. glClear() प्रदर्शन में सुधार कैसे करता है?
- 14. jQuery प्रदर्शन का प्रदर्शन/छुपा क्यों करता है: दृश्यता के बजाय कोई भी नहीं: छुपा हुआ?
- 15. गेटटाइप() और GetTypes() जैसे प्रतिबिंब एपीआई का प्रदर्शन कैसा है?
- 16. .NET प्रतिबिंब की "लागत" क्या है?
- 17. एफ # इनलाइन कारण 11x प्रदर्शन सुधार क्यों करता है
- 18. .NET में मैट्रिक्स गुणा क्यों धीमा है?
- 19. सी # में 'है' प्रतिबिंब की प्रदर्शन विशेषताओं क्या हैं?
- 20. मेरा .NET ऑब्जेक्ट Serializable क्यों नहीं है?
- 21. क्या .NET असेंबली आकार प्रदर्शन को प्रभावित करता है?
- 22. .net प्रतिबिंब और "पैराम्स" कीवर्ड
- 23. यह कोड वीएस -2010 में .NET 4.0 के साथ क्यों संकलित नहीं करता है?
- 24. .NET: थ्रेडस्टैटिक बनाम लॉक {}। ThreadStaticAttribute प्रदर्शन को कम क्यों करता है?
- 25. प्रदर्शन: कोई नहीं; ब्राउज़र में 'none' प्रदर्शित करता है
- 26. यह .Net IL क्यों सत्यापित नहीं है?
- 27. .NET प्रतिबिंब: प्रयुक्त प्रकार खोजें
- 28. .NET ढांचे में "सेट" इंटरफ़ेस क्यों नहीं है?
- 29. .NET में KeyedByTypeCollection का उपयोग करता है?
- 30. क्यों .NET में ईवेंट का कोई रिटर्न प्रकार नहीं है?
वैसे मैंने एक गतिशील यूआई बनाने के लिए विंडोज़ फॉर्म ऐप में प्रतिबिंब का उपयोग किया और मुझे कोई प्रदर्शन चिंता नहीं मिली। बेशक यह एक "निष्पादक महत्वपूर्ण" एप्लिकेशन में अलग हो सकता है जिसे मैं नहीं जानता। – Malcolm