2010-12-06 9 views
9

मैं कुछ पोस्ट-बिल्ड सीआईएल बुनाई कर रहा हूं जो एक असेंबली में सभी तरीकों से सीआईएल जोड़ता है (दूसरे शब्दों में कई तरीकों से)। प्रत्येक विधि जांचता है कि कोई विशिष्ट मान शून्य है या नहीं। उदाहरण (सीआईएल कोड के सी # Reflector'd संस्करण):फील्ड बनाम गुणों का वास्तविक प्रदर्शन

// CIL woven region start 
if (MyType.Something == null) { 
// ... some new stuff 
} 
// CIL woven region end 

MyType.Something एक फील्ड बनाम एक संपत्ति के रूप में होने के प्रदर्शन प्रभाव क्या है? मुझे पता है कि मैंने पढ़ा है कि सी # कंपाइलर विशेष अनुकूलन करता है और उस मामले में कोई प्रदर्शन प्रभाव नहीं होना चाहिए ... लेकिन सीआईएल कोड (सी # कंपाइलर) के मामले में क्या है ...? या यह जेआईटी कंपाइलर है जो इन अनुकूलन के लिए अनुमति देता है (इसलिए सीआईएल कोड अभी भी लाभ)?

ओपकोड उत्सर्जित करेगा। स्थिर संपत्ति के एक्सेसर के लिए कॉल एलडीएसएफल्ड की तुलना में गरीब प्रदर्शन है (ध्यान में रखते हुए यह हजारों आमंत्रणों में है क्योंकि असेंबली में हर विधि बुनाई जाती है)?

धन्यवाद।

+0

क्या आप समझा सकते हैं कि आपने इसे लागू करने का निर्णय क्यों लिया? – Andrey

+0

क्या लागू करें? – Jeff

उत्तर

13

स्लिम डीएक्स के लिए गणित पुस्तकालय के विकास के दौरान, हमने पाया कि, गणित के सदस्यों (जैसे एक्स, वाई, जेड के लिए वेक्टर 3) के सदस्यों के लिए फ़ील्ड का उपयोग करके प्री-एनईटी 3.5 एसपी 1 ढांचे पर, एक असमान प्रदर्शन गुणों में वृद्धि। दूसरे शब्दों में, अंतर छोटे गणित कार्यों के लिए ध्यान देने योग्य था जो भारी मात्रा में गुणों का उपयोग करते थे।

यह बाद में .NET 3.5 SP1 के बाद से सुधार हुआ है (JIT inling देखें)। जबकि मेरा मानना ​​है कि इससे पहले कि जेआईटी अभी भी छोटी विधियों को रेखांकित करेगी (गुण सभी के बाद बस विधियां हैं), पहले के ढांचे में एक बग है जो मूल्य प्रकारों को लेने या वापस करने वाली विधियों को रेखांकित करने से रोका गया है।

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

+0

ठीक है धन्यवाद। हम 3.5 एसपी 1 का उपयोग कर रहे हैं। बस उत्सुक है, क्योंकि कोड सीआईएल है और केवल दृश्य पोस्ट बिल्ड है, फिर भी गुणों का उपयोग करने के लिए आपका तर्क क्या है? – Jeff

+0

आपके मामले में मुझे नहीं पता कि मैं एक संपत्ति का उपयोग करूंगा।आम तौर पर गुणों के पीछे तर्कसंगत एक पुस्तकालय डिजाइन और रखरखाव बिंदु से मजबूती है, लेकिन ऐसा लगता है कि यह यहां लागू नहीं होता है। – MikeP

4

सी # कंपाइलर इसे अनुकूलित नहीं करेगा, नहीं - लेकिन जेआईटी कंपाइलर आमतौर पर जहां तक ​​मुझे पता है, छोटे और (गैर-वर्चुअल) गुणों को रेखांकित कर सकता है।

हालांकि सभी प्रदर्शन प्रश्नों के साथ: जब संदेह में, परीक्षण करें!

+0

मुझे यकीन नहीं है कि "पर्यवेक्षक" प्रभाव को पीड़ित किए बिना परीक्षण कैसे किया जाए, इसलिए मैं उम्मीद कर रहा था कि कोई व्यक्ति हाथ से जान सके। – Jeff

+2

@ जेफएन 825: मैं तर्क दूंगा कि यदि आप वास्तविक दुनिया कोड में परीक्षा लागू कर सकते हैं और कोई अंतर नहीं देख पा रहे हैं, तो यह पर्याप्त सबूत है कि कोई अंतर महत्वहीन है :) –

2

प्रभाव किसी भी दिशा में मामूली है। यदि आपकी गुण इस तरह दिखती हैं ::

public static SomeType PropertyName 
{ 
    get {return MyType.propertyName;} 
    set {MyType.propertyName = value;} 
} 

वास्तव में बहुत मामूली अंतर होना चाहिए। जिट कंपाइलर को callMyType.set_Property फ़ील्ड लोड में इनलाइन करना चाहिए, लेकिन अगर यह किसी बग के कारण भी नहीं हो सकता है। मैं व्यक्तिगत रूप से सावधानी के पक्ष में गलती करता हूं और संपत्ति सेटर्स और गेटर्स के साथ चिपक जाता हूं क्योंकि संभावित रूप से विधि शरीर बदल सकता है, और नतीजतन कच्चे क्षेत्र का उपयोग/उत्परिवर्तन पर्याप्त नहीं हो सकता है।

यदि आप परीक्षण करना चाहते हैं तो आप MethodImpl का उपयोग करने के लिए उत्सर्जित विधि को मजबूर कर सकते हैं जो इनलाइनिंग या ऑप्टिमाइज़िंग को बंद कर देता है। और फिर अंतर की तुलना करें, मुझे सच में संदेह है कि यह महत्वपूर्ण होगा।

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