【问题标题】:Speed up compilation in Visual Studio 2005在 Visual Studio 2005 中加速编译
【发布时间】:2010-10-27 19:12:57
【问题描述】:

对于主要包含 C++ 项目的解决方案,在 Visual Studio 2005 中加快编译时间的最佳方法是什么?

【问题讨论】:

    标签: c++ visual-studio-2005


    【解决方案1】:

    除了预编译头文件之外,还有许多其他事情可能会拖慢您的速度:

    • 病毒检查软件 - 会对构建产生严重影响。如果您正在运行病毒检查程序,请尝试将其关闭,看看您会得到什么样的改进。
    • 低 RAM - 没有足够的 RAM 会导致更多的磁盘读取并减慢您的速度。续 ->
    • HDD 慢 - 无论如何,您都必须写入磁盘,并且慢速驱动器(如许多笔记本电脑和低端系统中的驱动器)会破坏您的构建。您可以获得更快的驱动器、RAID 阵列或 SSD
    • 处理器速度慢...当然。
    • 不太可能,但是:检查您的项目是否引用网络共享。每次构建都必须通过网络拉取文件会大大减慢速度。

    编辑更多想法:

    • 如果您的解决方案包含大量项目,您可以考虑创建仅包含您正在积极处理的项目的其他“子”解决方案。这种可能性取决于您的项目之间的关联程度。
    • 项目构建可以具有与之关联的构建前和构建后事件命令。检查项目的属性,看看是否指定了任何代价高昂的构建事件。

    【讨论】:

    • 如果您不想完全关闭病毒检查,许多扫描程序允许您指定例外。将*.c, *.cpp, *.h *.hpp, *.obj, *.lib, *.pch, *.ncb 添加到例外列表可以让您获得 95% 的加速,并且仍然可以捕获所有常见病毒。
    • 网络共享是一个巨大的瓶颈。当我从网络共享切换到本地 SSD 时,我的构建时间从约 1 分钟(对于一个简单的 1 页代码演示项目)变为约 1 秒。
    【解决方案2】:

    您可以为通常不会经常更改的文件创建pre-compiled header。这会大大增加您的编译时间。

    【讨论】:

    • 我在开始使用 Visual Studio 时从未注意到这一点。我从 Code::Blocks 切换过来,这似乎是自动为你做的。
    【解决方案3】:

    在代码级别,最大限度地减少其他标头包含的标头数量是有帮助的。反复加载和读取文件会产生很大的影响。相反,尽可能向前声明事物。例如:

    #include <iosfwd>
    #include <string>
    #include "M.h"
    #include "R2.h"
    #include "A2.h"
    
    class M2;
    class A;
    class R;
    template<class C> class T;
    
    class X{
      M member; // definition of M is required
      M2 *member2; // forward declaration is sufficient for pointers & references
    public:
      // forward declaration of argument type A is sufficient
      X(const A &arg);
    
      // definition required for most std templates and specializations
      X(const std::string &arg);
    
      // forward declaration of your own templates is usually okay...
      void f(T<int> t);
    
      // unless you're defining a new one. The complete definition
      // must be present in the header
      template<class Z>
      void whatever(){
        // blah blah
      }
    
      R f(); // forward declaration of return type R is sufficient
    
      // definitions of instantiated types R2 and A2 are required
      R2 g(A2 arg){
        return arg.h();
      }
    
      // ostream is forward-declared in iosfwd
      friend std::ostream &operator << (std::ostream &o, const X &x);
    };
    

    如果此类的用户实际上调用了X(const A&amp;)、f(t&lt;int&gt;)、f() 或operator &lt;&lt; 中的任何一个,则必须#include 提供类定义的任何文件。

    模板几乎肯定会增加包含开销。在我看来,这通常值得他们的力量。当您制作自己的模板时,完整的定义必须位于头文件中;它不能进入​​ cpp 文件进行单独编译。标准模板不能被前向声明,因为允许实现提供额外的模板参数(带有默认参数)并且模板的前向声明必须列出所有模板参数。 iosfwd 标头前向声明所有标准流模板和类等。只要您不实例化任何特化,就可以前向声明您自己的模板。

    预编译的头文件也有帮助,但大多数编译器限制了您可以在源文件中包含的数量(Visual Studio 将您限制为一个),因此它们不是万能的。

    【讨论】:

      【解决方案4】:
      • Unity builds。
      • Precompiled headers。
      • Windows 7 的构建速度比 Windows XP 快得多(如果这与您相关)。
      • 关闭防病毒扫描程序。
      • 最小化依赖关系(即来自头文件的#include)。
      • 尽量减少模板代码。

      【讨论】:

        【解决方案5】:

        如果您在大量文件中直接包含复杂的标头(例如 STL、Boost),预编译的标头会很有帮助。

        确保您的构建不会无意或有意访问网络。

        【讨论】:

          【解决方案6】:

          【讨论】:

          • 我使用 g++,所以我不确定,但据我所知 vs2005 也支持这个选项,但它没有记录。
          • 我相信 VS2005 确实支持 /MP 但它没有记录。
          • VS2005 已经在项目依赖的约束下在 MP 机器上执行并发编译了。
          【解决方案7】:

          如果您的解决方案中有很多项目,请删除其中一些。如果它们被引用为项目,您可以改为引用二进制输出(使用添加引用对话框中的浏览按钮)。这消除了解决方案中的大量依赖项检查。这并不理想,但确实可以加快速度。

          【讨论】:

            【解决方案8】:

            我们使用的解决方案是IncrediBuild。只需在问题上投入更多硬件即可。除了所有开发机器(它们本身相当强大)之外,我们还有许多 4 核服务器,除了编译之外什么都不做。

            【讨论】:

              【解决方案9】:

              在 Visual stdio 顶部给出的“任何 CPU”选项上更改您的解决方案平台,那么您的程序构建速度肯定会提高。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-01-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-02-16
                相关资源
                最近更新 更多