आपका पसंदीदा प्रोफाइलिंग टूल क्या है (C ++ के लिए) [बंद]


83

अब तक, मैंने केवल तर्कसंगत परिमाण का उपयोग किया है। मैंने इंटेल के वीट्यून के बारे में बहुत अच्छी बातें सुनी हैं, लेकिन कभी कोशिश नहीं की है!

संपादित करें: मैं ज्यादातर सॉफ्टवेयर की तलाश कर रहा हूं जो कोड को लिख देगा, क्योंकि मुझे लगता है कि बहुत ही बढ़िया परिणाम प्राप्त करने का एकमात्र तरीका है।


यह सभी देखें:

विंडोज पर देशी C ++ के लिए कुछ अच्छे प्रोफाइलर्स क्या हैं?


क्या आप 1) को मापना चाहते हैं, या क्या आप चाहते हैं 2) स्पीडअप खोजने के लिए? यदि आप 2 चाहते हैं, और आपको लगता है कि 1 की आवश्यकता है, तो ऐसा नहीं है। स्पीडअप खोजने के लिए, आपको "बहुत ही बढ़िया परिणाम" की आवश्यकता नहीं है। यदि कार्यक्रम 90% खर्च कर रहा है, तो ऐसा कुछ करने से आप बहुत अच्छी तरह से निकाल सकते हैं यदि आप जानते हैं कि यह क्या था, तो स्टैक नमूने इसे 9 में से 9 बार दिखाएंगे। यदि आप 10 नमूनों को देखते हैं, तो क्या आप देखते हैं यह 10 गुना, 9 गुना या 8 गुना है? किसी भी तरह, आप जानते हैं कि यह क्या है । मापा प्रतिशत कोई फर्क नहीं पड़ता।
माइक डनलैवी

जवाबों:


35

लिनक्स विकास के लिए (हालांकि इनमें से कुछ उपकरण अन्य प्लेटफार्मों पर काम कर सकते हैं)। ये दो बड़े नाम हैं, जिनके बारे में मुझे पता है कि कुछ अन्य छोटे हैं, जिन्होंने कुछ समय में सक्रिय विकास नहीं देखा है।


28

लिनक्स के लिए: Google Perftools

  • वैलेरिंड की तुलना में तेज़ (अभी तक, इतना बढ़िया दाना नहीं)
  • कोड इंस्ट्रूमेंटेशन की जरूरत नहीं है
  • अच्छा चित्रमय उत्पादन (-> kcachegrind)
  • मेमोरी-प्रोफाइलिंग, सीपीयू-प्रोफाइलिंग, लीक-चेकिंग करता है

9

IMHO, डिबगर का उपयोग करके नमूना लेना सबसे अच्छी विधि है। आपको बस एक IDE या डीबगर की आवश्यकता होती है जो आपको प्रोग्राम को रोकने की सुविधा देता है। यह आपके प्रदर्शन की समस्याओं को बढ़ाता है इससे पहले कि आप प्रोफाइलर को स्थापित करें।


3
हाँ! यह मेरे लिए बहुत अच्छा काम करता है। यह उपकरण की जरूरत नहीं है। यह स्थापित किसी भी प्रोफाइलर आदि की जरूरत नहीं है। लिनक्स पर, आप gdb का उपयोग कर सकते हैं। कार्यक्रम पूरी गति से चलता है। हिट ctrl-c को रोकने के लिए। स्टैकट्रेस दिखाने के लिए 'bt' टाइप करें। फिर जारी रखने के लिए 'c', फिर ctrl-c फिर से। बहुत अच्छा काम करता है! बस एक जटिल कार्यक्रम में, इस तकनीक का उपयोग करके, मेरे निष्पादन का समय 20% तक कम कर दिया। बहुत बढ़िया!
ह्यूग पर्किंस

@HughPerkins: आपके संपादन के लिए धन्यवाद, और मुझे खुशी है कि आप सफल रहे हैं। (मुझे यकीन है कि आप 20% से बेहतर कर सकते हैं :)
माइक डनलैवी

1
हां, मुझे कुछ घंटों के काम में 1200ms से 200ms तक की यात्रा का समय मिल गया है, हॉटस्पॉट का पता लगाने के लिए केवल gdb + ctrl-c का उपयोग करके :-)
ह्यूग पर्किंस

@HughPerkins: मेरे लिए, अगर मैं अपने कोड पर काम कर रहा हूं, तो यह जानना मुश्किल है कि कब कोशिश करना बंद करना है - ऐसा लगता है कि मैं इसे हमेशा कुछ और निचोड़ सकता हूं। जब मैं किसी और के कोड पर काम कर रहा हूं, तो समस्या हो सकती है। मैं हमेशा समस्या को ठीक करने के लिए कोड के "मालिक" को मना नहीं सकता, इसलिए प्रक्रिया स्टाल। यह एक दिलचस्प पहेली है।
माइक डनलैवी

यदि आप इसे इंस्ट्रूमेंटेशन के बिना प्राप्त करना चाहते हैं, तो आपको लिनक्स पर डीबगर या आईडीई की भी आवश्यकता नहीं है। बस "pstack <pid>" को रन करें। यह डीबगर को लॉन्च करने और फिर मैन्युअल रूप से तोड़ने और फिर स्टैकट्रेस की तुलना में बहुत सरल है।
मनीष सोगी

7

मेरा एकमात्र अनुभव C ++ कोड ऑटोमेटेडक्यूए (अब स्मार्टबियर सॉफ्टवेयर) द्वारा AQTime के साथ है । इसमें कई प्रकार के प्रोफाइलर्स बनाए गए हैं (प्रदर्शन, मेमोरी, विंडोज हैंडल, अपवाद अनुरेखण, स्थिर विश्लेषण आदि), और परिणाम प्राप्त करने के लिए कोड को लिखता है।

मुझे इसका उपयोग करने में मज़ा आया - उन स्थानों को खोजने में हमेशा मज़ा आया जहां कोड में एक छोटा सा बदलाव प्रदर्शन में नाटकीय सुधार कर सकता है।


यह केवल विंडोज पर काम करता है, दुर्भाग्य से।
ब्रैम

6

मैंने पहले कभी प्रोफाइलिंग नहीं की। कल मैंने समय भंडारण के लिए एक स्थिर समय सारिणी (एक मानचित्र <std :: string, long long>) के साथ एक ProfilingTimer वर्ग को क्रमादेशित किया।

निर्माणकर्ता शुरुआती टिक को संग्रहीत करता है, और विध्वंसक बीत चुके समय की गणना करता है और इसे मानचित्र में जोड़ता है:

ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName += " > ";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

प्रत्येक फ़ंक्शन (या {ब्लॉक}) में, जिसे मैं प्रोफ़ाइल में जोड़ना चाहता हूं:

ProfilingTimer _ProfilingTimer("identifier");

यह रेखा उन सभी कार्यों में जोड़ने के लिए थोड़ा बोझिल है जिन्हें मैं प्रोफाइल करना चाहता हूं क्योंकि मुझे यह अनुमान लगाना है कि कौन से कार्यों में बहुत समय लगता है। लेकिन यह अच्छी तरह से काम करता है और प्रिंट फ़ंक्शन% में खपत समय दिखाता है।

(क्या कोई अन्य समान "होम-मेड प्रोफाइलिंग" के साथ काम कर रहा है? या यह सिर्फ बेवकूफ है? लेकिन यह मजेदार है? क्या किसी के पास सुधार सुझाव हैं?

क्या सभी प्रकार के कार्यों में किसी प्रकार का ऑटो जोड़ना है?)


5

मैंने अतीत में बड़े पैमाने पर Glowcode का उपयोग किया है और इसके साथ सकारात्मक अनुभवों के अलावा कुछ भी नहीं है। इसका Visual Studio एकीकरण वास्तव में अच्छा है, और यह सबसे कुशल / सहज ज्ञान युक्त प्रोफाइलर है जो मैंने कभी भी उपयोग किया है (यहां तक ​​कि प्रबंधित कोड के लिए प्रोफाइलर्स की तुलना में भी)।

जाहिर है, अगर आपका विंडोज पर नहीं चल रहा है, तो बेकार है, लेकिन सवाल यह स्पष्ट नहीं है कि आपकी आवश्यकताओं के अनुसार क्या है।


5

एक शक के बिना, oprofile; इसका सरल, विश्वसनीय, काम करता है, और डेटा के सभी प्रकार के अच्छे टूटने दे सकता है।


5

विजुअल स्टूडियो 2008 में प्रोफाइलर बहुत अच्छा है: तेज, उपयोगकर्ता के अनुकूल, स्पष्ट और अच्छी तरह से आईडीई में एकीकृत।


2
केवल टीम संस्करण में प्रोफाइलर नहीं है?
dwj

@dwj: मुझे यकीन नहीं है। मैं विजुअल स्टूडियो टीम सिस्टम 2008 डेवलपमेंट एडिशन का उपयोग कर रहा हूं।
दिमित्री सी।

ऐसा लगता है कि यह 2010 से पहले के संस्करणों के लिए केवल टीम संस्करण ( stackoverflow.com/questions/61669/… ) में है।
dwj

4

विंडोज के लिए, Xperf देखें । यह नमूना प्रोफ़ाइल का उपयोग करता है, इसमें कुछ उपयोगी यूआई हैं, और इंस्ट्रूमेंटेशन की आवश्यकता नहीं है। प्रदर्शन की समस्याओं को ट्रैक करने के लिए काफी उपयोगी है। आप इस तरह के सवालों का जवाब दे सकते हैं:

  • सबसे अधिक सीपीयू का उपयोग कौन कर रहा है? कॉल स्टैक का उपयोग करके फ़ंक्शन नाम पर ड्रिल करें।
  • सबसे अधिक मेमोरी कौन आवंटित कर रहा है?
  • सबसे अधिक रजिस्ट्री प्रश्न कौन कर रहा है?
  • डिस्क लिखता है? आदि।

जब आप अड़चनों का पता लगाएंगे, तो आप काफी हैरान होंगे, क्योंकि वे शायद वे नहीं हैं जहाँ आप उम्मीद करते थे!


4

Windows के लिए, मैंने AMD Codeanalyst, Intel VTune और Profiler को Visual Studio Team Edition में आज़माया है।

Codeanalyst छोटी गाड़ी है (अक्सर दुर्घटनाग्रस्त) और मेरे कोड पर, इसके परिणाम अक्सर गलत होते हैं। इसका यूआई अनजाना है। उदाहरण के लिए, प्रोफ़ाइल परिणामों में कॉल स्टैक डिस्प्ले तक पहुंचने के लिए, आपको "प्रक्रियाएं" टैब पर क्लिक करना होगा, फिर अपने प्रोग्राम के EXE फ़ाइल नाम पर क्लिक करें, फिर उस पर छोटे अक्षरों "CSS" के साथ एक टूलबार बटन पर क्लिक करें। लेकिन यह फ्रीवेयर है, इसलिए आप इसे आज़मा सकते हैं, और यह AMD प्रोसेसर के बिना (कम सुविधाओं के साथ) काम करता है।

VTune ($ 700) में एक भयानक उपयोगकर्ता इंटरफ़ेस है IMO है; एक बड़े कार्यक्रम में, आप जो विशेष कॉल ट्री ढूंढना मुश्किल है, और आप एक समय में एक कार्यक्रम में केवल एक "नोड" को देख सकते हैं (अपने तत्काल कॉलर्स और केली के साथ एक फ़ंक्शन) - आप एक पूर्ण नहीं देख सकते हैं पेड़ को बुलाओ। एक कॉल ग्राफ़ दृश्य है, लेकिन मुझे ग्राफ़ पर संबंधित निष्पादन समय प्रदर्शित करने का कोई तरीका नहीं मिला। दूसरे शब्दों में, ग्राफ़ में फ़ंक्शन समान दिखते हैं, भले ही उनमें कितना समय व्यतीत हो - यह ऐसा है जैसे वे प्रोफाइलिंग के बिंदु से पूरी तरह से चूक गए हों।

विजुअल स्टूडियो के प्रोफाइलर में तीनों का सबसे अच्छा जीयूआई है, लेकिन किसी कारण से यह मेरे कोड के बहुमत से नमूने एकत्र करने में असमर्थ है (मेरे पूरे C ++ प्रोग्राम में कुछ कार्यों के लिए ही नमूने एकत्र किए गए हैं)। इसके अलावा, मुझे सीधे इसे खरीदने का कोई मूल्य या तरीका नहीं मिला; लेकिन यह मेरी कंपनी के MSDN सदस्यता के साथ आता है। विजुअल स्टूडियो प्रबंधित, देशी और मिश्रित कोड का समर्थन करता है; मैं उस संबंध में अन्य दो प्रोफाइलरों के बारे में निश्चित नहीं हूं।

निष्कर्ष में, मुझे अभी तक एक अच्छे प्रोफाइलर का पता नहीं है! मैं यहाँ अन्य सुझावों की जाँच करना सुनिश्चित करूँगा।


3

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

व्यक्तिगत रूप से, मैं जो कुछ भी करता हूं उसके लिए मैं अफीम का उपयोग करता हूं, लेकिन यह हर मामले में सबसे अच्छा विकल्प नहीं हो सकता है। Vtune और शार्क दोनों ही बेहतरीन हैं।


3

चूंकि आप उस प्लेटफ़ॉर्म का उल्लेख नहीं कर रहे हैं जिस पर आप काम कर रहे हैं, इसलिए मैं कहूंगा कि लिनक्स के तहत कैशग्रिंड। निश्चित रूप से। यह Valgrind टूलसेट का हिस्सा है।

http://valgrind.org/info/tools.html

मैंने कभी भी इसकी उप-सुविधा Callgrind का उपयोग नहीं किया है, क्योंकि मेरे अधिकांश कोड अनुकूलन अंदर के कार्यों के लिए हैं।

ध्यान दें कि एक सामने KCachegrind उपलब्ध है।


3

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



2

मैंने एक क्विकटाइम क्वॉन्टिफाई करने की कोशिश की है, और क्वांटिफाई अपने अमूल्य 'सब ट्री पर फोकस' और 'सब ट्री को हटाने' के कारण जीता है।


फुल ऐक। मुझे सिर्फ C ++ एप्लिकेशन पर कुछ प्रोफाइलिंग करनी थी, और वे सटीक विशेषताएं थीं जिन्होंने वास्तव में मेरा दिन बना दिया।
एननो

2

एकमात्र संवेदनशील उत्तर इंटेल से पीटीयू है। बेशक, इंटेल प्रोसेसर पर इसका उपयोग करने के लिए और C2D मशीन पर कम से कम अधिक मूल्यवान परिणाम प्राप्त करने के लिए आर्किटेक्चर खुद को वापस सार्थक प्रोफाइल देना आसान है।


2

मैंने बहुत अच्छे परिणामों के साथ कई वर्षों तक विंडोज और लिनक्स के तहत वीटीएनयू का उपयोग किया है। बाद के संस्करणों में बदतर हो गई है, जब उन्होंने उस उत्पाद को अपने रूसी विकास चालक दल की गुणवत्ता और प्रदर्शन के लिए आउटसोर्स किया है, दोनों नीचे चले गए (एक विश्लेषण फ़ाइल खोलने के लिए अक्सर वीटीएन दुर्घटनाओं में वृद्धि, 15+ मिनट)।

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



1

मेरा पसंदीदा उपकरण आसान प्रोफाइलर है: http://code.google.com/p/easyprofiler/

यह एक संकलित समय प्रोफाइलर है: लक्ष्य क्षेत्रों का वर्णन करने के लिए स्रोत कोड को मैन्युअल रूप से रूटीन के एक सेट का उपयोग करना चाहिए। हालाँकि, एक बार एप्लिकेशन चलाने के बाद, और एक XML फ़ाइल में स्वचालित रूप से लिखे गए उपायों को देखा जाता है, यह केवल ऑब्जर्वर एप्लिकेशन को खोलने और विश्लेषण / तुलना टूल पर कुछ क्लिक करने से पहले, आप एक गुणात्मक चार्ट में परिणाम देख सकते हैं।


1

विंडोज के तहत विजुअल स्टूडियो 2010 प्रोफाइलर। VTune में एक बढ़िया कॉल ग्राफ़ टूल था, लेकिन यह Windows Vista / 7 के रूप में टूट गया। मुझे नहीं पता कि उन्होंने इसे ठीक किया है या नहीं।


0

मुझे EQATEC के लिए एक प्लग दें ... बस जो मैं देख रहा था ... सीखने और उपयोग करने के लिए सरल और मुझे वह जानकारी प्रदान करता है जिसे मुझे हॉटस्पॉट खोजने की आवश्यकता है। मैं इसे विजुअल स्टूडियो में निर्मित एक के लिए पसंद करता हूं (हालांकि मैंने वीएस 2010 को अभी तक ठीक करने की कोशिश नहीं की है)।

स्नैपशॉट लेने की क्षमता बड़ी है। मैं अक्सर एक अतिरिक्त विश्लेषण और अनुकूलन प्राप्त करता हूं, जबकि वास्तविक लक्ष्य विश्लेषण चलाने के लिए इंतजार कर रहा है ... इसे प्यार करता हूं।

ओह, और इसका आधार संस्करण मुफ्त है!
http://www.eqatec.com/Profiler/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.