Grr…我的VC++项目在VS2010中的构建速度较慢。我现在该怎么办(一步一步指南)

Renin John

null

嗨,我的名字是 肾素约翰 我是一名软件开发工程师,负责VC++项目的测试和构建团队。我参与了VS2010 IDE的构建性能测试,我想给大家一个关于预期的想法,以及一些基本步骤,如果您的项目在VS2010中的构建速度比在VS2008或以前的版本中慢,那么您可以采取这些步骤。

在我们测量的大多数情况下,VS 2010的表现都更好或相等。但是,如果您受到构建性能下降的影响,请继续关注,我将向您展示调查问题的方法,确定您是否在进行比较,找出提高构建性能的方法,并报告具有适当详细级别的bug,以便我们能够尽快采取行动。

I–确定你的情况

  1. 我在做什么?
    • 如果你只是启动/重新启动你的机器,打开VS并进行一个构建,那么它就被称为 北极冷建造 .
    • 如果你关闭VS,再次打开它,然后执行一个构建,它被称为 冷成型 (因为在这种情况下内存是缓存的)。
    • 如果您做了一个构建,并且您正在重做它(Clean+build,或者Rebuild解决方案),那么您正在重做的构建以及在此之后重做的任何构建都将被调用 温暖的体格 .

      执行重建类似于执行清理项目1、生成项目1、清理项目2、生成项目2等。因此,请注意,在生成时间中涉及清理开销。 还要记下你正在构建的配置:Debug,Release,…由于在每种情况下传递给工具的开关不同,性能会有所不同。

  2. 我的生成输出详细设置是什么? 输出详细级别根据需要打印到控制台和日志文件的文本量影响生成时间。当我做一个比较时,构建诊断花了大约5%的时间。如果您还不知道,这个设置在VS2008中没有影响…生成的输出总是相同的。

    What is my Build Output Verbosity setting?

  3. 我是否与生成计算机建立了远程桌面连接? 如果您远程连接到计算机以进行生成,则根据网络带宽、延迟等,将生成时间与在物理计算机上本地生成所需时间进行比较时,您会发现生成时间存在明显差异。这种差异的一个原因是不断输出生成文本并进行滚动,在输出窗口中。 因此,请注意不要比较(例如)本地VS 2008解决方案构建与远程VS 2010解决方案构建的构建时间。
  4. 我在运行病毒扫描程序吗? 计算机上运行的防病毒软件可能会在生成过程中与工具交互,从而对生成的性能产生负面影响。不同版本的VS之间的交互水平可能不同。 在visualstudio2010的开发过程中,我们测试了安装了不同防病毒软件的构建场景的性能。我们能够测量其中一些场景中显著的性能开销,并与供应商合作帮助我们理解和改进工具集。AV软件的一个有趣之处是,随着新的病毒和攻击在野外被发现,启发式和扫描算法会频繁变化。尽管如此,我们在发布visualstudio2010时能够衡量的性能对于AV软件的存在是可以接受的,但是随着AV软件的不断发展,这些特性可能会发生变化。 当我们不断努力使我们的工具在面对安全扫描程序时变得强大时,您可以考虑禁用反病毒程序来扫描生成输出目录或完全禁用,以获得更好的性能。Microsoft不能建议您禁用杀毒软件以提高性能,但与它的潜在交互是值得考虑的。
  5. 我在这台机器上还运行什么服务? 与安全扫描程序一样,其他服务也可能对构建时间产生影响。如果您认为有必要,请在执行构建之前花几分钟确定并关闭所有不使用的服务。除了前面提到的反病毒之外,您可能还需要关闭其他一些服务,包括Superfetch和Windows Search。 如果您还不知道,您可以通过打开计算机上的服务窗口来停止这些服务:转到开始–>运行并输入“services.msc”。现在双击您选择的服务,说Superfetch,点击停止按钮,然后单击“确定”。完成构建后,点击“Start”重新打开服务。

其他有用信息

  • 如果您有Process Monitor(来自SysInternals),您可以将其设置为监视目录,以查看哪些应用程序正在读取/写入该目录。也许,第三方应用程序可能持有文件锁,导致编译器、链接器或其他VS工具等待它。您可以从下载进程监视器 http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx 如果你的机器上还没有。
  • 您可以尝试禁用Intellisense解析器,特别是当您的计算机内存非常低时。在一台内存为1GB的机器上进行的一个实验中,我注意到一个中型项目的构建时间缩短了6%。或者您可以将进程外IntelliSense解析器的数量从2(默认值)减少。看看这个 博客 了解有关Intellisense选项的详细信息,了解您真正需要什么和不需要什么。
  • 选择的开发剖面可能会导致构建时间的变化。 如果您想尝试更改当前配置文件(例如,C++):打开 工具 菜单,选择 导入和导出设置, 选择 重置所有设置 然后打 下一步; 在下一页中,选择 不,只是重置设置,覆盖我当前的设置 然后打 下一步; 选择 Visual C++开发环境 点击 完成。

Visual Studio default settings

另一方面,还有一种方法可以将VS重置为开箱即用状态。读取“/resetuserdata开关”下的内容 在这里 . 虽然“devenv/resetuserdata”会将visualstudio2010配置文件设置为默认值,但它不会重置用户配置,用户可能已使用特定设置对其进行了修改。为此,请打开VS 2010命令提示符并键入命令“del%%LOCALAPPDATA%%MicrosoftMSBuildv4.0Microsoft.Cpp.*.user.props”。这将删除包含用户特定设置的文件,并且这些文件将在下次启动VS时使用visualstudio2010默认值重新创建。

  • 最后, 在这里 是一种利用构建并行性在多处理器计算机上获得快速构建的方法。

II–增加构建时间的常见场景/问题

  1. 在VS2010中,编译器设置为在发行版配置中默认生成PDB 在VS2010中,调试信息格式的默认值是“Program Database(/Zi)”,而在VS2008中,它是“Disabled”。 在VS2008中大多数向导生成的项目中,“/Zi”是强制的,向导会覆盖项目中的这些值。因此,在VS2010中,我们将此设置为默认设置,向导不再强制项目覆盖此属性。 这可能会在VS 2010和从中转换的版本之间创建不同的属性值。它只能在两种情况下出现:
    1. 如果您是从VC6升级。
    2. 如果您是从有人明确选择“”的项目升级。

    关于为什么会发生这种情况的一些背景知识,只要属性采用默认值,VS就不会在项目文件中创建条目。

    确定默认值的提示 :默认属性值显示为 粗体 在项目的属性页中。

    生成pdb会增加构建时间。因此,如果您的情况不需要生成pdb,您可以打开项目的属性页,并通过清除与该属性对应的字段的值来禁用调试信息格式。

    Debug information format

    为了进一步提高性能并进一步减少构建时间,还可以禁用链接器生成pdb:打开属性页,转到配置属性–>链接器–>调试,并将生成调试信息设置为“否”。

    Generate debug info

  2. 在VS2008IDE中,/O2没有在属性页中显式设置时传递给编译器 在VS2008中,尽管在Release configuration下,“/O2”是默认的编译器优化选项,假设用户没有明确提到他希望编译器优化为“/O2”,那么开关将不会传递给编译器(因为如上所述,项目文件中没有创建条目)。 那么这对VS2010构建时间有什么影响呢?将项目转换为VS 2010后,由于此问题已得到修复,因此项目将在上生成“/O2”(根据需要),这会导致生成时间更长(在大多数情况下),因为编译器需要执行优化代码的附加任务。 因此,如果您的优先级是拥有更快的构建时间,并且您并不真正关心优化,则禁用它:打开属性页,转到配置属性-> C/C++ + >优化,并将“优化”属性的值更改为“禁用(/OD)”。

    Optimization property

    这应该是隐含的,但我无论如何都要提到:由于这个问题,假设您希望对vs2010中的构建时间延迟(如果有)有一个有意义的理解,您可以通过消除vs2008和vs2010构建之间的差异来做到这一点。为此,在VS2008中启用“/O2”,并在将其与VS2010构建时进行比较之前进行构建。这也适用于上面提到的“/Zi”情况(在VS2008和build中启用“/Zi”)。

    注意 : 优化设置使应用程序在用户计算机上运行得更快。通过关闭优化,您可以有意识地选择是否接受应用程序将变慢。 在这里 是一篇关于VisualStudio2010中代码生成改进的文章,旨在提高性能。
  3. 在VS2010中,静态链接到其库的MFC应用程序显示生成性能降低 在VS2010中,MFC静态库有了实质性的增长,它在构建链接器的同时转换为额外的工作(因此生成的二进制文件的大小也显著增大)。 这实际上是由于添加了一个新特性,允许将MFC控件添加到对话框中。这反过来又要求DLGINIT处理程序了解MFC控件,这将引入库的所有附加部分。我们认为这个特性的好处大于静态EXE的额外大小的缺点,所以我们不想拉这个特性。不过,我们确实计划在visualstudio的未来版本中以某种方式解决这个问题。 要解决此问题,请考虑动态链接到MFC库。为此,打开项目的属性页,转到Configuration Properties–>General并将“Use of MFC”属性更改为“Use MFC in a Shared DLL”。

    Use MFC in a Shared DLL

    微软推荐动态链接。这允许用户立即利用可能应用于这些库的任何未来安全修补程序,而无需供应商重建/重新交付其应用程序。

III–测量构建性能

如果您选择执行重建(Build->Rebuild Solution),本节将为您提供可靠度量性能的建议。

A–初始机器设置

  1. 重新启动计算机。
  2. 在管理员模式下打开VS命令提示符;运行ngen executequeueeditems并等待它完成,以便清除ngen缓存,以防万一。
  3. 启动VS IDE并应用VisualC++开发配置文件。
  4. 加载解决方案。
  5. 执行重建解决方案。

B–测量冷正时

  1. 关闭VS。
  2. 打开任务管理器并杀死MSBuild.exe(对于VS 2010版本)和mspdbsrv.exe的所有实例。
  3. 启动VS,加载解决方案,等待CPU空闲。
  4. 执行以下步骤:
    1. 选择重建解决方案。
    2. 立即启动计时器(像以前一样,秒表应该还能工作)。
    3. 等待生成完成,等待状态栏显示消息“Rebuild All Succeeded”。
    4. 立即停止计时器。

C–收集热计时

  1. 重复上一节中的步骤4三次。
  2. 报告收集的三次计时的平均值。如果任何阅读有很大的变化,重做建设,以获得信心。或者,您可以执行更多的构建并消除高点和低点。

注: 当您度量重建解决方案场景的时间时,请记住,这涉及到清理在先前构建期间生成的文件的额外开销。为了保持一致性,请从下面列出的选项中选择一个:

  • 进行初始构建以生成文件,并开始收集下一次重新构建的数据(如上所述);或
  • 在每次重建之前进行清理,这样在生成期间就不必删除任何文件。

四、开展调查

构建包括各种部分,如MSBuild、IDE、Tools、Tasks……下面列出了四个步骤,可以将减速缩小到其根本原因:

  1. 找出它是否是编译器/链接器工具 最有用的方法是在编译期间传递编译/链接时间日志:/Bt(对于编译器)和/time(对于链接器)。  你真正想回答的问题是哪个组件慢下来了,编译/链接什么东西是原因。 如果您想知道如何通过这些开关,有两种方法:
    1. 打开每个项目的属性页(可以胡选项目),转到C/C++或链接器>命令行,并在附加选项下添加开关。
    2. 打开一个命令提示符,设置“u CL=/Bt”和“u LINK=/time”,并使用devenv.exe从命令提示符启动VSIDE。
    这个 博客 包含有关使用这些定时开关的附加信息。 使用收集的这些信息创建一个如下表:

    项目 文件 前端时间 (c1.dll+c1x.dll) 后端时间 (c2.dll) 连接时间 (最终:总时间)
    1 1 X1型 Y1型 Z1号
    2 2 X2个 2年 Z2型

    最好的方法是创建一个脚本,将日志解析为上面显示的格式。 然后可以在Excel中将这些文件合并在一起,进行两到三次不同的运行,以比较每个文件/项目的运行时间,并查看最大的差异在哪里。  有两件事会发生: 1.经济全面放缓 2.一件或几件事情会大大倒退。

    在第一种情况下,可以通过从解决方案中提取任何小文件或项目来创建repro。而在第二种情况下,只提取导致减速的特定文件或项目的副本。 您应该验证是否可以通过编译或链接提取的项目来重现减速,理想情况下只需运行实际命令,如cl.exe…或link.exe…然后您可以使用此repro向我们报告问题(下面有一节介绍如何报告错误)。 如果您确实看到了整个构建的挂钟回归,但是没有cl/link工具时间减慢,那么您就消除了cl和linker,现在可以继续研究其他工具(参见步骤2)。

  2. 如果在步骤1中没有确定回归,请在其他工具中查找回归 由于其他工具(Lib、RC、Mt、BSCMake、Resgen、CustomBuild…)没有类似的隐藏开关,因此我们可以使用MSBuild输出的计时信息来隔离/研究回归。将生成日志详细程度更改为 诊断的 以便MSBuild打印这些时间。但这些时间包括调用工具的额外开销等。 要查看这些时间,对于解决方案中的每个项目,请在生成输出的末尾找到任务性能摘要。它看起来是这样的:

    任务绩效总结: 0 ms SetEnv 4调用 0毫秒触摸2次通话 0 ms ReadLinesFromFile 1调用 0毫秒消息3个呼叫 0毫秒删除2个呼叫 0毫秒1次呼叫 0 ms MakeDir 10个呼叫 0 ms WriteListFile 1调用 0 ms AssignTargetPath 5调用 359 ms RC 1呼叫 937 ms Mt 1呼叫 3843 ms CL 2呼叫 7061 ms链路1呼叫

    虽然您已经在步骤1中分析了编译器和链接器的时间,但是您可能还需要考虑查看此处报告的任务时间。如果您看到任何回归,这将意味着减速是由于额外的MSBuild开销子任务而不是工具造成的。然后,您可以通过从相应的工具时间中减去任务时间(在步骤1中计算;注意,在这种情况下,构建日志详细性应该设置为诊断。 再一次,弄清楚经济放缓是全面的还是在某个特定的项目中。如果在这些工具中都没有看到回归,那么很可能是MSBuild本身的回归。但是,在得出结论之前,请通过执行步骤3来消除IDE因素。

    提示: 有一种方法可以交叉检查你所看到的经济放缓是否是由 与2010年相比 特别是工具(cl、link、mt等)。为此,您需要在同一台计算机上安装VS2008。 打开属性页,转到Configuration Properties–>General,将平台工具集更改为“v90”,然后进行构建。

    Platform toolset

    如果您看到构建时间的改进,那么您已经将问题缩小到VS2010工具。

  3. 如果通过步骤1和2没有发现回归,则测试它是否来自IDE 接下来可以做的是测试减速是否是由IDE引起的。您可以通过在命令行上使用MSBuild构建并完全消除IDE来确定这一点。如果减速仍然存在,您肯定知道它不是由VS2010 IDE引起的。 有关如何在命令行上使用MSBuild进行生成的详细信息,请阅读以下内容 博客 .
  4. 收集ETW跟踪 ETW代表Windows的事件跟踪。最近发布了一个自动收集这些痕迹的工具。您可以通过单击 在这里 . 在安装工具时,您将看到一个用户指南文档;按照里面的说明去做。实际上,您只需要启动探查器,运行场景,然后停止探查器。一旦你有了ETW的踪迹,把它交给我们分析。

V–报告错误

如果在完成上述步骤后,您仍然认为存在需要我们注意的性能问题,请随时与我们联系 论坛 如果你需要一些澄清,或者打开一个 连接bug 如果您希望在将来的版本中考虑修复某些内容。

当与我们联系时,请尽可能详细地提供以上章节的相关信息。提供有关您的机器配置的所有信息(处理器类型、内核数、已安装内存量、可用磁盘空间等)

附上项目来源(如果它没有违反任何许可条款)。如果存在许可证限制,请尝试删除/混淆任何IP并将其发送给我们。如果这也不可行,请考虑只向我们发送解决方案(.sln)和项目(.dsp/.vcproj&.vcxproj)文件。包括诊断日志(见第I.2节;生成输出/日志文件详细信息设置应更改为“诊断”),并启用计时信息(/Bt和/time),以及ETW跟踪。

请详细说明在缩小问题范围方面所采取的步骤,以及在消除正在比较的两个构建之间的任何差异之后所观察到的减速百分比。这将有助于加快我们的调查,使我们能够更快地答复你。也可以随意提供你在做练习时所做的任何主观观察。

我想从我这一头感谢大家使用VisualStudio2010,并且有足够的耐心阅读这个博客。如果你有任何问题/顾虑/意见,把它们扔给我,我很乐意回答。

肾素约翰 Visual C++项目与构建团队

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享