2009-10-19 15 views
10

से 50% बड़ा है मेरे पास एक वीसी ++ प्रोजेक्ट (2005) है जो 32-बिट और 64-बिट डीएल दोनों उत्पन्न करता है। 32-बिट डीएल 1044 केबी है जबकि 64-बिट संस्करण 1620 केबी है। मैं उत्सुक हूं कि आकार इतना बड़ा क्यों है। क्या यह सिर्फ बड़े पते के आकार की वजह से है, या क्या एक कंपाइलर विकल्प है जिसे मैं याद कर रहा हूं?64-बिट डीएल का आकार 32-बिट

+0

आप स्थिर क्रम में जोड़ने रहे हैं? फिर यह निश्चित रूप से रनटाइम है जो ओवरहेड के _most_ जोड़ रहा है। – dirkgently

+0

सार्थक उत्तर प्रदान करने के लिए पर्याप्त जानकारी नहीं है। प्रदान की गई कुछ भी शुद्ध अटकलें होगी। –

+0

अनजाने में, एक्स 64 कोड आकार बराबर x86 कोड से 50% से 66% तक बढ़ता है। मैंने माना कि वृद्धि मुख्य रूप से पॉइंटर्स के आकार (फ़ंक्शन कॉल लक्ष्य पते सहित) के कारण थी। हालांकि, मैंने किसी भी तरह का कठोर अध्ययन/विश्लेषण नहीं देखा है; मुझे लगता है कि यह निश्चित रूप से दिलचस्प होगा - मुझे उम्मीद है कि कोई सूचक पॉइंटर पोस्ट करेगा। –

उत्तर

13

शायद आपके कोड में बहुत सारे पॉइंटर्स हैं।

The Free Lunch Is Over

....

(एक तरफ: यहाँ दर्शाने के लिए एक किस्सा है कि हाल ही में मेरी संकलक टीम हिट "अंतरिक्ष गति है" संकलक एक ही स्रोत आधार का उपयोग करता। 32-बिट और 64-बिट कंपाइलर्स के लिए; कोड केवल 32-बिट प्रक्रिया या 64-बिट एक के रूप में संकलित है। 64-बिट कंपाइलर ने एक महान डी प्राप्त किया 64-बिट सीपीयू पर चलकर बेसलाइन प्रदर्शन का ईंधन, मुख्य रूप से 64-बिट सीपीयू के पास पर काम करने के लिए कई और रजिस्ट्रार थे और अन्य कोड प्रदर्शन विशेषताएं थीं। सब ठीक है और अच्छा है। लेकिन डेटा के बारे में क्या है? जा रहे 64 बिट नहीं परिवर्तन, स्मृति में डेटा के अधिकांश के आकार किया पाठ्यक्रम संकेत विशेष रूप से अब दो बार आकार वे पहले थे के सिवाय इसके कि। ऐसा होता है, हमारे संकलक और अधिक अपने आंतरिक डेटा में भारी अनुप्रयोगों कभी होगा के अधिकांश अन्य प्रकार की तुलना में संरचनाओं संकेत का उपयोग करता है। क्योंकि पॉइंटर्स अब 4 बाइट्स के बजाय 8 बाइट्स थे, शुद्ध डेटा आकार में वृद्धि, हम ने 64-बिट कंपाइलर के कार्य सेट में उल्लेखनीय वृद्धि देखी। बड़े कामकाजी सेट ने प्रदर्शन दंड का कारण बना दिया है कि लगभग कोड निष्पादन को ठीक से ऑफसेट करता है प्रदर्शन वृद्धि जो से बढ़ी है, अधिक रजिस्टरों के साथ तेज़ प्रोसेसर पर जा रहा है। इस लेखन के अनुसार, 64-बिट कंपाइलर 32-बिट कंपाइलर के रूप में उसी गति पर चलता है, यहां तक ​​कि हालांकि स्रोत आधार दोनों के लिए समान है और 64-बिट प्रोसेसर बेहतर कच्चे प्रसंस्करण थ्रूपुट प्रदान करता है। अंतरिक्ष गति है।)

+2

से 50% अधिक है, ध्यान दें कि यह स्निपेट डेटा के आकार के बारे में बात कर रहा है, न कि कोड की साई। लेकिन मुझे लगता है कि परिणाम और कारण कोड और डेटा के समान होंगे। –

+0

यह बहुत दिलचस्प है, –

2

आपका सूचक आकार दोगुना हो गया है, इसलिए यदि आप अपने कोड में संकेत के बहुत सारे है, तो अपने निष्पादन में 50% तक आसानी से बढ़ सकता है।

3

x86-64 में अधिक रजिस्ट्रार हैं। नतीजतन, opcodes उन्हें निर्दिष्ट करने के लिए और बिट्स की जरूरत है। इसके अलावा, प्रति x86 परंपरा आप एक रजिस्टर के हिस्सों को निर्दिष्ट कर सकते हैं, और अब आपके पास 32 बिट आंशिक रजिस्टर है। निर्देश जो रजिस्टरों का उपयोग नहीं करते हैं दुर्लभ हैं, इसलिए ये परिवर्तन लगभग हर निर्देश को प्रभावित करते हैं। चूंकि x86-64 अभी भी एक सीआईएससी चर-लंबाई आईएसए है, इसका मतलब यह नहीं है कि प्रत्येक निर्देश 32 से 64 बिट्स तक बढ़ गया है, लेकिन एक निश्चित वृद्धि है।

एक और परिवर्तन यह है कि movq, एक निरंतर करने के लिए एक रजिस्टर स्थापित करने के लिए opcode 64 बिट स्थिरांक की आवश्यकता है (लेकिन opcodes में अन्य स्थिरांक अभी भी 32 बिट कर रहे हैं)

+0

पोस्ट करने के लिए धन्यवाद इसके अतिरिक्त, विस्तारित रजिस्टरों (आर 8-आर 15 या xmm8-xmm15) में से प्रत्येक तक पहुंचने वाले प्रत्येक निर्देश को आरईएक्स उपसर्ग का उपयोग करने की आवश्यकता है, जो प्रत्येक निर्देश के आकार में अतिरिक्त 4 बिट जोड़ता है। इससे कोई फर्क नहीं पड़ता कि वे 64-बिट ऑपरेशन हैं या नहीं; उदाहरण के लिए addl% eax,% ebx 4 बिट्स द्वारा addl% eax,% r8d से छोटा होगा। (कंपाइलर्स को इसे ध्यान में रखना चाहिए और जहां संभव हो, छोटे कोड आकार देने वाले रजिस्टरों का उपयोग करना चाहिए, लेकिन अगर मैं दृश्य सी ऐसा करता हूं तो मुझे विशेष रूप से पता नहीं है)। –