代码分析改进

时间:2013-05-26 12:05:29

标签: .net visual-studio msbuild code-analysis static-code-analysis

静态CA使解决方案构建变得更慢。在我的情况下>比没有CA慢2倍。我们可以禁用它,但这是失去力量的坏决定。 所以,我们能做些什么?

首先让我们看看CA是如何运作的。

您构建解决方案。在每个项目构建之后,msbuild编译目标fxcopcmd.exe被调用,其中包含应该分析的程序集的路径。 fxcopcmd。生成由VS(或可能是输出流)使用的CA xml日志。 fxcopcmd.exe加载程序集(快速)并同步分析它,因此只加载一个CPU而3个(在我的情况下)什么都不做。只有在CA完成后,才会构建项目依赖关系链中的下一个项目。

因此,CA中的弱点是我们可以改进它 - 强制它并行工作以使用所有CPU。

我看到了这样的解决方案

要制作将从MSBUILD获取参数的假fxcopcmd.exe,请记住它并立即向msbuild报告一切正常并且没有错误(通过CA xml.log或成功文件,或者可能是流...)。所以MSBUILD将构建下一个项目,那时我们将使用保存的参数调用真正的fxcopcmd.exe ...如果MSBUILD将在下一个项目中调用fxcopcmd.exe - 我们将再次调用fxcopcmd.exe ...所以会有很少有加载所有CPU的进程。真正的fxcopcmd.exe完成后我们可以调用我们的MSBUILD目标,它将从microsoft.common.targtets只调用CA目标而没有编译,我们的假fxcopcmd.exe会立即报告结果(CA在那时完成,我们有日志)到MSBUILD-VS。

你怎么看?这会加速CA吗? 为什么Microsoft没有在CA中创建这样的人员并且只使用一个CPU?

1 个答案:

答案 0 :(得分:4)

我曾经问过similar question on Connect and got a reply directly from the team。在2012年的ALM峰会上,我讨论了这个主题,并且有很多原因(没有特别的顺序)

  • 一旦Project Roslyn集成到Visual Studio产品中,代码分析引擎很可能会被替换。 Roslyn将提供实时分析(如Resharper)以及“修复”发现问题的能力。
  • 引擎非常占用CPU,并且已经使用了多个CPU,因此运行多个实例可能无法帮助您,就像您怀疑的那样。此外,fxcop可能非常I / O密集(加载程序集,pdb和其他文件),只有在同时加载多个实例时才会变得更糟。
  • 构建引擎需要访问构建输出。用于引用,也用于其他任务。因此,当任务完成时,它需要知道文件不再使用。例如,当您添加IlMerges将多个程序集组合在一起并随后删除旧程序集的任务时,它需要访问这些文件。简单的移动/包/等操作也是如此。
  • 当找到代码分析问题(设置为level = error)时,提早失败的能力将无效,因为您只是在最后收集结果。可能会导致你构建所有内容,但却发现你无法使用最终结果。

正如您在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>

虽然论坛帖子提到了Visual Studio 2008,但我已经应用它来解决2010年的问题。

使FxCop更高效的一种最简单的方法是在编译完所有项目后调用它一次。这将导致它只加载所有符号和引用的程序集一次,并允许引擎最大限度地利用并行性。当你有一个混合多个目标平台和cpu的解决方案,或者你想为不同的项目使用不同的.rules文件时,这也存在一些问题。

或者您可以做同样的事情,即为本地解决方案配置FxCop,但不要将其设置为在每个构建上运行。然后在Team Foundation Server Team Build(或您可能使用的任何其他构建服务器)中,覆盖FxCop的配置以运行“Always”。这样,在构建本地解决方案时,您不会对性能产生影响。它仍然允许您在本地运行代码分析(来自Analyze菜单项),自动构建可以防止您检查代码中的问题。