2009-06-26 17 views
12

एक सी ++ परियोजना पर काम करने के तीन साल बाद, निष्पादन योग्य 4 एमबी तक बढ़ गया है। मैं देखना चाहता हूं कि यह सारी जगह कहां जा रही है। क्या कोई ऐसा उपकरण है जो रिपोर्ट कर सकता है कि सबसे बड़ा अंतरिक्ष हॉग क्या है? यह वर्ग द्वारा आकार (एक कक्षा में सभी कार्यों), टेम्पलेट द्वारा (सभी instantiations) को देखने के लिए अच्छा होगा, और पुस्तकालय द्वारा (कितना सी मानक पुस्तकालय और एसटीएल? कितना exe में प्रत्येक पुस्तकालय के लिए के अंतर्गत आता है?)क्या वहां कोई "फ़ंक्शन आकार प्रोफाइलर" है?

संपादित करें: नोट, मैं विंडोज पर विजुअल सी ++ का उपयोग कर रहा हूं।

+0

किसी के विचार के मामले में, यह पता चला कि फ्लैट (एक टेक्स्ट-टू-स्पीच इंजन) 4 एमबी का सबसे बड़ा घटक 1.8 एमबी आईआईआरसी पर था, जिसे मैंने इसे हटाकर खोजा था। – Qwertie

उत्तर

14

लिनक्स में, आप nm का उपयोग निष्पादन में सभी प्रतीकों को दिखाने के लिए कर सकते हैं और आकार से उलटे क्रम में उन्हें सुलझाने के लिए:

$ nm -CSr --size-sort <exe> 

विकल्प:

  • -C demangles सी ++ नाम।
  • -S प्रतीकों के आकार को दर्शाता है।
  • --size-sort आकार के आधार पर प्रतीकों का प्रकार।
  • -r इस प्रकार को उलट देता है।

आप नाम स्थान या प्रति वर्ग परिणाम प्राप्त करना चाहते हैं, तो आप कर सकते हैं बस grep 'namespace::', 'namespace::class_name::' के लिए उत्पादन, आदि

आप केवल उस में परिभाषित कर रहे हैं निष्पादन योग्य प्रतीकों देखना चाहते हैं (नहीं लोगों को कहीं और पुस्तकालयों में परिभाषित है, की तरह) तो --defined-only जोड़ें। आकार के आधार पर छंटनी इस पर ध्यान रखनी चाहिए, हालांकि, क्योंकि अनिर्धारित प्रतीकों का आकार नहीं होगा।

विंडोज के लिए, आप अभी भी अपने बाइनरी फ़ाइलें पर nm उपयोग करने में सक्षम होना चाहिए, के बाद से nmCOFF बाइनरी समर्थन करता है। आप साइगविन के माध्यम से nm इंस्टॉल कर सकते हैं, या आप अपने विंडोज़ को एक लिनक्स बॉक्स में निष्पादन योग्य प्रतिलिपि बना सकते हैं और वहां nm चला सकते हैं।

आप dumpbin भी कोशिश कर सकते हैं, जो विंडोज पर एक बाइनरी के बारे में जानकारी डंप करता है। आप /SYMBOLS स्विच के साथ प्रतीकों पर जानकारी प्राप्त कर सकते हैं, लेकिन ऐसा लगता है कि यह सीधे उनके आकार के बारे में जानकारी प्रदान नहीं करता है।

+0

आह, लिनक्स के चमत्कार। यह बहुत बुरा है मैं विंडब्लॉज़ पर हूं। – Qwertie

+0

आप इसे जीसीसी के साथ सिग्विन के तहत संकलित कर सकते हैं और उसके बाद अपने एनएम उपकरण को अपरिवर्तनीय सूची के लिए उपयोग कर सकते हैं। – Blindy

+1

जहाँ तक मुझे पता है, एनएम सीओएफएफ का समर्थन करता है। आप इसे सिगविन के माध्यम से इंस्टॉल कर सकते हैं, या आप एक्सई को एक लिनक्स बॉक्स में कॉपी कर सकते हैं और उस पर एनएम चला सकते हैं। आप विंडोज यूटिलिटी डंपबिन भी आज़मा सकते हैं। यहां देखें: http://support.microsoft.com/?id=121460 – tgamblin

1

एक लिंक नक्शा प्राप्त करें, या प्रतीकों और आकारों की एक सूची प्राप्त करने के लिए dumpbin का उपयोग करें।

संभावना है वहाँ सामान का एक बहुत में खींचा जा रहा है कि आप सख्ती से की जरूरत नहीं है है कर रहे हैं।

जोड़ा गया: क्या आपको एक संतोषजनक उत्तर मिला? मुझे एहसास हुआ कि लोग इस तरह की समस्याओं से संपर्क करने के दो तरीके हैं:

  • कुछ भी करने से पहले माप प्राप्त करें।
  • बस कुछ बड़ा ढूंढें जो उन्हें जरूरत नहीं है, इसे बाहर निकालो, और दोहराएं जब तक वे नहीं कर सकते।

व्यक्तिगत रूप से मैं बाद वाले को पसंद करता हूं - यह परिणाम जल्दी हो जाता है।

आप कहते हैं कि ऐप 4 एमबी है। मान लीजिए कि वास्तविक आवश्यक आकार 1 एमबी (या कुछ ऐसा आकार) है। इसका मतलब है कि यदि आप मानचित्र फ़ाइल से यादृच्छिक रूप से नियमित रूप से चुनते हैं, तो यह 75% होने की संभावना है जिसकी आपको आवश्यकता नहीं है। पता लगाएं कि इसमें क्या शामिल किया जा रहा है, और देखें कि आपको वास्तव में इसकी आवश्यकता है या नहीं।

आपके द्वारा दिए गए उदाहरण में, आपने एक क्लास देखा जो डिवाइस-स्वतंत्र-बिटमैप्स को लपेटता है। आप अपने ऐप में उस कक्षा के उदाहरण पा सकते हैं, और संभावित रूप से उन्हें मूल WIN32 बिटमैप्स के साथ प्रतिस्थापित कर सकते हैं। यह कम सुंदर होगा, लेकिन ऐप आकार के gobs बचाओ।

फिर इसे जारी रखें। प्रत्येक बड़े टुकड़े से छुटकारा पाने के लिए शेष टुकड़े ऐप का एक बड़ा प्रतिशत लेते हैं, क्योंकि ऐप कम हो गया है लेकिन टुकड़े नहीं हैं। इससे उन्हें मानचित्र फ़ाइल में ढूंढना आसान हो जाता है।

+0

फिर से डीआईबी रैपर का उदाहरण लेना, वह वर्ग छोटा हो सकता है और मैं इसे बाहर निकालकर कुछ भी बचा नहीं सकता। ओटीओएच, शायद वेक्टर , नक्शा , हैश_मैप, आदि के कई अलग-अलग उदाहरण हैं और शायद मैं उदाहरण साझा करने के तरीकों को ढूंढकर अंतरिक्ष को बचाऊंगा। लेकिन फिर, शायद संकलक समान सुपरराउट्स (जो शायद टेम्पलेट्स के साथ अक्सर होता है) को मर्ज करने के लिए पर्याप्त स्मार्ट हो सकता है या हो सकता है कि वे कक्षाएं कई उदाहरणों के बावजूद उस जगह को अधिक न करें। हो सकता है कि अगर मेरे पास अच्छा डेटा था तो यह पता चला कि मैं आसानी से किसी भी स्थान को सहेज नहीं सकता, या यह स्थान अप्रत्याशित स्थानों पर जा रहा था। – Qwertie

+0

मुझे "सामान्य" प्रोफाइलर्स के साथ अपने अनुभवों से पता है कि संसाधनों के बारे में मेरी अंतर्ज्ञान अक्सर गलत होती है। तो यह सिर्फ एक .map फ़ाइल का दृश्य निरीक्षण करने के लिए पर्याप्त नहीं है और बस अनुमान लगाएं कि कौन से वर्ग/कार्य/पुस्तकालय बहुत सारे कमरे लेते हैं। – Qwertie

+0

@ क्वर्टी: मुझे पता है कि आपका क्या मतलब है, लेकिन यदि कुछ संसाधन कुछ खराब कारणों से मौजूद हैं, तो संसाधन का नमूना नमूनाकरण करना और प्रत्येक नमूने के पीछे कारण निर्धारित करना समस्या को प्रकट कर सकता है। आप ऐसा कुछ नहीं करते जो सटीक उपाय करता है लेकिन थोड़ा अंतर्दृष्टि देता है। आपको कुछ ऐसी चीज चाहिए जो मोटे तौर पर मापती है लेकिन अधिकतम अंतर्दृष्टि प्रदान करती है। –

7

विजुअल स्टूडियो संकलन के तहत विंडोज़ में, यह जानकारी आपकी .map फ़ाइल में है (यह .pdb के पास होगी)।

जोड़ा: अधिक मानव पठनीय कुछ करने के लिए .map फ़ाइल में पाए सजाया नाम बदलने के लिए, आप उपयोग कर सकते undname.exe उपयोगिता दृश्य स्टूडियो के साथ शामिल थे। यह कमांडलाइन पर अलग-अलग नाम स्वीकार करता है या आप इसे एक .map फ़ाइल खिला सकते हैं।

उदाहरण के लिए,

Microsoft (R) C++ Name Undecorator 
Copyright (C) Microsoft Corporation. All rights reserved. 

Undecoration of "[email protected][email protected][email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@@[email protected]@@Z" is 

"public: void __cdecl mini_vector<struct Math::Point<struct Math::FixedPoint<14,int> >,6>::push_back(struct Math::Point<struct Math::FixedPoint<14,int> > const &)" 
+2

मैं अपनी मैप फ़ाइल देख रहा हूं, और वास्तव में नहीं देख रहा हूं कि "0001: 0000f380? Push_back @? $ Mini_vector @ यू? $ प्वाइंट @ यू? $ फिक्स्डपॉइंट @ $ 0 ओ @ एच @ मठ @@@ मठ @@ $ 05 @@ QAAXABU? $ प्वाइंट @ यू? $ फिक्स्डपॉइंट @ $ 0 ओ @ एच @ मठ @@@ मठ @@@ जेड 10010380 फाई डिबिटमैप्स: DIBitmap.obj "प्रोफाइलिंग के लिए उपयोगी हैं। – Qwertie

+0

उलझन वाले नामों से मत हटाएं। यह डिवाइस-स्वतंत्र बिटमैप समर्थन में कहता है कि बिंदुओं के वेक्टर के अंत में जोड़ने के लिए एक फ़ंक्शन है, और यह सेगमेंट 1 में F380 (62336) पता है। मुझे लगता है कि इसमें बहुत कुछ है। आप देख सकते हैं कि यह कहां संदर्भित है, और यदि आवश्यक नहीं है, तो देखें कि क्या आप इससे छुटकारा पा सकते हैं। –

+0

आप अपने विजुअल स्टूडियो डिब्बे निर्देशिका में पाए गए undname.exe वाले नामों को अनदेखा कर सकते हैं; "विजुअल स्टूडियो 200 एक्स कमांड प्रॉम्प्ट" शॉर्टकट चलाने से इसे आपके% PATH% में रखा जाएगा। या यदि आप उन्हें थोक में करना चाहते हैं, तो मुझे यह पायथन स्क्रिप्ट मिली जो स्वचालित रूप से करती है: http://holycall.tistory.com/entry/A- सिंपल- पायथन-Wrapper-to-Undecorate- Visual-Studio-Linker- प्रतीक-नाम – Crashworks

1

बस कोड को देखो न करें - संसाधन आसानी से बहु मेगाबाइट विकास हो सकता है।

+0

यह सही है - बिटमैप्स और ऐसा विशाल हो सकता है। –

+0

सौभाग्य से बिटमैप आकार मापना आसान है - और मेरे मामले में कोई समस्या नहीं है। – Qwertie

2

मुझे मेरे लिए काम करने के लिए nm नहीं मिला लेकिन Sizer नामक एक उपयोगी टूल ढूंढने में कामयाब रहा। यह डीबग इंटरफ़ेस एक्सेस लाइब्रेरी का उपयोग कर विजुअल स्टूडियो द्वारा बनाई गई डीबग जानकारी को पढ़ता है। साइट पर वर्णन के रूप में, यह उपयोग करने के लिए बहुत सरल है।

  1. कार्यक्रम डेटाबेस में जानकारी डिबगिंग (.pdb) जैसे कमांड लाइन से दायर
  2. भागो आकार मापक के साथ संकलित Sizer.exe <path-to-exe-file>। आउटपुट stdout पर जाएगा ताकि आप शायद एक फ़ाइल पर रीडायरेक्ट करना चाहें।

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

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