5

静态 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 吗?为什么微软不做这样的人员,只在 CA 中使用一个 CPU?

4

1 回答 1

4

我曾经在 Connect 上问过类似的问题,并直接得到了团队的回复。在 2012 年的 ALM 峰会上,我讨论了这个话题,原因有很多(排名不分先后)

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

正如您在此 MSDN 论坛帖子中看到的那样,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 的配置以运行“始终”。这样,您在构建本地解决方案时不会对性能产生影响。它仍然允许您在本地(从“分析”菜单项)为整个解决方案运行代码分析,并且自动构建可以防止您签入有问题的代码。

于 2013-05-26T16:00:30.883 回答