स्टैक सैम्पलिंग से परे: C ++ प्रोफाइलर


146

एक हैकर की कहानी

दिनांक 12/02/10 है। क्रिसमस से पहले के दिन टपक रहे हैं और मैंने विंडोज़ प्रोग्रामर के रूप में एक प्रमुख रोड ब्लॉक को बहुत हिट किया है। मैं AQTime का उपयोग कर रहा हूं, मैंने नींद, चमकदार और बहुत नींद की कोशिश की है, और जैसा कि हम बोलते हैं, VTune स्थापित है। मैंने VS2008 प्रोफाइलर का उपयोग करने की कोशिश की है, और यह सकारात्मक और साथ ही अक्सर असंवेदनशील है। मैंने यादृच्छिक ठहराव तकनीक का उपयोग किया है। मैंने कॉल-ट्री की जांच की है। मैं समारोह निशान निकाल दिया है। लेकिन इस मामले का सबसे दुखद तथ्य यह है कि मैं जिस ऐप के साथ काम कर रहा हूं, वह कोड की एक लाख लाइनों से अधिक है, शायद तीसरे पक्ष के ऐप्स के लायक एक और लाख लाइनें हैं।

मुझे बेहतर उपकरण चाहिए। मैंने अन्य विषयों को पढ़ा है। मैंने प्रत्येक विषय में सूचीबद्ध प्रत्येक प्रोफाइलर की कोशिश की है। वहाँ बस इन भद्दे और महंगे विकल्पों की तुलना में कुछ बेहतर होना चाहिए, या लगभग कोई लाभ नहीं के लिए काम की तेज मात्रा। अधिक जटिल मामलों के लिए, हमारे कोड को भारी रूप से पिरोया गया है, और कई क्यूटी इवेंट लूप चलाता है, जिनमें से कुछ इतने नाजुक होते हैं कि वे समय की देरी के कारण भारी इंस्ट्रूमेंटेशन के तहत दुर्घटनाग्रस्त हो जाते हैं। मुझसे मत पूछो कि हम कई ईवेंट लूप क्यों चला रहे हैं। कोई मुझे बता नहीं सकता।

क्या विंडोज़ के माहौल में वैलग्राइंड की तर्ज पर कोई विकल्प है?
क्या मेरे द्वारा पहले ही आजमाए गए टूटे औजारों के लंबे स्वाथ से बेहतर कुछ है?
क्या क्यूटी के साथ एकीकृत करने के लिए कुछ भी बनाया गया है, शायद कतार में घटनाओं के एक उपयोगी प्रदर्शन के साथ?

मेरे द्वारा आजमाए गए औजारों की एक पूरी सूची, जो वास्तव में इटैलिक में उपयोगी थे:

  • AQTime: अच्छा! गहरी पुनरावृत्ति के साथ कुछ परेशानी है, लेकिन इन मामलों में कॉल ग्राफ़ सही है, और आपके किसी भी भ्रम को दूर करने के लिए इस्तेमाल किया जा सकता है। एक आदर्श उपकरण नहीं है, लेकिन बाहर की कोशिश करने के लायक है। यह आपकी आवश्यकताओं के अनुरूप हो सकता है, और यह निश्चित रूप से मेरे लिए सबसे अच्छा था।
  • डिबग मोड में रैंडम पॉज अटैक: समय की पर्याप्त जानकारी नहीं।
    एक अच्छा उपकरण लेकिन संपूर्ण समाधान नहीं।
  • समानांतर स्टूडियो: परमाणु विकल्प। आज्ञाकारी, अजीब और पागलपन से शक्तिशाली। मुझे लगता है कि आपको 30 दिन के मूल्यांकन को हिट करना चाहिए, और यह पता लगाना चाहिए कि क्या यह एक अच्छा फिट है। यह बहुत ही शांत है।
  • एएमडी कोडीनैलिस्ट: अद्भुत, उपयोग करने में आसान, बहुत क्रैश-प्रोन, लेकिन मुझे लगता है कि यह एक पर्यावरण की बात है। मैं इसे आज़माने की सलाह दूंगा, क्योंकि यह मुफ़्त है।
  • ल्यूक स्टैकवॉकर: छोटी परियोजनाओं पर काम करता है, यह हमारे लिए काम करने की कोशिश कर रहा है। कुछ अच्छे परिणाम हालांकि, और यह निश्चित रूप से मेरे व्यक्तिगत कार्यों के लिए स्लीप को बदल देता है।
  • PurifyPlus: Win-x64 वातावरण के लिए कोई समर्थन नहीं, सबसे प्रमुख विंडोज 7. अन्यथा उत्कृष्ट। अन्य विभागों में मेरे कई सहयोगियों ने इसकी शपथ ली।
  • VS2008 प्रोफाइलर: आवश्यक रिज़ॉल्यूशन में फ़ंक्शन ट्रेस मोड में 100 + गिग्स रेंज में आउटपुट का उत्पादन करता है। प्लस साइड पर, ठोस परिणाम पैदा करता है।
  • GProf: GCC को और भी प्रभावी रूप से प्रभावी बनाने की आवश्यकता है।
  • VTune: VTune के W7 अपराधी पर सीमाओं का समर्थन करते हैं। अन्यथा उत्कृष्ट
  • पिन: मुझे अपना टूल हैक करना होगा, इसलिए यह एक अंतिम उपाय है।
  • स्लीपी \ वैलीसेपी: छोटे ऐप्स के लिए उपयोगी है, लेकिन मुझे यहाँ फेल कर रहा है।
  • ईज़ीप्रोफाइलर: बुरा नहीं है अगर आपको थोड़ा सा भी बुरा न लगे तो कोड को बताएं कि उपकरण कहां है।
  • Valgrind: * केवल निक्स, लेकिन बहुत अच्छा है जब आप उस वातावरण में हैं।
  • OProfile: केवल Linux।
  • Proffy: वे जंगली घोड़ों को गोली मारते हैं।

सुझाए गए उपकरण जिन्हें मैंने आज़माया नहीं है:

  • XPerf:
  • Glowcode:
  • Devpartner:

नोट: इस समय इंटेल वातावरण। VS2008, पुस्तकालयों को बढ़ावा दें। Qt 4+। और उन सभी के मनहूस अपमान: ट्रोलटेक के माध्यम से क्यूटी / एमएफसी एकीकरण।


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

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

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

नतीजतन, अगले तीन हफ्तों के लिए प्रत्येक सप्ताह, मैं सबसे बड़ा इनाम रख सकता हूं, जो मैं सबसे अच्छे उपकरण के साथ इसका जवाब दे सकता हूं जो मुझे लगता है कि सामान्य ज्ञान नहीं है। तीन हफ्तों के बाद, हम उम्मीद करेंगे कि प्रोफाइलर्स की एक निश्चित प्रोफ़ाइल जमा हो गई है, अगर आप मेरी चालाकी को क्षमा कर देंगे।

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


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

अभी, मुझे यह कहना होगा कि मुझे नहीं लगता कि W7x64 परिवेश में C ++ कोड की रूपरेखा के लिए कोई निश्चित विकल्प है, लेकिन निश्चित रूप से ऐसे विकल्प हैं जो किसी भी उपयोगी सेवा को करने में विफल हैं।


18
क्या आपने एक अलग नौकरी पाने पर ध्यान दिया है? :)
निकोलाई Fetissov

10
मुझे इस पहेली को सुलझाने के लिए और कहाँ मिलेगा? मुझे लगता है कि मैं कर्नेल हैकिंग पर वापस जा सकता हूं, लेकिन वह भी भुगतान नहीं करता है।
जेक कुरजर

3
@ मुझे लगता है कि आप किसी भी उपयोग के लिए gprof के लिए सोचते हैं कि आपको gcc टूलसेट का उपयोग करते हुए -pg संकलित करना होगा अन्यथा यह gprof.out फ़ाइल का उत्पादन नहीं करता है। ओपी के मामले में ऐसा लग रहा है कि वह msvc का उपयोग कर रहा है जो कि गैर-लाभकारी का उपयोग करके नियम करता है। तो फिर मैं न 'लगता है gprof होगा निष्पक्ष उसके लिए किसी भी बेहतर अगर सूची पर दूसरों अपनी जरूरतों असफल रहे हैं
greatwolf

2
@Marc Gravell यह काफी उचित है, मुझे लगता है .... यह मुझे एक अजीब सा लगता है, कि सबसे अच्छी तरह से बनाए हुए पोस्ट सामुदायिक डोमेन में अचानक से गुजरते हैं, प्रभावी रूप से एक ऐसी स्थिति पैदा करते हैं जहां आप जितना अधिक अपडेट करते हैं और अपने प्रश्न या उत्तर को बनाए रखते हैं। कम आप बड़े पैमाने पर समुदाय की नज़र में उस रखरखाव से बाहर निकलते हैं। क्या मुझे इसे मेटा में ले जाना चाहिए?
जेक कुरजर

2
क्या किसी को पूर्वव्यापी चाहिए, जो मुझे अब प्रोफाइलर्स के बारे में पता है?
जेक कूर्जर

जवाबों:


65

प्रथम:

सीपीयू नमूना प्रोफाइलरों की तुलना में समय नमूना प्रोफाइलर अधिक मजबूत होते हैं। मैं विंडोज डेवलपमेंट टूल से बहुत परिचित नहीं हूं इसलिए मैं यह नहीं कह सकता कि कौन से हैं। अधिकांश प्रोफाइलर सीपीयू के नमूने हैं।

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

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

तो एक समय नमूना प्रोफाइलर का उपयोग करें यदि संभव हो तो विशेष रूप से जब थ्रेडिंग कोड को प्रोफाइल करें।

दूसरा:

सैंपलिंग प्रोफाइलर्स डेटा के gobs उत्पन्न करते हैं। डेटा अत्यंत उपयोगी है, लेकिन आसानी से उपयोगी होने के लिए बहुत अधिक है। एक प्रोफ़ाइल डेटा विज़ुअलाइज़र यहाँ बहुत मदद करता है। प्रोफ़ाइल डेटा विज़ुअलाइज़ेशन के लिए मैंने जो सबसे अच्छा उपकरण पाया है वह है gprof2dot । नाम को आपको मूर्ख न बनाने दें, यह सभी प्रकार के नमूना प्रोफाइलर आउटपुट (AQtime, नींद, XPerf, आदि) को संभालता है। एक बार जब विज़ुअलाइज़ेशन ने आपत्तिजनक फ़ंक्शन को इंगित किया है, तो वास्तविक प्रोफ़ाइल क्या है, इस पर बेहतर संकेत प्राप्त करने के लिए कच्चे प्रोफ़ाइल डेटा पर वापस जाएं।

Gprof2dot उपकरण एक उत्पन्न करता डॉट ग्राफ वर्णन है कि आप तो एक में फ़ीड Graphviz उपकरण। आउटपुट मूल रूप से एप्लिकेशन पर उनके प्रभाव द्वारा कोडित रंग के साथ एक कॉलग्राफ है। वैकल्पिक शब्द

कुछ संकेत अच्छा उत्पादन उत्पन्न करने के लिए gprof2dot पाने के लिए।

  • मैं --skewअपने ग्राफ़ पर 0.001 का उपयोग करता हूं ताकि मैं आसानी से हॉट कोड पाथ देख सकूं। अन्यथा int main()ग्राफ पर हावी है।
  • यदि आप C ++ टेम्प्लेट के साथ कुछ भी पागल कर रहे हैं, तो आप संभवतः जोड़ना चाहेंगे --strip। बूस्ट के साथ यह विशेष रूप से सच है।
  • मैं अपना नमूना डेटा उत्पन्न करने के लिए OProfile का उपयोग करता हूं। अच्छा उत्पादन प्राप्त करने के लिए मुझे अपने तृतीय पक्ष और सिस्टम लाइब्रेरी से डिबग प्रतीकों को लोड करने के लिए इसे कॉन्फ़िगर करने की आवश्यकता है। ऐसा ही करना सुनिश्चित करें, अन्यथा आप देखेंगे कि सीआरटी आपके आवेदन का 20% समय ले रहा है जब वास्तव में क्या हो रहा mallocहै, ढेर को मिटा रहा है और 15% खा रहा है।

जबकि मुझे नहीं पता कि यह मेरी समस्याओं का पूर्ण उत्तर है, gprof2dot ने मेरे विशाल शस्त्रागार में प्रवेश किया है, और तेजी से एक पसंदीदा स्थान मान रहा है। मुझे लगता है कि यह एक इनाम के लायक है!
जेक कुरजर

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

@deft_code: "प्रोफाइलिंग के लिए एक gdb + बैकट्रेस समाधान को एक साथ हैक करें। बहुत हैक किया गया, लेकिन यह टोंटी को ढूंढता है।" आप मेरे निरंतर शेख़ी की पुष्टि कर रहे हैं :) कुछ लोग चाहते हैं कि प्रोफाइलिंग सुंदर हो, लेकिन अगर परिणाम आपके लिए आवश्यक हैं, तो क्या काम करता है, क्या सुंदर नहीं है
माइक डनलेवी

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

16

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

वीएस के तहत मैं क्या करता हूं, स्टैक डिस्प्ले को कॉन्फ़िगर करता है ताकि यह मुझे फ़ंक्शन तर्क न दिखाए, क्योंकि यह स्टैक डिस्प्ले को पूरी तरह से अपठनीय, आईएमओ बनाता है।

फिर मैं उस समय के बारे में 10 नमूने लेता हूं जब वह मुझे इंतजार करवा रहा होता है । मैं संदर्भ के लिए उन्हें नोटपैड में कॉपी करने के लिए ^ ए, ^ सी और ^ वी का उपयोग करता हूं। फिर मैं हर एक का अध्ययन करता हूं, यह जानने की कोशिश करता हूं कि उस समय पूरा करने की कोशिश में यह क्या था।

यदि यह 2 या अधिक नमूनों पर कुछ हासिल करने की कोशिश कर रहा था, और यह बात कड़ाई से आवश्यक नहीं है, तो मुझे एक जीवित समस्या मिली है, और मुझे लगभग पता है कि यह कितना फिक्सिंग बचाएगा।

ऐसी चीजें हैं जिन्हें आपको वास्तव में जानने की आवश्यकता नहीं है, जैसे सटीक प्रतिशत महत्वपूर्ण नहीं हैं, और 3-पार्टी कोड के अंदर क्या होता है, यह महत्वपूर्ण नहीं है, क्योंकि आप उन लोगों के बारे में कुछ भी नहीं कर सकते हैं । आप जिस चीज के बारे में कुछ कर सकते हैं, वह कोड में कॉल-पॉइंट्स का समृद्ध सेट है जिसे आप प्रत्येक स्टैक नमूने पर प्रदर्शित कर सकते हैं । यह आपका खुशहाल शिकार का मैदान है।

मुझे मिलने वाली चीज़ों के प्रकार:

  • स्टार्टअप के दौरान, यह DLL संसाधनों से अंतर्राष्ट्रीयकृत वर्ण स्ट्रिंग्स को निकालने की कोशिश करने की प्रक्रिया में लगभग 30 परतें गहरी हो सकती हैं। यदि वास्तविक तारों की जांच की जाती है, तो यह आसानी से पता लगा सकता है कि तार को वास्तव में अंतर्राष्ट्रीयकरण करने की आवश्यकता नहीं है , जैसे कि वे तार हैं जो उपयोगकर्ता वास्तव में कभी नहीं देखता है।

  • सामान्य उपयोग के दौरान, कुछ कोड निर्दोष रूप से किसी वस्तु में एक संशोधित संपत्ति सेट करते हैं। वह वस्तु एक सुपर-क्लास से आती है जो परिवर्तन को पकड़ती है और उन सूचनाओं को ट्रिगर करती है जो संपूर्ण डेटा संरचना में तरंग देती हैं, UI में हेरफेर करती हैं, बनाने में मुश्किलों को दूर करती हैं। यह बहुत कुछ हो सकता है - सूचनाओं के अप्रत्याशित परिणाम।

  • वर्कशीट पंक्ति-दर-पंक्ति, सेल-बाय-सेल में भरना। यह पता चलता है कि यदि आप एक बार में सभी पंक्ति बनाते हैं, तो एक मान से, यह बहुत तेज है।

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


2
टिप्पणियाँ? टिप्पणियाँ? यह स्पार्टा है! I ... क्षमा करें, पता नहीं है कि कहाँ से आया है। नहीं, कोड क्लिंगन ओपेरा को पढ़ने योग्य बनाता है, और इसके बारे में अच्छी तरह से प्रलेखित है। वास्तव में, मुझे लगता है कि यह बहुत कम प्रलेखित है .... हे भगवान।
जेक कुर्जर

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

5
क्यूटी / MFC? क्या उस 3 सिर वाले उत्परिवर्ती बच्चों का निर्माण नहीं करना चाहिए जो हर विचार को पुकारते हुए आगे और पीछे रॉक करते हैं, वे कभी भी सबसे बेवकूफ विचार सुनते हैं? इर्रर ... मैं पचाता हूं ... यदि आप एमएफसी सॉकेट कक्षाओं में से किसी का उपयोग कर रहे हैं, तो तुरंत अपने सॉकेट कोड और फिर प्रोफ़ाइल को फिर से लिखें। CSocket कोड में बहुत सारे स्थान हैं जो WaitForSingleObject के संदेश लूप संस्करण का उपयोग करता है जिसे मैंने प्रदर्शन को मारने के लिए पाया है। मेरे जीवन के लिए मैं प्रतीक्षा
फंक

2
हे भगवान, मुझ पर विश्वास करो, यह उतना ही डरावना है जितना कि आप सोचते हैं।
जेक कुर्जर

3
@ जेक: बहुत आराम नहीं है, लेकिन यह ट्यूरिंग सार्वभौमिकता की महिमा है। कोई भी भाषा, चाहे वह कितनी भी ऊँची या नीची क्यों न हो, दुरुपयोग होने की उसकी अनगढ़ क्षमता के बराबर है।
माइक डनलैवी

8

मुझे AMD CodeAnalyst के साथ कुछ सफलता मिली है ।


फिलहाल इंटेल का माहौल। मैं इसे ध्यान में रखना होगा, हालांकि! :)
जेक कुर्जर

4
@ जेक: मुझे यकीन नहीं है कि तुम वहाँ क्या मतलब है। AMD कोडअनलिस्ट को AMD चिप्स की आवश्यकता नहीं होती है, इसे Intel चिप्स सहित अधिकांश x86 या x64 (उर्फ x86-64 / IA-64 / AMD64) चिप्स पर काम करना चाहिए।
एडम रोसेनफील्ड

1
जाहिर है, मैं अनपढ़ हूँ! यह अद्भुत खबर है। मैं कल इसे आजमाऊंगा और सवाल को अपडेट करूंगा।
जेक कुरजर

अब तक, यह बहुत अस्थिर है जब मुझे जिन प्रस्तावों की आवश्यकता होती है, उन पर नमूना लेना।
जेक कुरजर

@ एडम: मैंने हाल ही में एक इंटेल पेंटियम IV मशीन पर कोड एनालिस्ट की कोशिश की, और इसने केवल थ्रेड-टाइम सैंपलिंग की पेशकश की, जिसमें थ्रेड के उपयोग के बारे में कोई जानकारी नहीं थी, न ही थ्रेड संबंधित जानकारी जो भी ... मुझे जो जानकारी मिली, वह वास्तव में औसत दर्जे की थी। इसके अलावा यह दृश्य स्टूडियो के क्यूटी एकीकरण में दुर्घटनाओं का कारण बना .. मैं संतुष्ट नहीं था :(
स्मरलिन

7

क्या आपके पास MFC OnIdle फ़ंक्शन है? अतीत में मेरे पास एक वास्तविक समय वाला ऐप था जिसे मुझे ठीक करना था जो कि 19.2K की गति से सेट होने पर सीरियल पैकेट छोड़ रहा था जिसे पेंटियमड को बनाए रखने में सक्षम होना चाहिए। OnIdle फ़ंक्शन वह था जो चीजों को मार रहा था। मुझे यकीन नहीं है कि अगर क्यूटी के पास यह अवधारणा है, लेकिन मैं उसके लिए भी जांच करूंगा।


2
हम वास्तव में एक OnIdle है, और हमारे qtmfc एकीकरण के लिए धन्यवाद, यह qt ev..e ... पूर्व संध्या ... पाश के माध्यम से बह रहा है। ओह G'd।
जेक कुरजर

यह बताता है कि यह सीधे हमारे समाधान की ओर ले जाता है, इसलिए जब तक यह सवाल का सही जवाब नहीं है, मुझे लगता है कि यह सवाल अचूक है।
जेक कुरजर

4

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

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

इससे आपकी नमूना फ़ाइल का आकार कम करने में मदद मिलनी चाहिए, और केवल वही कैप्चर करना चाहिए जो आपके विश्लेषण के लिए आवश्यक है।


मैं इसे कल एक शॉट दूँगा।
जेक कुरजेर

4

मैंने सफलतापूर्वक Windows के लिए PurifyPlus का उपयोग किया है । हालांकि यह सस्ता नहीं है, आईबीएम एक परीक्षण संस्करण प्रदान करता है जो थोड़ा अपंग है। आप सभी को मात्रा निर्धारित करने के लिए प्रोफाइलिंग की जरूरत है, पीडीबी फाइलें और / फिक्स्ड के साथ लिंक करना: नहीं। केवल दोष: Win7 / 64 के लिए कोई समर्थन नहीं।


दुर्भाग्य से, हमारा प्राथमिक लक्ष्य Win7 है। मैं उस जानकारी को मुख्य पोस्ट में जोड़ दूँगा।
जेक कुर्जर

1
PurifyPlus का वर्तमान संस्करण Win7 / 64 का समर्थन करता है।
hmuelner

3

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

हालांकि, आपकी नवीनतम टिप्पणियों के अनुसार, ऐसा लगता है कि आप कम से कम कुछ हेडवे बना रहे हैं । शायद यह उपकरण आपके लिए कुछ उपयोगी मैट्रिक्स प्रदान कर सकता है। अगर और कुछ नहीं तो इसके कुछ सच में प्यारे चार्ट और चित्र हैं: P


3

दो और उपकरण सुझाव।

ल्यूक स्टैकवॉकर का एक प्यारा नाम है (भले ही यह मेरे स्वाद के लिए थोड़ी कोशिश कर रहा है), यह आपको कुछ भी खर्च नहीं करेगा, और आपको स्रोत कोड मिलता है। यह बहु थ्रेडेड प्रोग्रामों को भी सपोर्ट करने का दावा करता है। तो यह निश्चित रूप से एक स्पिन के लायक है।

http://lukestackwalker.sourceforge.net/

इसके अलावा, Glowcode, जिसे मैंने उपयोग करने लायक बताया है:

http://www.glowcode.com/

दुर्भाग्य से मैंने कुछ समय के लिए कोई पीसी काम नहीं किया है, इसलिए मैंने इनमें से किसी की भी कोशिश नहीं की है। मुझे आशा है कि सुझाव वैसे भी मदद के हैं।


3

चेकआउट XPerf

यह एमएस द्वारा दिया जाने वाला मुफ्त, गैर-इनवेसिव और एक्स्टेंसिबल प्रोफाइलर है। यह Microsoft द्वारा विंडोज को प्रोफाइल करने के लिए विकसित किया गया था।


3

यदि आपको इवेंट लूप पर संदेह है, तो QCoreApplication को ओवरराइड कर सकते हैं :: नोटिफ़िकेशन () और डॉसोम मैनुअल प्रोफाइलिंग (सेंडर / समय के लिए प्रेषकों / घटनाओं के एक या दो नक्शे)?

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

हमने अपने ईवेंट हैंडलर में अपवादों को फंसाने और रिपोर्ट करने के लिए ऐसा किया है, इसलिए वास्तव में, हर घटना वहां से गुजरती है।

एक विचार है।


यह एक सुंदर विचार है! मैं क्यूटी वातावरण का आदी नहीं हूं, मैंने अपने अधिकांश काम यहां pyGTK के साथ किए हैं। धन्यवाद!
जेक कुरजेर

क्या आपके पास दिए गए संकेतों की प्रकृति को सोर्स करने और हल करने का एक अनुशंसित तरीका है?
जेक कुरजर

मैंने केवल इसे QStateMachine के साथ संकेतों के लिए किया है :: SignalEvent, जो समान प्रतीत नहीं होता है। स्रोत अभी भी QObject* objectपैरामीटर होना चाहिए । शायद MetaCall सभी संकेतों के लिए प्रकार है (संभावना लगता है), लेकिन मुझे यकीन नहीं है। यह मेरे अनुभव से थोड़ा परे है, लेकिन क्यूटी स्रोत में झांकना कुछ सच्चाई को बढ़ा सकता है। (या, एसओ पर यहां एक और अधिक बताया गया प्रश्न पंक्ति कतारबद्ध सिग्नल इनवोकेशन पूछें :) :)
मैके डे

2

संपादित करें: मैं देख रहा हूं कि आपने अपनी पहली पोस्ट में इसका उल्लेख किया है। दमयन्ती, मैंने कभी नहीं सोचा था कि मैं वह आदमी हूँ।

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


दरअसल, पिन वही था जिसके लिए मैं पहली बार पहुंचा था। वास्तव में पिन प्ले नामक कुछ ऐसा है जो एकदम सही होगा, लेकिन यह इंटेल के बाहर जारी करने के लिए नहीं है। मुझे यकीन नहीं है कि मुझे पिन का उपयोग करने के बारे में पर्याप्त याद है कि एक साथ कुछ वास्तव में अच्छा है, लेकिन ...
जेक कुर्जर

2

मैं आपको बता सकता हूं कि मैं हर रोज क्या उपयोग करता हूं।

ए) एएमडी कोड विश्लेषक

  • यह आसान है, और यह आपको एक त्वरित अवलोकन देगा कि क्या हो रहा है। यह ज्यादातर समय के लिए ठीक रहेगा।
  • एएमडी सीपीयू के साथ, यह आपको सीपीयू पाइपलाइन के बारे में जानकारी बताएगा, लेकिन आपको इसकी केवल तभी आवश्यकता है जब आपके पास भारी लूप हों, जैसे ग्राफिक इंजन, वीडियो कोडेक्स आदि।

बी) वीट्यून।

  • यह vs2008 में बहुत अच्छी तरह से एकीकृत है

  • हॉटस्पॉट्स के बारे में जानने के बाद, आपको न केवल समय, बल्कि कैश मिस और मेमोरी उपयोग जैसी अन्य चीजों का नमूना लेना होगा। यह बहुत महत्वपूर्ण है । एक नमूना सत्र सेट करें, और गुणों को संपादित करें। मैं हमेशा समय के लिए नमूना, मेमोरी रीड / राइट, और कैश मिस (तीन अलग-अलग रन)

लेकिन टूल से अधिक, आपको प्रोफाइलिंग के साथ अनुभव प्राप्त करने की आवश्यकता है। और इसका अर्थ है कि सीपीयू / मेमोरी / पीसीआई कैसे काम करता है ... यह मेरा 3 विकल्प है

ग) इकाई परीक्षण

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

मेरी सलाह कई छोटे परीक्षणों में यादृच्छिक नमूने का उपयोग कर रही है, और एक प्रोफ़ाइल रणनीति को मानकीकृत करने का प्रयास करें।


AMD कोड एनालिस्ट मेरे देव वातावरण में अस्थिर है, और VTune स्पष्ट रूप से इसका समर्थन नहीं करता है। : एस
जेक कुरजर

2

मैं अपनी सभी प्रोफाइलिंग जरूरतों के लिए xperf / ETW का उपयोग करता हूं। इसमें एक मजबूत सीखने की अवस्था है, लेकिन यह अविश्वसनीय रूप से शक्तिशाली है। अगर आप विंडोज पर प्रोफाइलिंग कर रहे हैं तो आपको xperf पता होना चाहिए। मैं अपने कोड में और अन्य लोगों के कोड में प्रदर्शन समस्याओं को खोजने के लिए अक्सर इस प्रोफाइलर का उपयोग करता हूं।

कॉन्फ़िगरेशन में जो मैं इसका उपयोग करता हूं:

  • xperf हर कोर से CPU सैंपल लेता है जो हर ms में कोड निष्पादित कर रहा है। नमूने की दर 8 KHz तक बढ़ाई जा सकती है और नमूनों में उपयोगकर्ता-मोड और कर्नेल कोड शामिल हैं। यह पता लगाने की अनुमति देता है कि एक धागा क्या चल रहा है
  • xperf हर संदर्भ स्विच को रिकॉर्ड करता है (प्रत्येक थ्रेड का उपयोग करने के लिए कितना समय का सही पुनर्निर्माण की अनुमति देता है), प्लस थ्रेड्स में स्विच होने पर कॉल स्टैक्स, प्लस थ्रेड के लिए कॉल कॉल क्या थ्रेड किसी अन्य थ्रेड को पढ़ता है, प्रतीक्षा श्रृंखला के अनुरेखण की अनुमति देता है और पता लगाता है कि थ्रेड क्यों काम नहीं कर रहा है
  • xperf सभी प्रक्रियाओं से सभी फ़ाइल I / O रिकॉर्ड करता है
  • xperf सभी प्रक्रियाओं से सभी डिस्क I / O रिकॉर्ड करता है
  • xperf रिकॉर्ड करता है कि कौन सी विंडो सक्रिय है, सीपीयू फ्रीक्वेंसी, सीपीयू पावर स्टेट, यूआई देरी, आदि।
  • xperf एक प्रक्रिया से सभी ढेर आवंटन रिकॉर्ड कर सकता है, सभी प्रक्रियाओं से सभी आभासी आवंटन, और बहुत कुछ।

यह सभी प्रक्रियाओं के लिए, एक समय पर सभी डेटा है। विंडोज पर कोई अन्य प्रोफाइलर ऐसा नहीं कर सकता है।

मैंने xperf / ETW का उपयोग करने के बारे में बड़े पैमाने पर ब्लॉग किया है। ये ब्लॉग पोस्ट और कुछ पेशेवर गुणवत्ता वाले प्रशिक्षण वीडियो यहां देखे जा सकते हैं: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

यदि आप यह जानना चाहते हैं कि क्या हो सकता है यदि आप इन ब्लॉग पोस्टों को पढ़ने के लिए xperf का उपयोग नहीं करते हैं: http://randomascii.wordpress.com/category/investigative-reporting/ ये प्रदर्शन समस्याओं की दास्तां हैं जो मुझे अन्य लोगों के कोड में मिली हैं , जो डेवलपर्स द्वारा पाया जाना चाहिए था। इसमें mshtml.dll को VC ++ कंपाइलर में लोड किया जा रहा है, जो कि VC ++ की फाइंड-इन-फाइल्स में सर्विस से वंचित है, ग्राहक मशीनों की एक आश्चर्यजनक संख्या में थर्मल थ्रॉटलिंग, विजुअल स्टूडियो में स्लो सिंगल-स्टेपिंग, हार्ड में 4 जीबी आवंटन डिस्क ड्राइवर, एक पॉवरपॉइंट प्रदर्शन बग, और बहुत कुछ।


1

मैंने अभी CxxProf का पहला प्रयोग करने योग्य संस्करण समाप्त किया है , जो C ++ के लिए पोर्टेबल मैनुअल इंस्ट्रूमेंटेड लाइब्रेरी है।

यह निम्नलिखित लक्ष्यों को पूरा करता है:

  • आसान एकीकरण
  • आसानी से संकलन समय के दौरान काम को हटा दें
  • रनटाइम के दौरान आसानी से लिब को हटा दें
  • Multithreaded अनुप्रयोगों के लिए समर्थन
  • वितरित प्रणालियों के लिए समर्थन
  • न्यूनतम पर प्रभाव रखें

इन बिंदुओं को प्रोजेक्ट विकी से काट दिया गया था , अधिक जानकारी के लिए वहां एक नज़र डालें।

अस्वीकरण: CxxProf के मुख्य डेवलपर Im


1

बस इसे बाहर फेंकने के लिए, भले ही यह पूर्ण-विकसित प्रोफाइलर नहीं है: यदि आप सभी के बाद इवेंट लूप्स हैं जो एक घटना को लंबे समय तक संसाधित करते हैं, तो एक एड-हॉक टूल क्यूटी में सरल मामला है। उस घटना को ट्रैक करने के लिए आसानी से विस्तारित किया जा सकता है कि प्रत्येक घटना को कितनी देर तक संसाधित किया गया था, और उन घटनाओं में क्या था, और इसी तरह। यह एक सार्वभौमिक प्रोफाइलर नहीं है, बल्कि एक घटना-पाश-केंद्रित है।

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


0

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


0

हालांकि आपका ओएस win7 है, प्रोग्राम XP के तहत नहीं चल सकता है? कैसे के बारे में यह XP के तहत प्रोफ़ाइल और परिणाम win7 के लिए एक संकेत होना चाहिए।


निश्चित रूप से, यह हो सकता है, लेकिन इसके लिए एक ऐसे उत्पाद के लिए लाइसेंस खरीदने की आवश्यकता होगी जो आपके वांछित देव को अच्छी तरह से समर्थन नहीं दे सकता है, या ऐसा करने में वर्षों लग सकते हैं। 1.5k दांव लगाने के लिए बहुत पैसा है, साथ ही इमेजिंग के समय और एक एक्सपी बॉक्स को तैनात करने में खर्च होता है।
जेक कुर्जर

0

यहाँ बहुत सारे प्रोफाइलर्स सूचीबद्ध हैं और मैंने उनमें से कुछ को स्वयं आज़माया है - हालाँकि मैंने इस पर आधारित अपना लेखन समाप्त कर दिया है:

http://code.google.com/p/high-performance-cplusplus-profiler/

यह ज़रूरी है कि आप कोड आधार को संशोधित करें, लेकिन यह बाधाओं को कम करने के लिए एकदम सही है, सभी x86s पर काम करना चाहिए (मल्टी-कोर बॉक्स के साथ एक समस्या हो सकती है, अर्थात यह rdtsc का उपयोग करता है, हालांकि - यह शुद्ध रूप से संकेत समय के लिए वैसे भी है - तो मुझे लगता है कि यह मेरी जरूरतों के लिए पर्याप्त है ..)



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