2010-11-10 10 views
13

मैंने गेम के लिए एक जीयूआई लाइब्रेरी बनाई है। मेरा टेस्ट डेमो 60 एफपीएस पर चलता है। जब मैं अपनी लाइब्रेरी के स्थिर संस्करण के साथ इस डेमो को चलाता हूं तो यह taskmanager में 2-3% cpu लेता है। जब मैं डीएलएल संस्करण का उपयोग करता हूं तो यह लगभग 13-15% का उपयोग करता है। क्या यह सामान्य है? ऐसा है, मैं इसे कैसे अनुकूलित कर सकता हूं? मैं पहले से ही अधिकांश फ़ंक्शन इनलाइनिंग के लिए/O2 का उपयोग करने के लिए कहता हूं।एक स्थिर लिंक से एक डीएलएल धीमा है?

+4

क्या आपने अपना ऐप प्रोफाइल किया है? –

+1

आपको प्रोफ़ाइल और देखना चाहिए कि महत्वपूर्ण अंतर कहां है। –

+2

प्रोफ़ाइल करने के लिए कोई कारण नहीं है। अनौपचारिक अनुमान यह पता लगाने के लिए पर्याप्त होना चाहिए कि आपके आवेदन में कोई बाधाएं कहां हो सकती हैं। नरक, वास्तव में स्रोत कोड को देखने की भी आवश्यकता नहीं है। बेस पता मुद्दों का उल्लेख करने के लिए –

उत्तर

16

अपने प्रदर्शन टाइमर को तब तक शुरू न करें जब तक कि डीएलएल को अपनी कार्यक्षमता को एक बार निष्पादित करने का अवसर न हो। यह स्मृति में लोड करने का समय देता है। फिर टाइमर शुरू करें और प्रदर्शन की जांच करें। इसके बाद मूल रूप से स्थैतिक lib के उस मैच से मेल खाना चाहिए।

यह भी ध्यान रखें कि डीएलएल का लोड-स्थान बहुत प्रभावित हो सकता है कि यह कितनी तेज़ी से लोड हो जाता है। डीएलएल के लिए डिफ़ॉल्ट आधार एड्रेस 0x400000 है। यदि आपके पास उस स्थान पर पहले से ही कुछ अन्य डीएलएल है, तो लोड प्रक्रिया को एक महंगा री-एड्रेसिंग चरण करना होगा जो आपके समय को और भी फेंक देगा।

यदि आपके पास ऐसा कोई संघर्ष है, तो विजुअल स्टूडियो में बस एक अलग बेस पता चुनें।

+3

+1। –

+0

आधार पता समस्या केवल लोड समय पर एक समस्या होगी। –

5

आपके पास डीएलएल लोड करने का ओवरहेड होगा (शुरुआत में केवल एक बार होना चाहिए)। यह सीधे कॉल के साथ स्थिर रूप से जुड़ा हुआ नहीं है, इसलिए मैं थोड़ी सी ओवरहेड की अपेक्षा करता हूं लेकिन ज्यादा नहीं।

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

0

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

5

यदि आप डीएलएल-फ़ंक्शंस को कॉल करते हैं तो उन्हें कॉलर के लिए रेखांकित नहीं किया जा सकता है। आपको अपनी डीएलएल-सीमाओं के बारे में थोड़ा सोचना चाहिए।

हो सकता है कि आपके एप्लिकेशन के लिए एक छोटा बूटस्ट्रैप एक्सई होना बेहतर हो जो आपके डीएलएल में मुख्य लूप निष्पादित करता हो। इस तरह आप फ़ंक्शन कॉल के लिए बहुत अधिक ओवरहेड से बच सकते हैं।

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