2012-02-16 11 views
5

मैं मदद नहीं कर सकता लेकिन आश्चर्यचकित हूं कि नामस्थान या परियोजना फ़ोल्डर संरचना असेंबली के प्रदर्शन को प्रभावित करती है। मेरा आंत कहता है "नहीं, लेकिन यह संभवतः संकलन समय को प्रभावित कर सकता है"क्या नामस्थान या फ़ोल्डर संरचना असेंबली के प्रदर्शन को प्रभावित करती है?

प्रदर्शन के बारे में सोचने से हमेशा रास्ते में मिलता है, खासकर अगर आप नौसिखिया हैं। मैं इसकी मदद नहीं कर सकता! इसलिए, मैंने सोचा कि मैं अपने साथी गेम डेवलपर्स से पूछूंगा जो मैं सम्मान और प्रशंसा करता हूं।

+0

मैं @PlayDeezGames उत्तर के साथ प्रतिस्पर्धा नहीं करना चाहता: यह वास्तव में नहीं होगा। गतिशील भाषाओं में यह हो सकता है। SQL सर्वर में यह आपको 30% तक की लागत के लिए हिट कर सकता है। सी # में कभी नहीं। –

उत्तर

17

हर किसी ने समझाया है कि कैसे समयपूर्व अनुकूलन एक बुरा विचार है (जो यह है): हालांकि मैं समझाऊंगा कि वास्तव में यह कोई फर्क नहीं पड़ता है (उन मामलों को छोड़कर जहां आप प्रतिबिंब का उपयोग करते हैं - उस पर और अधिक)।

स्टेटिक संदर्भ कोड

CLR (और इसलिए MSIL - है जो सी # करने के लिए संकलित) में वास्तव में कोई धारणा या नामस्थान की अवधारणा है। एक प्रकार (वर्ग, enum, आदि) को इसके पूर्ण नाम से संदर्भित किया जाता है (उदा। System.Runtime.Serialization.ISerializable) और 'पूर्ण स्टॉप' नाम के किसी भी अन्य चरित्र के रूप में अपारदर्शी (सार्थक) के रूप में हैं। नेमस्पेस की पूरी अवधारणा कुछ ऐसा है जो सी # (या जो भी भाषा आप उपयोग कर रहे हैं) आपके लिए प्रदान करती है। हालांकि, कच्चे एमएसआईएल के मामले में टाइप नाम वास्तव में कोई फर्क नहीं पड़ता है।

एमएसआईएल में आप कभी भी इसके नाम से कुछ नहीं देखते हैं। एक असेंबली (डीएलएल या एक्सई) में सबकुछ एक निश्चित प्रकार का हैंडल होता है। उदाहरण के लिए एक प्रकार में TypeHandle है और किसी भी प्रकार से निहित कुछ भी MemberHandle है: दोनों 32 बिट पूर्णांक हैं। तो जब आप एक विधि को कॉल करते हैं तो आप एमएसआईएल में call <MethodName> on <TypeName> in <Assembly> नहीं लिखते - इसके बजाय आप call <MethodHandle> on <TypeHandle> in <Assembly> लिखते हैं। इसलिए एक प्रकार प्राप्त करना जिसमें उसके नाम में 5000 वर्ण हैं, वही समय लेता है जो 5 के साथ होता है। वास्तविक नाम असेंबली में एक अलग स्थान पर संग्रहीत होते हैं: केवल इतना है कि आप उन्हें प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं, या कंपाइलरों के लिए (दूसरे शब्दों में नाम केवल "आपकी जानकारी के लिए" संग्रहीत किए जाते हैं) - इसे मेटाडेटा कहा जाता है।

मुझे लगता है कि आईएलडीएएसएम को कच्चे एमएसआईएल देने के लिए एक तरीका है - लेकिन मुझे यकीन नहीं है।

प्रतिबिंब

का उपयोग क्योंकि आप प्रकार का नाम आप चाहते हैं और नाम विधानसभा में उपलब्ध यह एक फर्क नहीं पड़ता के बीच एक स्ट्रिंग तुलना कर रहे हैं एक्सेस किया गया: स्ट्रिंग तुलना एक हे (एन) आपरेशन कर रहे हैं। हालांकि, इस बार मिनीस्कूल प्रतिबिंब की कुल लागत की तुलना में है और पूरी तरह से नगण्य (यह एक अंतर के नैनोसेकंड बनाएगा) - इसके बारे में भी चिंता न करें।

सारांश

यही कारण है कि समय से पहले अनुकूलन वास्तव में बुरा है है - आप मान लिया है कि यह एक टोंटी वास्तव में तेजी से नहीं या धीमी है, जहां यह करने के लिए जिस तरह से नहीं था।

+0

'ildasm' से'/बाइट्स 'पास करने से चीजों के लिए बहुत सारे हेक्स कोड प्रिंट होते हैं, जिनमें आईएल ऑपकोड और (यदि लागू हो) टोकन और हैंडल शामिल हैं। आप इसे कच्चे रूप में मेटाडेटा टेबल डंप भी कर सकते हैं। –

+0

@ जोशपेट्री वास्तव में। मैं एक विकल्प के लिए और अधिक जा रहा हूं "आईएल निर्देश लेकिन कृपया नामों को न देखें" - जो मैं ** ** सोचता हूं **: जब तक मैं सेसिल और हल्का मिश्रण नहीं करता। * संपादित करें: * ओह ठीक है, शायद यह था। –

+0

+1 प्रश्न का उत्तर देने और * क्यों * समझाते हैं। –

19

उत्तर: नहीं, आपके प्रोजेक्ट फ़ोल्डर संरचना और नामस्थानों पर प्रदर्शन पर एक सराहनीय प्रभाव नहीं होगा।

प्रदर्शन के बारे में एक शब्द।

यह लिखा है:

समय से पहले अनुकूलन रूट ऑफ़ ऑल ईविल है।

मुझे एक नौसिखिया होने की याद आती है।

मैं अब तक का सबसे अच्छा कोड चाहता था।

मुझे लगता है कि आप एक ही चीज़ चाहते हैं।

हालांकि, इस तरह की चीजों के बारे में चिंता करने से आपकी मदद नहीं होगी।

बस कुछ गेम लिखें और कुछ अनुभव प्राप्त करें।

बाद में प्रदर्शन के बारे में चिंता करें।

+2

मुझे उम्मीद है कि [हाइकू] (http://en.wikipedia.org/wiki/Haiku)! कविता के लिए –

+0

+1! – kaoD

+0

तो इतनी अविश्वसनीय रूप से सही +1 – Valmond

-1

सुंदर निश्चित नामस्थान केवल एक सी ++ चीज है। ईजी जब xbox359 disassembler में मेरे पास नेमस्पेस जैसी चीजों पर ब्रेकपॉइंट नहीं हैं। इत्यादि। ब्लाह :: ब्लाब्लाह :: लोगवॉज़फू 38 < 000000 तक उबाल लेंगे> जो मुझे याद है कि वर्तमान बिंदु स्टैक सूचक बिंदु से + < 000000> बाइट्स पर कूद है। जो ऊपर वर्णित समारोह हो सकता है। जहां अन्य लोग हो सकते हैं (मैं अभी तक इस हिस्से में एक विशेषज्ञ नहीं हूं) लेकिन स्टैक फ्रेम लोड स्थानीय बनाएं और r4 पर r...> पर पैरामीटर डालें।

लेकिन आप इस पाठ को अनदेखा कर सकते हैं और केवल 30 एफपीएस गेम बना सकते हैं, फिर कोड के हॉटस्पॉट/बाधाओं को ढूंढें और उसे ठीक करें। इस% 0.01 अनुकूलन के बजाय।

जो अन्य उत्तरों में ऊपर बताया गया था प्रभावी रूप से जो कहा गया है।

+0

वह सी ++ के बारे में बात नहीं कर रहा है, लेकिन सी # के बारे में बात नहीं कर रहा है। लेकिन सबसे अधिक संभावना है कि इसे केवल संकलन समय पर ही निपटाया जाता है, हां। (और शायद अगर कोई कोड प्रतिबिंब कर रहा है, लेकिन यह असामान्य है।) – Kylotan

+0

आह, मैंने टैग को नोटिस नहीं किया। –

3

डिस्क पर आपकी स्रोत फ़ाइलों का संगठन संकलित असेंबली के प्रदर्शन को प्रभावित नहीं करेगा। न ही आपके नामस्थानों की गहराई या चौड़ाई स्रोत कोड के भीतर उपयोग की जाएगी।

जब आप सीएलआई (# 335) के लिए ईसीएमए मानक देखते हैं, विशेष रूप से विभाजन II अध्याय 22, तो आप एक असेंबली (TypeDef तार्किक तालिका) के प्रकारों का वर्णन करने के लिए उपयोग किए गए मेटाडेटा प्रारूप को पा सकते हैं। आप वहां देख सकते हैं कि टाइप नाम और प्रकार नेमस्पेस स्ट्रिंग हीप में दोनों इंडेक्स हैं - सीएलआई मेटाडाटा में इंडेक्स छद्म गतिशील हैं, जिसमें वे सभी उपलब्ध वस्तुओं को इंडेक्स करने के लिए हमेशा न्यूनतम आकार के लिए डिज़ाइन किए गए हैं, इसलिए वास्तविक बाइट्स में स्ट्रिंग हीप इंडेक्स का आकार भिन्न हो सकता है लेकिन यह सभी प्रकार के लिए समान होगा।

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

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

(*) संख्या अद्वितीय नामस्थानों और नामों और अन्य तारों के स्पष्ट रूप से स्ट्रिंग ढेर के आकार में वृद्धि होगी, लेकिन प्रदर्शन पर इसका कोई प्रभाव बहुत कम स्तर है और यह हमेशा आवश्यक नहीं है।

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

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