2011-11-12 12 views
5

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

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

संपादित करें: आदर्श रूप में मैं सिर्फ डिबगर तरह भरी हुई dll में हुक चाहते हैं (चल मेजबान प्रक्रिया के लिए संलग्न है और आवश्यकतानुसार dll में कहीं एक ब्रेकपाइंट रखने) करने में सक्षम है। क्या यह संभव है? यदि नहीं, तो मैं पूछने के लिए AIX के तहत एक ही कार्य के लिए सुझाव/उत्तर प्रदान के लिए 2010

बोनस अंक क्यों :-)

मैं दृश्य स्टूडियो के TFS संस्करण का उपयोग कर रहा एक और सवाल पूछने के लिए की आवश्यकता होगी (आह , कई वातावरण की खुशी!)।

+0

आप किस प्रोफाइलर का उपयोग कर रहे हैं? क्या आपने बस होस्ट प्रोग्राम चलाने की कोशिश की? यदि आपके पास प्लगइन के लिए प्रतीक हैं, तो यह अभी भी काम करना चाहिए .. –

+0

वीएस -2010 में अंतर्निहित प्रोफाइलर। मैं मेजबान कार्यक्रम की प्रारंभ प्रक्रिया को खोलने की कोशिश करूंगा लेकिन यह बिल्कुल आसान नहीं है क्योंकि इसे कई अन्य कार्यक्रम/कनेक्शन की आवश्यकता है। यह एक साधारण foo.exe नहीं है ... मुझे थोड़ी देर की आवश्यकता होगी, इसलिए मैंने यह जांचने के बारे में सोचा कि लोड किए गए डीएल में "हुक" करने का कोई तरीका था, जैसे डीबगर सक्षम है। – Francesco

+1

अपने समाधान में अपने डीएलएल के लिए प्रोफाइलर सक्षम करें, अपने निष्पादन योग्य फ़ोल्डर में सभी प्रोग्राम पेड़ कॉपी करें या प्रोग्राम फ़ोल्डर में अपना डीएल डाल दें। foo.exe होने के लिए निष्पादन योग्य फ़ाइल नाम सेट करें और प्रोफाइलर चलाएं ... – neagoegab

उत्तर

3

यह संभव है कि यह थोड़ा परेशान हो।

  1. तैनात अपने प्लग में जहां मेजबान आवेदन इसकी आवश्यकता को DLL होने की
  2. अपने मेजबान आवेदन लॉन्च और सत्यापित करें कि यह आपके उपयोग कर रहा है
  3. प्लग में बनाएं एक नया प्रदर्शन सत्र
  4. जोड़ें चरण 3
  5. सैम्पलिंग का चयन करें या इंस्ट्रूमेंटेशन से एक लक्ष्य के रूप मेजबान EXE अपने सत्र
  6. लॉन्च की रूपरेखा सत्र के लिए सत्र में

इस दौरान आपके प्लग-इन समाधान को लोड किया गया है और वीएस को आपके प्लग-इन के लिए प्रतीकों को स्वचालित रूप से ढूंढना चाहिए।

+0

ऐसा लगता है कि मेरे मन में क्या था। यह मेरे लिए महत्वपूर्ण है (आपके चरण 4 में) होस्ट को वास्तविक चलने की प्रक्रिया के रूप में निर्दिष्ट करने के लिए, इसे पुनरारंभ किए बिना निर्दिष्ट करें (कमांड लाइन पैरामीटर निर्दिष्ट करना या इसी तरह)। मैं जितनी जल्दी हो सके कोशिश करूँगा, लेकिन अगर यह काम करता है, तो तुम्हारा वह जवाब है जिसे मैं ढूंढ रहा था :) – Francesco

1

वीएस 10 के बारे में निश्चित नहीं है, लेकिन पुराने लोगों में, आप इसे चलाने के लिए exe निर्दिष्ट करके डीएलएल डीबग करते हैं।

चलिए समस्या को दो भागों में विभाजित करते हैं: 1) यह पता लगाने के लिए कि आप "बाधाएं" कह सकते हैं, और 2) प्रत्येक को ठीक करके आपको प्राप्त होने वाली समग्र गति को मापना।

(2) आसान है, है ना? आपको बस एक बाहरी टाइमर चाहिए।

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

Here's an example जहां एक काफी अच्छा लिखा कार्यक्रम इसके निष्पादन समय 20 करने के लिए 48 सेकंड से कम था, 17, 13, 10, 7, 4, 2.1, और अंत में 1.1, 8 पुनरावृत्तियों। ** एक यौगिक speedup कारक है कि 40x से अधिक। आपके द्वारा प्राप्त किए जा सकने वाले स्पीडअप कारक प्रत्येक अलग-अलग कार्यक्रम में अलग-अलग होते हैं - कुछ कम हो सकते हैं, कुछ अधिक प्राप्त कर सकते हैं, इस पर निर्भर करते हुए कि वे पहले स्थान पर कितने करीब हैं। ऐसा करने का कोई रहस्य नहीं है कि यह कैसे करें। विधि random pausing थी। (यह एक प्रोफाइलर का उपयोग करने का एक विकल्प है। प्रोफाइलर्स विभिन्न चीजों को मापते हैं, और आपको विभिन्न संकेत देते हैं जो सहायक हो सकते हैं या नहीं भी हो सकते हैं, लेकिन वे विश्वसनीय रूप से आपको बताते हैं कि समस्या क्या है।)

** गति हासिल किए गए कारक, प्रति पुनरावृत्ति 2.38, 1.18, 1.31, 1.30, 1.43, 1.75, 1.90, 1.91 थे। इसे रखने का एक और तरीका यह है कि प्रत्येक पुनरावृत्ति में प्रतिशत का समय कम हो गया: 58%, 15%, 24%, 23%, 30%, 43%, 48%, 48%। मुझे प्रोफाइलर प्रशंसकों से कठिन समय मिलता है क्योंकि विधि बहुत मैन्युअल है, लेकिन वे कभी भी स्पीडअप परिणामों के बारे में बात नहीं करते हैं। (शायद वह बदल जाएगा।)

+0

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

+0

@ फ्रांसेस्को: बहुत से लोग इस विधि को जानते हैं। विचार यह है कि ऐसी चीजें हो सकती हैं जो आप समय बचाने के लिए ठीक कर सकते हैं जो दिनचर्या या यहां तक ​​कि कोड की रेखाओं के लिए स्थानीयकृत नहीं हैं, लेकिन नमूने पर एक अच्छा नज़र डालने से जल्दी मिल सकता है, * [इस पोस्ट] में दिखाया गया है (http://stackoverflow.com/questions/7916985/what-is-boilerplate-code-hot-code-and-hot-spots/7923574#7923574)*। –

+0

@ फ्रांसेस्को: यदि आप सांख्यिकीय रूप से इच्छुक हैं, तो इसके पीछे सिद्धांत बीटा, द्विपदीय या नकारात्मक द्विपक्षीय वितरण के साथ भी समझाया जा सकता है, लेकिन आपको इसका उपयोग करने के लिए यह जानने की आवश्यकता नहीं है। –

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