2009-03-14 18 views
12

क्या सी # इनलाइन गुणों तक पहुंच है? मुझे इनलाइनिंग के लिए जेआईटी पर 32 बाइट (निर्देश?) सीमा से अवगत है, लेकिन क्या यह इनलाइन गुणों या केवल शुद्ध विधि कॉल करेगा?सी # इनलाइन गुण करता है?

उत्तर

24

यह जेआईटी तक है (सी # कंपाइलर जहां तक ​​मुझे पता है, कोई भी इनलाइनिंग नहीं करता है), लेकिन मेरा मानना ​​है कि जेआईटी ज्यादातर मामलों में छोटी संपत्तियों को रेखांकित करेगा।

ध्यान दें कि यह होगा (System.ComponentModel.Component के माध्यम से) MarshalByRefObject जो System.Windows.Forms.Control शामिल से पाने प्रकार के नहीं इनलाइन सदस्य हैं।

मैंने double फ़ील्ड को भी देखा है जब गुणों के माध्यम से उपयोग किए जाने पर कम कुशल होता है - यह हो सकता है कि उसके आसपास कुछ सूक्ष्मताएं हैं (रजिस्टर उपयोग आदि के कारण)।

यह भी ध्यान दें कि 64-बिट और 32-बिट जेआईटी अलग-अलग हैं, जिनमें इनलाइनों के उपचार शामिल हैं।

संपादित करें: मुझे कुछ और जानकारी के साथ डेविड नोटारियो द्वारा 2004 blog entry मिला है। हालांकि, यह 2.0 शिपिंग से पहले था - मुझे आश्चर्य नहीं होगा कि कम से कम कुछ इसमें से बदल गया था। वैसे भी ब्याज की हो सकती है।

संपादित करें: Another question2008 Vance Morrison blog entry को संदर्भित करता है जो अधिक जानकारी देता है। दिलचस्प सामान।

+0

एक संपत्ति को नोट करने के लायक मूल्य एक या दो (get_Name, set_Name) कार्यों के आसपास एक रैपर है। इसलिए संपत्ति इनलाइनिंग फ़ंक्शन इनलाइनिंग पर एक न्यूनतम विस्तार है। – Richard

8

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

+0

जबकि मैं सामान्य सिद्धांत से सहमत हूं, * * संपत्ति * पक्ष में आईएल में एक अंतर है ... जेआईटी निश्चित रूप से "जान" सकता है कि जिसे कहा जा रहा है वह एक संपत्ति सदस्य है, इसलिए यह * तय कर सकता है उस सूचना के आधार पर जेआईटी। ऐसा करने के लिए काफी अजीब होगा, हालांकि, आईएमओ। –

+0

हां, एक्सेसर विधियों को 'विशेष नाम' ध्वज के साथ चिह्नित किया गया है, और उनके नाम मानकीकृत हैं।ओटीओएच, सीएलआर (जैसे रचनाकारों) से विशेष उपचार प्राप्त करने के तरीकों को 'rtspecialname' के साथ चिह्नित किया गया है, इसलिए अलग-अलग एक्सेसर्स का इलाज सीएलआई/सीएलआर मानक की भावना के खिलाफ होगा। –

5

मुझे यह पता लगाने में थोड़ी देर लग गई कि विजुअल स्टूडियो में आप के बाद प्रबंधित कोड के डिस्सेप्लर देख सकते हैं।

तो क्यों एक बहुत ही सरल एक्सेसर संपत्ति के साथ कक्षा नहीं बनाते हैं, इसे रिलीज मोड में चलाएं, ब्रेकपॉइंट सेट करें, और देखें कि डिस्सेप्लर्स क्या कहता है?

+3

आप हमें यह क्यों नहीं बताते कि ऐसा कैसे करें (जैसा कि आप कहते हैं) ने इसे समझने में कुछ समय लगाया? –

+0

बस कोड में कदम या ब्रेक करें और Disassembly विंडो खोलें। –

+6

यदि आप डीबगर के तहत रिलीज मोड कोड चलाते हैं, तो इसे डीगर के तहत चलाने से जेआईटी अनुकूलन अक्षम हो सकता है! इसके बजाय आपको इसे डीबगर के बिना शुरू करने की आवश्यकता है, इसे जेआईटी दें, और फिर डीबगर का उपयोग पहले से चलने वाली प्रक्रिया से संलग्न करने के लिए करें (और फिर * डिस्सेप्लर विंडो खोलें)। – ChrisW

4

मैं हाल ही में एक ऐसी ही प्रश्न पोस्ट:

Why are public fields faster than properties?

मेरा साथ मुद्दा यह था कि एक सार्वजनिक क्षेत्र तेजी से एक संपत्ति की तुलना में था, क्योंकि मैं 64-बिट Vista चल रहा हूँ और JIT करने के लिए अपने कोड संकलित 64-बिट भी, और मेरी गुण इन-लाइन वाली नहीं थीं। प्रोजेक्ट को x86 के लिए संकलित करने के लिए मजबूर करना संपत्ति में ऑनलाइन था और संपत्ति और सार्वजनिक क्षेत्र के बीच कोई गति अंतर नहीं था।

तो, सी # 32-बिट जेआईटी इन-लाइन गुण करता है, 64-बिट नहीं करता है, न ही कोई अन्य गैर स्थैतिक तरीकों।

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