क्लैंग के साथ तेजी से कोड पूरा करना


108

मैं क्लैंग के कोड पूरा करने वाले तंत्र का उपयोग करते हुए संभावित कोड-पूर्ण स्पीडअप की जांच कर रहा हूं। नीचे दिए गए प्रवाह को मैंने rtags में पाया है , एंडर्स बककेन द्वारा।

अनुवाद इकाइयाँ परिवर्तन के लिए डेमॉन मॉनिटरिंग फ़ाइलों द्वारा पार्स की जाती हैं। यह कहा जाता है clang_parseTranslationUnitऔर संबंधित कार्यों ( reparse*, dispose*) द्वारा किया जाता है । जब उपयोगकर्ता किसी स्रोत फ़ाइल में किसी दिए गए लाइन और कॉलम को पूरा करने का अनुरोध करता है, तो डेमन स्रोत फ़ाइल के अंतिम सहेजे गए संस्करण और वर्तमान स्रोत फ़ाइल के लिए कैश्ड अनुवाद इकाई को पास करता है clang_codeCompleteAt। ( Clang CodeComplete डॉक्स )।

clang_parseTranslationUnit( पूर्णविराम से: :: प्रक्रिया, पंक्ति 271 ) को पारित किए गए झंडे हैं CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodesclang_codeCompleteAt( पूर्णविराम से :: :: प्रक्रिया, लाइन 305 ) को पास किए गए झंडे हैं CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns

कॉल clang_codeCompleteAtबहुत धीमा है - उन मामलों में भी पूर्णता प्राप्त करने में लगभग 3-5 सेकंड लगते हैं, जहां पूरा होने वाला स्थान एक वैध सदस्य एक्सेस कोड है, जिसके प्रलेखन में उल्लिखित इच्छित उपयोग के मामले का सबसेट है clang_codeCompleteAt। यह आईडीई कोड-पूरा करने के मानकों से बहुत धीमा लगता है। क्या इसमें तेजी लाने का कोई तरीका है?


8
मुझे आपकी मदद करने में खुशी होगी लेकिन हमें और बारीकियों की जरूरत है। उदाहरण कोड एक शुरुआत के लिए अच्छा होगा
raph.amiard

1
पिंग। क्या इस समस्या पर कोई प्रगति हुई है?
मेहरवुल्फ़

4
@Cameron आपके वापस आने में हुई लंबी देरी के बारे में क्षमा करें। मैं के सभी 8 संयोजनों की कोशिश की CXTranslationUnit_SkipFunctionBodies, CXCodeComplete_IncludeMacros, CXCodeComplete_IncludeCodePatternsऔर codebase के साथ मैं काम कर रहा हूँ पर एक महत्वपूर्ण अंतर नहीं देखा था। उन सभी का औसत लगभग 4 सेकंड प्रति पूर्ण होता है। मुझे लगता है कि यह सिर्फ टीयू के आकार के कारण है। बहुत तेजी से CXTranslationUnit_PrecompiledPreambleसुनिश्चित करता reparseTUहै। हालांकि, यहां तक ​​कि CXTranslationUnit_CacheCompletionResults, clang_codeCompleteAtमेरे उपयोग-मामले के लिए दर्दनाक रूप से धीमा है।
प्रधान

1
@ मेहरवुल्फ़ एके। ऊपर टिप्पणी देखें।
प्रधान

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

जवाबों:


6

जो समस्या clang_parseTranslationUnit में है, वह यह है कि पहले से तैयार किए गए प्रस्तावना का दूसरी बार पुन: उपयोग नहीं किया जाता है जिसे कोड पूर्णता कहा जाता है। Precompile preamble की गणना करें इन समयों में से 90% से अधिक समय लगता है इसलिए आपको यह अनुमति देनी चाहिए कि precompiled प्रस्तावना को जल्द से जल्द उपयोग किया गया था।

डिफ़ॉल्ट रूप से इसका तीसरी बार पुन: उपयोग किया जाता है जिसे अनुवाद इकाई को पार्स / रिपेयर कहा जाता है।

ASTUnit.cpp में इस वैरिएबल 'PreambleRebuildCounter' पर एक नज़र डालें।

अन्य समस्या यह है कि यह प्रस्तावना एक अस्थायी फ़ाइल में सहेजी जाती है। आप एक अस्थायी फ़ाइल के बजाय मेमोरी में प्री-कंप्लेस्ड प्रस्तावना रख सकते हैं। यह तेज होगा। :)


बहुत बढ़िया! ऐसा लगता है जैसे यह असली मुद्दे पर पहुंच जाता है। इस पर एक नज़र डालेंगे और आपको बताएंगे। धन्यवाद!
प्रधान

ठीक है! अगर यह आप के लिए काम करता है तो मुझे बतलाएगा! और यदि आपके कोई प्रश्न हैं तो मुझसे निःसंकोच पूछें !!!!
गुतिमाक

4

कभी-कभी इस परिमाण की देरी नेटवर्क संसाधनों (एनएफएस या सीआईएफएस शेयरों पर एक फ़ाइल खोज पथ या सॉकेट) पर टाइमआउट के कारण होती है। उस प्रक्रिया को मॉनिटर करने का प्रयास करें जिसे प्रत्येक सिस्टम कॉल आपके द्वारा चलाए जाने की प्रक्रिया को पूर्वनिर्मित करके पूरा करता है strace -Tf -o trace.outtrace.outसिस्टम कॉल के लिए कोण कोष्ठक में संख्या को देखें जो पूरा होने में लंबा समय लेता है।

आप सिस्टम कॉल के बीच के समय को भी देख सकते हैं कि कौन सी फाइल की प्रोसेसिंग पूरी होने में बहुत समय लेती है। ऐसा करने के लिए, अपने साथ चलने वाली प्रक्रिया को उपसर्ग करें strace -rf -o trace.out। लंबी प्रणाली कॉल अंतराल के लिए देखने के लिए प्रत्येक सिस्टम कॉल से पहले संख्या को देखें। उस बिंदु से पीछे की ओर जाएं, जो openकॉल करने के लिए देख रहा था जो कि संसाधित की जा रही फ़ाइल थी।

यदि यह मदद नहीं करता है, तो आप अपनी प्रक्रिया को यह देखने के लिए प्रोफ़ाइल कर सकते हैं कि यह अपना अधिकांश समय कहाँ बिताता है।

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