2009-07-02 5 views
10

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

यहाँ एक कोड नमूना

Trace.Write("Starting using Reflection"); 
if (e.Item.GetType() == typeof(GridDataItem)) 
{ 
     bool isWatch = Convert.ToBoolean(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]); 
     if (isWatch) 
     { 
      e.Item.Style["Font-Weight"] = "bold"; 
     } 
} 
Trace.Write("Ending using Reflection"); 
Trace.Write("Starting using Cast"); 
GridDataItem gridItem = e.Item as GridDataItem; 
if (gridItem !=null) 
{ 
    bool isWatch = Convert.ToBoolean(gridItem.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]); 
    if (isWatch) 
    { 
     gridItem.Style["Font-Weight"] = "bold"; 
    } 
    } 
    Trace.Write("Ending using Cast"); 

है और यह पता लगाने उत्पादन होता है मैं

Starting using Reflection 0.79137944962406 0.576538 
Ending using Reflection 0.791600842105263 0.000221 
Starting using Cast 0.791623353383459 0.000023 
Ending using Cast  0.791649308270677 0.000026 
Starting using Reflection 0.876253801503759 0.084604 
Ending using Reflection 0.87631790075188 0.000064 
Starting using Cast 0.87633445112782 0.000017 
Ending using Cast  0.87634950075188 0.000015 

प्राप्त यह एक बहुत नहीं है, लेकिन यह जोड़ सकता है अगर हम समय के साथ इस एक बहुत करना पड़ा अप।

+3

_Everything_ समय के साथ जोड़ सकता है। जब तक आपके पास सबूत न हो कि यह समय के साथ जोड़ रहा है, तो इसके बारे में तनाव न करें। –

+0

यह सर्वोत्तम प्रथाओं के बारे में अधिक है, अगर कास्टिंग तेज है तो मुझे प्रतिबिंब –

+0

प्रतिबिंब के बजाय कास्टिंग का उपयोग करना चाहिए, यह तर्क बिल्कुल भी पालन नहीं करता है। यदि कास्टिंग सही है तो आपको प्रतिबिंब के बजाय कास्टिंग का उपयोग करना चाहिए। गति की तुलना में सुधार अधिक महत्वपूर्ण है। –

उत्तर

15

प्रतिबिंब धीमा है क्योंकि आप असेंबली के मेटाडेटा से पूछताछ कर रहे हैं जबकि कास्टिंग बस उस ऑब्जेक्ट के प्रकार को बदलती है जिसे आप संदर्भित कर रहे हैं।

असेंबली का मेटाडाटा जानकारी का एक उपयोगी स्टोर है लेकिन निष्पादन समय के बजाय संकलन समय पर यह जानकारी सबसे अच्छी तरह से उपयोग की जाती है। उस मेटाडेटा को स्थिर प्रकार की जांच (अन्य चीजों के साथ) के लिए कंपाइलर द्वारा उपयोग किया जाता है। आप निष्पादन समय पर प्रकार की जानकारी देखने के लिए उसी मेटाडेटा का उपयोग कर रहे हैं (जो ठीक है यदि आपके पास कोई अन्य विकल्प नहीं है) जो कास्टिंग से काफी धीमी है।

3

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

2

कास्टिंग रनटाइम को बताता है कि आप किसी विशेष वस्तु के प्रकार को "जानते हैं"। जबकि आप संभवतः गलत हो सकते हैं रनटाइम आपको विश्वास करता है और असेंबली के मेटा डेटा को देखने के लिए अतिरिक्त समय नहीं लेता है।

1

आप is operator का उपयोग क्यों नहीं कर रहे हैं? मुझे लगता है कि यह अधिक पठनीय है क्योंकि आपके पास स्पष्ट कलाकार नहीं है, फिर जांचें। यह बस जांचता है कि चर सही प्रकार का है।

if (e.Item is GridDataItem) 
{ 
    bool isWatch = Convert.ToBoolean(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]); 
    if (isWatch) 
    { 
     e.Item.Style["Font-Weight"] = "bold"; 
    } 
} 
+0

माना जाता है " "कवर के तहत एक कास्ट करता है। –

+0

मेरा मुद्दा यह था कि यह कोड को सरल बनाता है (इसे और अधिक पठनीय बनाता है), यह नहीं कि यह मूल रूप से कुछ भी अलग करता है। मैं स्पष्ट करूंगा। – tvanfosson

+0

यह वास्तव में धीमी है \t \t 1 से शुरू हो रहा है।5268064962406 \t 1,311905 \t \t 1,52701457443609 \t 0,000208 \t समाप्त \t 1,59114193383459 \t 0,064127 \t शुरू \t 1,59120311278195 \t 0,000061 –

0

वैसे मैं सबसे अच्छा अभ्यास भाग का एक छोटा सा जवाब देता हूं यदि आप नियमित कोड के साथ एक ही परिणाम प्राप्त कर सकते हैं तो प्रतिबिंब का कभी भी उपयोग नहीं किया जाएगा।

कोड को अनुकूलित करते समय आमतौर पर यह अनुमान लगाने के लिए एक अच्छा विचार है कि अनुकूलित समय बिताए जाने का समय सबसे बड़ा प्रदर्शन लाभ होगा। भाषा में मूल रूप से ऑपरेटरों को पुन: कार्यान्वित करना शायद ही कभी उस सूची के शीर्ष पर होगा

1

कास्ट रनटाइम के भीतर पूर्णांक तुलना के रूप में किया जा सकता है लेकिन प्रतिबिंब में पूर्ण विधि कॉल शामिल हैं।

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