2009-10-23 12 views
12

मैं वर्तमान में एक समारोह है:कैश करने के लिए या कैश करने के लिए नहीं - GetCustomAttributes

public static Attribute GetAttribute(MemberInfo Member, Type AttributeType) 
{ 
    Object[] Attributes = Member.GetCustomAttributes(AttributeType, true); 

    if (Attributes.Length > 0) 
     return (Attribute)Attributes[0]; 
    else 
     return null; 
} 

अगर यह एक Attribute = _cache[MemberInfo][Type] शब्दकोश में एक संपत्ति पर सभी विशेषताओं कैशिंग सार्थक होगा मैं सोच रहा हूँ,

यह किसी भी प्रकार के पैरामीटर के बिना GetCustomAttributes का उपयोग करने के लिए परिणाम की गणना करने की आवश्यकता होगी। यह इसके लायक है?

उत्तर

13

आप अपने रुपये के लिए बेहतर बैंग्स मिल जाएगा अगर आप इस के साथ अपने विधि के शरीर की जगह:

public static class MyCacheFor<T> 
{ 
    static MyCacheFor() 
    { 
     // grab the data 
     Value = ExtractExpensiveData(typeof(T)); 
    } 

    public static readonly MyExpensiveToExtractData Value; 

    private static MyExpensiveToExtractData ExtractExpensiveData(Type type) 
    { 
     // ... 
    } 
} 

बीट्स: तुम सच में एक प्रकार के आधार पर कैश करने के लिए की जरूरत है

return Attribute.GetCustomAttribute(Member, AttributeType,false); // only look in the current member and don't go up the inheritance tree. 

हर समय शब्दकोश लुकअप। साथ ही यह threadsafe है :)

चीयर्स, फ्लोरियन

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

  1. लिखें
  2. टेस्ट
  3. डीबग
  4. टेस्ट फिर से
  5. सीपीयू प्रोफ़ाइल
  6. मेम प्रोफ़ाइल
  7. अनुकूलन
  8. टेस्ट एक बार फिर
  9. सीपीयू प्रोफ़ाइल
  10. सदस्य प्रोफाइल यह एक निश्चित रूप से स्मृति
+0

मैं प्रतिबिंब के माध्यम से क्रमबद्धता कर रहा हूं जिससे संकेत मिलता है कि यह किसी बिंदु पर करने योग्य हो सकता है। हालांकि, जैसा कि यहां हर किसी ने कहा है - इसकी कोई समस्या होने तक अनुकूलित करने में कोई बात नहीं :) चीयर्स –

+4

इस मामले में, मुझे एक चाल साझा करने दें: यदि आप कुछ ऐसी चीज कैश करने जा रहे हैं जहां आपकी कुंजी एक प्रकार है, तो सामान्य प्रकार का उपयोग करें एक हैशटेबल से। मैंने उपरोक्त अपना कोड अपडेट किया –

6

एकमात्र तरीका जिसे आप निश्चित रूप से जान सकते हैं, उसे प्रोफाइल करना है। मुझे खेद है अगर यह एक cliche की तरह लगता है। लेकिन एक कारण यह है कि एक कहानियां अक्सर होती है क्योंकि यह सच है।

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

तो अनुकूलन की तरह, इसे तब तक न करें जब तक आपको करना न पड़े।

मेरे अनुभव से (मैं ऑटोकैड की तरह विंडोज़ एप्लीकेशन के बारे में बात कर रहा हूं, बहुत सारे क्लिक-एडिट जीयूआई ऑपरेशंस और भारी संख्या क्रंचिंग के साथ), कस्टम विशेषता का पठन कभी-कभी नहीं होता - प्रदर्शन बाधा ।

+0

ओह मुझे कोई प्रोफ़ाइलिंग टूल प्रोप परीक्षण करने के लिए सक्षम होने के लिए उपलब्ध है erly। यह शायद समय से पहले है, यह पता लगाने के लिए कि यह मेरे ऐप में एक उचित निम्न स्तर का काम है, मैं इसे सबसे अधिक प्राप्त करना चाहता था। –

+0

कोर्टनी: आप प्रत्येक कार्यान्वयन को एक लूप में कॉल करके एक सरल प्रोफाइलिंग कर सकते हैं जो कई बार दोहराता है, और मापता है कि प्रत्येक रूप कितनी देर तक चलती है। आपको इस मामले में वास्तव में प्रोफाइलर की आवश्यकता नहीं है। –

3

क्या आपको वास्तव में प्रदर्शन समस्या है? यदि नहीं, तब तक ऐसा न करें जब तक आपको इसकी आवश्यकता न हो।

यह इस बात पर निर्भर करता है कि आप उसी पैरामीटर के साथ विधि को कितनी बार कॉल करते हैं। यदि आप इसे केवल MemberInfo, Type संयोजन पर कॉल करते हैं तो यह कोई अच्छा नहीं करेगा। यहां तक ​​कि यदि आप कैश करते हैं तो भी आप स्मृति खपत के लिए गति की गति कर रहे हैं। यह आपके आवेदन के लिए ठीक हो सकता है।

5

आपका प्रश्न समयपूर्व अनुकूलन का मामला है।

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

उन चीजों के बारे में सोचने के लिए अपने मस्तिष्क चक्रों को बचाएं जिन्हें आप पहले से जानते हैं समस्याएं हैं!

+0

मैं वास्तव में इस सवाल में कहने जा रहा था लेकिन इसे संपादित करना समाप्त कर दिया कि मुझे नहीं पता कि यह आंतरिक रूप से करता है या नहीं। –

0

मैं सिर्फ एक परिदृश्य में जहाँ GetCustomAttributes निकला प्रदर्शन टोंटी होना ही था करने के लिए बोझ परिवर्तन होगा cpu बाध्य कोड के अपने अनुकूलन के रूप में महत्वपूर्ण है । मेरे मामले में इसे कई पंक्तियों के साथ डेटासेट में सैकड़ों हजारों बार बुलाया जा रहा था और इसने समस्या को अलग करना आसान बना दिया। गुणों को कैशिंग ने समस्या हल की।

प्रारंभिक परीक्षण ने आधुनिक दिन मशीन पर लगभग 5000 कॉलों पर एक मुश्किल ध्यान देने योग्य प्रदर्शन को जन्म दिया। (और यह डेटासेट आकार में वृद्धि के रूप में काफी अधिक ध्यान देने योग्य बन गया।)

मैं आम तौर पर समयपूर्व अनुकूलन के बारे में अन्य उत्तरों से सहमत हूं, हालांकि, डीबी कॉल को सीपीयू निर्देश के पैमाने पर, मैं सुझाव दूंगा कि GetCustomAttributes अधिक दुबला होगा उत्तरार्द्ध की ओर।

1

पुराना सवाल लेकिन GetCustomAttributes महंगा है/दिग्गज

अगर यह एक अच्छा विचार

लेख मैं जुड़ा हुआ हो सकता है प्रदर्शन की समस्याओं का कारण है एक कैश का उपयोग करना: (शीघ्र आवेदन में कांट-छांट करने के लिए चकमा आम प्रदर्शन नुकसान) संग्रहीत संस्करण के लिए एक लिंक कार्रवाई की गई थी, लेकिन यहाँ:

https://web.archive.org/web/20150118044646/http://msdn.microsoft.com:80/en-us/magazine/cc163759.aspx

संबंधित मुद्दे