5

Static CA sprawia, że ​​rozwiązanie buduje mutch wolniej. W moim przypadku> 2x wolniej niż bez CA. Możemy go wyłączyć, ale jest to zła decyzja o utracie mocy. Więc co możemy zrobić?Ulepszanie analizy kodu

Najpierw zobaczmy, jak działa CA.

Budujesz rozwiązanie. Przy każdym projekcie kompilacji po msbuild Skompiluj cel fxcopcmd.exe jest wywoływany ze ścieżkami do złożeń, które powinny być analizowane. fxcopcmd. generuje dziennik CA xml, który jest używany przez VS (lub może strumień wyjściowy). fxcopcmd.exe ładuje złożenia (szybko) i analizuje je synchronicznie, więc tylko jeden procesor jest załadowany, a 3 (w moim przypadku) nie robią nic. Dopiero po zakończeniu CA tworzony jest kolejny projekt w łańcuchu zależności projektu.

Tak więc słabym miejscem w CA było to, że możemy go poprawić - aby wymusić jego działanie równolegle do korzystania z wszystkich procesorów.

widzę takiego rozwiązania

Aby fałszywy fxcopcmd.exe że weźmie parametry z MSBuild, zapamiętać je i natychmiast zgłosić się do msbuild, że wszystko jest w porządku i nie było żadnych błędów (przez CA xml.log, lub plik powiodło się, lub może stream ...). Tak więc MSBUILD zbuduje następny projekt iw tym czasie zadzwonimy do prawdziwego fxcopcmd.exe z zapisanymi parametrami ... jeśli MSBUILD wywoła fxcopcmd.exe w następnym projekcie - zadzwonimy jeszcze raz do pliku fxcopcmd.exe ... być kilka procesów, które będą ładować wszystkie procesory. Po skończeniu prawdziwego pliku fxcopcmd.exe możemy zadzwonić do naszego celu MSBUILD, który będzie wywoływał tylko cel CA z microsoft.common.targtets bez kompilacji, a nasz fałszywy plik fxcopcmd.exe natychmiast zgłasza wyniki (CA skończył w tym czasie i mamy dziennik) do MSBUILD-VS.

Co myślisz? Czy to przyspieszy CA? Dlaczego firma Microsoft nie stworzyła takich pracowników i nie używa tylko jednego procesora w CA?

+0

Dlaczego nie tworzysz innej konfiguracji kompilacji i tylko ją w niej włączasz? Następnie możesz wybrać, kiedy zbudować z nim, czy nie. –

Odpowiedz

4

Raz zapytałem o numer similar question on Connect and got a reply directly from the team. Na szczycie ALM w 2012 omówiłem ten temat i nie było wiele powodów (w przypadkowej kolejności)

  • Silnik Code Analysis najprawdopodobniej zostanie zastąpiony raz Projektu Roslyn integruje się z produktami Visual Studio. Roslyn zaoferuje analizę w czasie rzeczywistym (np. Resharper) i możliwość "naprawienia" znalezionych problemów.
  • Silnik jest bardzo obciążony procesorem i używa już wielu procesorów, więc uruchomienie wielu instancji może nie pomóc Ci tak bardzo, jak podejrzewasz. Ponadto, fxcop może być bardzo intensywny we/wy (ładowanie złożeń, pdb i innych plików), co pogorszyłoby się tylko wtedy, gdy ładowałoby się wiele instancji w tym samym czasie.
  • Mechanizm budujący potrzebuje dostępu do danych wyjściowych kompilacji. Do referencji, ale także do innych zadań. Dlatego musi wiedzieć, że pliki nie są już używane, gdy zadanie się kończy. Na przykład, po dodaniu zadania, które IlMerges łączy kilka złożeń, które później usuwa stare, potrzebuje dostępu do tych plików. To samo dotyczy prostych akcji przenoszenia/pakietowania/etc.
  • Możliwość niepowodzenia kompilacji wcześniej, gdy problem analizy kodu (ustawiony na poziom = błąd) zostanie znaleziony, nie zadziała, ponieważ zbierasz wyniki tylko na samym końcu. Prawdopodobnie powoduje to, że budujesz wszystko, tylko po to, by dowiedzieć się, że nie możesz użyć efektu końcowego.

Jak widać tutaj w this MSDN forum post sama FxCop już korzysta z wielu wątków i (przynajmniej w przepisach dostarczanych z 2010 roku) istnieje kilka problemów z współbieżności już, że przyczyną nam wyłączyć współbieżność dla FxCop w niektóre przypadki.Jeśli chcesz FxCop używać więcej (lub mniej) wątki, można edytować plik 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> 

Choć Post Forum wspomina Visual Studio 2008, jakie zastosowano w tym celu rozwiązać problemy z 2010 roku, jak również.

Najprostszym sposobem na zwiększenie wydajności FxCop jest wywołanie go raz po skompilowaniu wszystkich projektów. Spowoduje to tylko załadowanie wszystkich symboli i odniesionych zespołów raz i pozwoli silnikowi na maksymalne wykorzystanie równoległości. Są też problemy z tym, gdy masz rozwiązanie, które łączy wiele platform docelowych i procesorów, lub gdy chcesz użyć różnych plików .rules dla różnych projektów.

Albo możesz zrobić to samo co ja, czyli skonfigurować FxCop dla twojego lokalnego rozwiązania, ale nie ustawić go tak, aby działał na każdej kompilacji. Następnie w Team Team Server Team Build (lub dowolnym innym serwerze kompilacji, którego możesz użyć), nadpisaj konfigurację, aby FxCop uruchamiał "Always". W ten sposób nie masz wpływu na wydajność podczas budowania lokalnego rozwiązania. Nadal pozwala na uruchamianie analizy kodu dla całego rozwiązania lokalnie (z elementu menu Analiza), a zautomatyzowana kompilacja może ochronić Cię przed sprawdzaniem kodu z problemami.