हर किसी ने समझाया है कि कैसे समयपूर्व अनुकूलन एक बुरा विचार है (जो यह है): हालांकि मैं समझाऊंगा कि वास्तव में यह कोई फर्क नहीं पड़ता है (उन मामलों को छोड़कर जहां आप प्रतिबिंब का उपयोग करते हैं - उस पर और अधिक)।
स्टेटिक संदर्भ कोड
CLR (और इसलिए MSIL - है जो सी # करने के लिए संकलित) में वास्तव में कोई धारणा या नामस्थान की अवधारणा है। एक प्रकार (वर्ग, enum, आदि) को इसके पूर्ण नाम से संदर्भित किया जाता है (उदा। System.Runtime.Serialization.ISerializable
) और 'पूर्ण स्टॉप' नाम के किसी भी अन्य चरित्र के रूप में अपारदर्शी (सार्थक) के रूप में हैं। नेमस्पेस की पूरी अवधारणा कुछ ऐसा है जो सी # (या जो भी भाषा आप उपयोग कर रहे हैं) आपके लिए प्रदान करती है। हालांकि, कच्चे एमएसआईएल के मामले में टाइप नाम वास्तव में कोई फर्क नहीं पड़ता है।
एमएसआईएल में आप कभी भी इसके नाम से कुछ नहीं देखते हैं। एक असेंबली (डीएलएल या एक्सई) में सबकुछ एक निश्चित प्रकार का हैंडल होता है। उदाहरण के लिए एक प्रकार में TypeHandle
है और किसी भी प्रकार से निहित कुछ भी MemberHandle
है: दोनों 32 बिट पूर्णांक हैं। तो जब आप एक विधि को कॉल करते हैं तो आप एमएसआईएल में call <MethodName> on <TypeName> in <Assembly>
नहीं लिखते - इसके बजाय आप call <MethodHandle> on <TypeHandle> in <Assembly>
लिखते हैं। इसलिए एक प्रकार प्राप्त करना जिसमें उसके नाम में 5000 वर्ण हैं, वही समय लेता है जो 5 के साथ होता है। वास्तविक नाम असेंबली में एक अलग स्थान पर संग्रहीत होते हैं: केवल इतना है कि आप उन्हें प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं, या कंपाइलरों के लिए (दूसरे शब्दों में नाम केवल "आपकी जानकारी के लिए" संग्रहीत किए जाते हैं) - इसे मेटाडेटा कहा जाता है।
मुझे लगता है कि आईएलडीएएसएम को कच्चे एमएसआईएल देने के लिए एक तरीका है - लेकिन मुझे यकीन नहीं है।
प्रतिबिंब
का उपयोग क्योंकि आप प्रकार का नाम आप चाहते हैं और नाम विधानसभा में उपलब्ध यह एक फर्क नहीं पड़ता के बीच एक स्ट्रिंग तुलना कर रहे हैं एक्सेस किया गया: स्ट्रिंग तुलना एक हे (एन) आपरेशन कर रहे हैं। हालांकि, इस बार मिनीस्कूल प्रतिबिंब की कुल लागत की तुलना में है और पूरी तरह से नगण्य (यह एक अंतर के नैनोसेकंड बनाएगा) - इसके बारे में भी चिंता न करें।
सारांश
यही कारण है कि समय से पहले अनुकूलन वास्तव में बुरा है है - आप मान लिया है कि यह एक टोंटी वास्तव में तेजी से नहीं या धीमी है, जहां यह करने के लिए जिस तरह से नहीं था।
स्रोत
2012-02-16 17:03:24
मैं @PlayDeezGames उत्तर के साथ प्रतिस्पर्धा नहीं करना चाहता: यह वास्तव में नहीं होगा। गतिशील भाषाओं में यह हो सकता है। SQL सर्वर में यह आपको 30% तक की लागत के लिए हिट कर सकता है। सी # में कभी नहीं। –