2012-07-30 10 views
5

हमारी परियोजना वास्तव में बड़ी है। एक मॉड्यूल में स्रोत कोड आकार लगभग 620KLOC है। तो मैं यह जांचना चाहता हूं कि निर्देशिका/मॉड्यूल में कौन सा फ़ंक्शन सबसे बड़ा है? क्या कोई उपकरण इसका समर्थन कर सकता है?कौन सा टूल सी ++ में विधि या फ़ंक्शन के अधिकतम विवरण दिखा सकता है?

स्रोत मॉनिटर में केवल "प्रति विधि औसत विवरण" है, प्रति विधि अधिकतम बयान नहीं। सीसीसीसी इसका समर्थन नहीं करता है।

उदाहरण। यह फ़ंक्शन लंबाई 1.

unsigned short get() 
{ 
    return 1; 
} 

धन्यवाद।

+0

मुझे संदेह है कि यह मौजूदा उपकरणों के साथ संभव है या नहीं। – iammilind

+0

क्लैंग विभिन्न स्रोत-स्तर के उपकरण लिखने के लिए स्वच्छ आधारभूत संरचना प्रदान करता है। आप इसका अपना टूल विकसित करने के लिए इसका उपयोग कर सकते हैं। – arrowd

+0

यदि आप ऑप्टिमाइज़ेशन – Zaffy

उत्तर

2

सबसे आसान चीज़ जो मैं सोच सकता हूं उसके माध्यम से अपना रास्ता पटक रहा है।

  • उपयोग जैसे ctags फ़ाइल में कार्यों की एक सूची प्राप्त करने
  • उपयोग पर्ल/अजगर/awk/ग्रेप अलग फ़ाइलों में समारोह प्रति एक फाइल अपने स्रोत फ़ाइल को विभाजित करने,
  • , बस लाइनों गिनती प्रत्येक फ़ाइल का अधिकतम लंबाई लें। यदि आपको अधिक जानकारी चाहिए, तो प्रत्येक फ़ाइल को स्थानीय-काउंटर में फ़ीड करें उदा। sloccount से
    अधिक परिष्कृत जानकारी प्राप्त करें।

    लेज़ी सी ++: एक अन्य उपकरण है कि मदद की हो सकती है

में उत्पादन आप रुचि रखते हैं पाने के लिए ग्रेप फिर से इस्तेमाल होता है एक कोड जनरेटर है कि शीर्ष लेख में फ़ाइलों है कि बहुत सी के समान हैं ++ विभाजन है और स्रोत। यदि आप लिखते हैं कि आप अपना कोड एक lzz फ़ाइल में बदलते हैं तो जेनरेट कोड में प्रति फ़ंक्शन लाइन काउंटर टैग शामिल होते हैं। उन संख्याओं में अंतर आपको दिखाएंगे कि आपके कार्य कितने बड़े हैं

+1

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

+0

मैंने पहले ctags का उपयोग नहीं किया था। मैं परिचय देखता हूं और इसे समझने की कोशिश करता हूं। – liuzw

+0

सीटीई सीम वास्तव में शक्तिशाली है। फ्लोलो और मार्टिन, क्या आप इससे परिचित हैं? क्या आप मेरी आवश्यकताओं का समर्थन करने के लिए आदेश दे सकते हैं? बहुत बहुत धन्यवाद – liuzw

0

मुझे लगता है कि कई स्थैतिक विश्लेषण टूल आपको जो कुछ भी चाहिए, वह आपको नहीं दे सकते हैं क्योंकि वे आवश्यक रूप से टेम्पलेट तत्काल, हेडर समावेशन (जैसे उन सहित) precompiled हेडर द्वारा खींचा) और संकलक की कोड पीढ़ी विशेषताओं।

मुझे अतीत में एक समान समस्या का सामना करना पड़ा है, जिसमें एक बड़े निष्पादन योग्य के आकार का आकार किसी विशेष पुस्तकालय का प्रभुत्व था। जिस तरह से मैं इसके नीचे गया था बस प्रत्येक .cpp के लिए ऑब्जेक्ट फ़ाइलों के आकार को देखने के लिए था। यह आपको पूरी कहानी नहीं देगा क्योंकि लिंकर अप्रयुक्त हिस्सों को अनुकूलित करेगा (हालांकि यह देखने लायक है कि आपको विजुअल स्टूडियो के लिए यह विकल्प सेट - /OPT:REF मिला है)। हालांकि यह आपको अपनी खोज पर ध्यान केंद्रित करने की अनुमति देगा। दो या तीन सबसे बड़ी ऑब्जेक्ट फ़ाइलों को ढूंढें और फिर संबंधित .cpp फ़ाइलों को देखें। इसके बाद आपको दो विकल्प मिल गए हैं - एक स्क्रिप्ट लिखें जो objdump (विजुअलस्टूडियो) या nm -C (gcc) का आउटपुट लेती है जहां आप मॉड्यूल में प्रत्येक फ़ंक्शन के ऑफसेट निकाल सकते हैं, ताकि आप प्रत्येक के साथ पिछले विचार को अलग कर सकें प्रत्येक समारोह के आकार का।

या सबसे आसान तरीका सिर्फ सीपीपी फ़ाइल पर बाइनरी खोज का उपयोग करना है। # समाप्ति के बाद के बाद सभी कोड को #ifdef बाहर करें और संकलित करें। इससे आपको शामिल करने के ऊपरी हिस्से का एक विचार मिलेगा (यदि वह स्वयं बड़ा है तो आप सबसे ज्यादा योगदान करने के लिए हेडर समावेशन में ड्रिल कर सकते हैं)। इसके बाद, प्रत्येक आधे कोड को #ifdef के साथ अक्षम करें और पता लगाएं कि कौन सा आधा बड़ा है। इस विधि का उपयोग करके आप उन कार्यों को तुरंत पा सकते हैं जो लाइब्रेरी के आकार में सबसे अधिक योगदान करते हैं।

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

+0

स्टेटिक विश्लेषण उपकरण मेरे लिए पर्याप्त है। हम टेम्पलेट कोड को अनदेखा कर सकते हैं क्योंकि हमारे टेम्पलेट कोड छोटे हैं। हमारी कुछ "सामान्य" सी ++ विधियां 600 से अधिक कोड लाइनें हैं। और मुझे नहीं लगता कि ऑब्जेक्ट फ़ाइल का आकार विधि कोड लाइन प्राप्त कर सकता है सिवाय इसके कि एक फ़ाइल में एक विधि है। लेकिन यह हमारे लिए सच नहीं है। – liuzw

0

CppDepend आपको यह जानकारी देता है, यह क्लैंग पर आधारित है और CQLinq के साथ आप अपने कोड का अनुरोध कर सकते हैं जैसा आप चाहते हैं।

1

आप अपने प्रोजेक्ट को हमारे SourceMeter टूल से स्कैन कर सकते हैं, और आपकी ज़रूरतों के लिए यह सीएसवी फाइलें प्रदान करता है जिसमें मेट्रिक्स के साथ फ़ंक्शंस/विधियां शामिल हैं (अन्य आकार के मीट्रिक जिन्हें आप ढूंढ रहे हैं) और साथ ही मॉड्यूल (जैसे लाइब्रेरी, साझा ऑब्जेक्ट, निष्पादन योग्य)। एक स्प्रेडशीट संपादक का उपयोग करके आप आसानी से प्रति मॉड्यूल के सबसे बड़े कार्यों/विधियों को पा सकते हैं।

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