2016-04-03 11 views
5

यह पता लगाने के लिए कि मेरे डी कोड के किस भाग को संकलित करने में लंबा समय लगता है?डी कंपाइलर प्रोफाइलिंग

मैंने वालग्रिंड का उपयोग करने की कोशिश की, लेकिन विधि के नाम बहुत अंतर्दृष्टि नहीं थे। समय के 87% _D4ddmd5lexer5Lexer4scanMFPS4ddmd6tokens5TokenZv

में में <cycle 7>, समय का 40% खर्च किया गया था मैं कुछ इस तरह की तलाश में हूँ: समय का 40% xy.d पर खर्च किया गया था, समय की है कि 80% से बाहर विभिन्न संकलन लिया टेम्पलेट xyz का तत्कालकरण और एक कारण यह है क्योंकि यह memcpy 99% समय का उपयोग करता था।

मुझे डीएमडी और एलडीसी दोनों प्रोफाइलिंग में दिलचस्पी है।

+1

डी संकलक में कौन सी भाषा लिखी गई है? क्या आप जीडीबी के तहत डी कंपाइलर का डीबग संस्करण चला सकते हैं? यदि आप कर सकते हैं, इसे रोकें और कंपाइलर की डेटा संरचना को देखें और देखें कि यह किस पर काम कर रहा है। यह कुछ बार करो। यह सबसे ज्यादा काम कर रहा है स्पष्ट होगा।आपको सटीक माप की तरह कुछ भी नहीं चाहिए। –

+0

मुझे नहीं पता (अभी तक) इसे जीडीबी तक कैसे लगाया जाए, और कंपाइलर्स का डीबग संस्करण कैसे प्राप्त करें, लेकिन मैं कोशिश करूंगा। – Tamas

उत्तर

1

डी डी कंपाइलर फ्रंट एंड डी में लिखा गया है, पारंपरिक उपकरणों का उपयोग करके प्रोफाइलिंग सी ++ जैसी किसी चीज़ की तुलना में कठिन होगी। मुझे लिनक्स पर gdb और valgrind जैसे टूल और विंडोज़ पर विजुअल डी जैसे टूल का उपयोग करके कुछ सफलता मिली है, मैक उपयोगकर्ता एसओएल की तरह हैं।

आप पांच अन्य विकल्प हैं:

  1. संकलक में विशेष समारोह खोजने के लिए और समस्या के बारे में सामान्य ज्ञान की ओर रुख (नीचे देखें)
  2. https://github.com/CyberShadow/DBuildStat की तरह एक उपकरण का उपयोग करने की कोशिश कर बंद करो। यह आपको सटीक उत्तर नहीं देता है जिसके बारे में आप पूछ रहे हैं, लेकिन यदि आप तेजी से संकलित करने के लिए एक बड़ी परियोजना प्राप्त करने की कोशिश कर रहे हैं तो यह कुछ भी नहीं है।
  3. -v ध्वज का उपयोग करके देखें और देखें कि आपके प्रोग्राम के कौन से हिस्से कुछ समय लेते हैं। माना जाता है, यह एक बहुत ही क्रूर बल दृष्टिकोण है और आपको थोड़ी देर ले सकता है।
  4. -profile स्विच का उपयोग करने के लिए डीएमडी फ्रंट-एंड मेकफ़ाइल संशोधित करें। हर बार जब आप डीएमडी चलाते हैं तो आपको बहुत सारी जानकारी के साथ प्रोफाइल फाइल मिल जाएगी। अनुमोदित, मुझे नहीं लगता कि यह कभी कोशिश की गई है। आपका मिलेज भिन्न हो सकता है।
  5. इसके बारे में एलडीसी टीम से उनके गिथब मुद्दों के पृष्ठ पर पूछने का प्रयास करें। आईआईआरसी ने प्रोफाइलिंग के लिए एक पैच संस्करण बनाया है कि वे Weka.io codebase के लिए उपयोग किया जाता है।

जब मैं सामान्य ज्ञान की बात करता हूं, तो मेरा कहना है कि आपकी धीमी संकलन कुछ सामान्य समस्याओं के कारण होने की संभावना है। उदाहरण के लिए, जब एक SQL क्वेरी बहुत अधिक समय ले रही है, तो मेरी पहली प्रतिक्रिया MySQL सर्वर कोड को प्रोफ़ाइल करने का प्रयास नहीं करना है। यहाँ, सबसे सामान्य समस्याओं

  1. CTFE के एक जोड़े हैं, जबकि यह अपने क्रम को गति, धीमी है। विशेष रूप से यदि आप allSatisfy या ctRegex जैसे आपके उपयोग करने वाले कार्यों जैसे रिकर्सिव टेम्पलेट्स कर रहे हैं। यदि आप भारी सीटीएफई कर रहे हैं और आप संभावित धीमी कोड की कीमत पर तेजी से संकलन करना चाहते हैं, तो उन्हें रन टाइम कॉल पर स्विच करने पर विचार करें।
  2. डीएमडी आपके प्रोग्राम में उपयोग नहीं किए जाने वाले प्रतीकों को अनदेखा नहीं करता है, जिसका अर्थ है कि यदि आप मॉड्यूल आयात करते हैं, तो मॉड्यूल में सभी कार्यों के लिए कोड-जेन होगा। चुनिंदा आयात के लिए भी यह सच है। यदि आप उनका उपयोग नहीं करते हैं तो लिंकर परिणामी निष्पादन योग्य से कार्यों को छीन लेगा, लेकिन संकलक ने अभी भी उन्हें संकलित करने में समय लगाया है। import std.algorithm; या import std.range; जैसे आयात से बचें। इसके बजाय पैकेज विशिष्ट आयात जैसे import std.algorithm.iteration : map; का उपयोग करें।
संबंधित मुद्दे