5

स्टेटिक सीए समाधान को मच्छ धीमा बनाता है। मेरे मामले में> बिना सीए के 2x धीमी गति से। हम इसे अक्षम कर सकते हैं लेकिन यह अपनी शक्ति खोने का बुरा निर्णय है। तो हम क्या कर सकते हैं?कोड विश्लेषण सुधार

सबसे पहले देखते हैं कि सीए कैसे काम करता है।

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

तो सीए में कमजोर जगह हम इसे सुधार सकते हैं - इसे सभी CPUs का उपयोग करने के लिए समानांतर में काम करने के लिए मजबूर करने के लिए।

मैं देख रहा हूँ इस तरह के समाधान

नकली fxcopcmd.exe कि MSBuild से पैरामीटर ले जाएगा, यह याद रखना और तुरंत (CA xml.log के माध्यम से MSBuild कि सब ठीक है और कोई त्रुटि वहाँ थे के लिए रिपोर्ट बनाने के लिए, या सफल फ़ाइल, या शायद स्ट्रीम ..)। तो MSBUILD अगली प्रोजेक्ट का निर्माण करेगा और उस समय हम सहेजे गए पैरामीटर के साथ वास्तविक fxcopcmd.exe को कॉल करेंगे ... यदि MSBUILD अगली प्रोजेक्ट पर fxcopcmd.exe को कॉल करेगा - हम एक और बार fxcopcmd.exe कॉल करेंगे ... तो वहां होगा कुछ प्रक्रियाएं हों जो सभी सीपीयू लोड करेंगी। वास्तविक fxcopcmd.exe समाप्त होने के बाद हम अपने एमएसबीयूआईएलडी लक्ष्य को कॉल कर सकते हैं जो संकलन के साथ microsoft.common.targtets से केवल सीए लक्ष्य को कॉल करेगा और हमारे नकली fxcopcmd.exe तत्काल रिपोर्टिंग परिणाम देगा (सीए उस समय समाप्त हो गया है और हमारे पास लॉग है) MSBUILD-VS के लिए।

आपको क्या लगता है? क्या यह सीए तेज होगा? माइक्रोसॉफ्ट ने ऐसे कर्मचारियों को क्यों नहीं बनाया और सीए में केवल एक सीपीयू का उपयोग किया?

+0

आप एक अलग निर्माण कॉन्फ़िगरेशन क्यों नहीं करते हैं और केवल इसे सक्षम करते हैं? फिर आप चुन सकते हैं कि इसके साथ कब निर्माण करना है या नहीं। –

उत्तर

4

मैंने एक बार से पूछा है। 2012 में एएलएम शिखर सम्मेलन मैं विषय पर चर्चा की और कई कारणों से (किसी विशेष क्रम में)

  • कोड विश्लेषण इंजन सबसे अधिक संभावना एक बार परियोजना रोसलिन दृश्य स्टूडियो उत्पाद में एकीकृत बदल दिया जाएगा थे। Roslyn रीयलटाइम विश्लेषण (जैसे Resharper) और पाए गए मुद्दों को ठीक करने की क्षमता प्रदान करेगा।
  • इंजन बहुत सीपीयू गहन है और पहले से ही कई सीपीयू का उपयोग करता है, इसलिए कई उदाहरणों को चलाने से आप जितना ज्यादा संदेह कर सकते हैं उतनी मदद नहीं कर सकते हैं। इसके अलावा, fxcop बहुत I/O गहन हो सकता है (असेंबली लोड करना, पीडीबी, और अन्य फाइलें) जो एक ही समय में कई उदाहरण लोड करते समय केवल खराब हो जाएंगे।
  • बिल्ड इंजन को बिल्ड आउटपुट तक पहुंच की आवश्यकता है। संदर्भ के लिए, लेकिन अन्य कार्यों के लिए भी। इसलिए यह जानना आवश्यक है कि कार्य समाप्त होने पर फ़ाइलें अब उपयोग में नहीं हैं। उदाहरण के लिए, जब आप एक ऐसा कार्य जोड़ते हैं जो कई असेंबली को एक साथ जोड़ता है जो पुराने लोगों को बाद में हटा देता है, तो उन्हें उन फ़ाइलों तक पहुंच की आवश्यकता होती है। सरल चाल/पैकेज/आदि कार्यों के लिए ही चला जाता है।
  • कोड विश्लेषण समस्या (स्तर = त्रुटि पर सेट) मिलने पर प्रारंभ में विफल होने की क्षमता काम नहीं करेगी, क्योंकि आप केवल अंत में परिणाम एकत्र कर रहे हैं। संभवतः आप सब कुछ बनाने के लिए प्रेरित करते हैं, केवल यह पता लगाने के लिए कि आप अंतिम परिणाम का उपयोग नहीं कर सकते हैं।

आप यहाँ this MSDN forum post में देख सकते हैं, FxCop ही पहले से ही एक से अधिक थ्रेड और का उपयोग करता है वहाँ संगामिति के साथ कुछ मुद्दे हैं (कम से कम नियमों कि 2010 के साथ भेज दिया में) पहले से ही उस में FxCop के लिए संगामिति बंद करने के लिए हमें का कारण कुछ मामलों।आप और अधिक (या कम) धागे का उपयोग करने के FxCop चाहते हैं, आप fxcopcmd.exe.config फ़ाइल को संपादित कर सकते हैं:

<FxCopEngineSettings Version="1.32"> 
    <Engines> 
    <Engine Name="Introspection" Enabled="True"> 
     <!-- Change this number to use more (or fewer) threads --> 
     <Threading Count="1" /> 
     <EnableFlowAnalysis>True</EnableFlowAnalysis> 
    </Engine> 
    </Engines> 
</FxCopEngineSettings> 

हालांकि मंच पोस्ट विजुअल स्टूडियो 2008 का उल्लेख है, मैं इस आवेदन किया है 2010 से समस्याओं को ठीक करने के साथ-साथ।

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

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

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