在VS中构建增强型解决方案

问题描述:

增强型岩石,它非常棒,功能非常强大,但每当我在Visual Studio 7.1中构建解决方案时,我讨厌它。在VS中构建增强型解决方案

看来Boost已经影响了构建时间(不是正向)。我无法从我的项目中删除所有Boost用法来比较构建时间,但我在小型项目上尝试过,差别很有意义。

我想问题是,Boost由成千上万的头文件组成,其中包含了非常广泛的内容。所以,当我在我的头文件中包含boost/function.hpp时,可能会导致包含数百个Boost头文件。

有没有经历过相同的人?任何想法如何解决它?

粗糙的想法:

  1. 添加提振预编译头?至少他们将被解析并保存在一个文件中
  2. 为某些Boost模板做明确的瞬时化?
  3. 以某种方式准备Boost标头?
  4. 不包括加速至头文件(听起来不真实的)
  5. ...

PS。是的,Boost也使用了我认为很难编译的硬核模板,所以成千上万的头文件不是唯一的问题。

当然,包括升压导致更长的编译时间 - 就像包括任何库一样。由于所有逻辑都是在头文件中实现的,因此(主要是)模板库的性能会导致相当大的性能损失。

  1. 我已经有了很好的结果,其中包括预编译头文件(的子集)。不过,我相信MSVC 9的收益最大。在MSVC 7上,我看到一些报告称模板的预编译头文件经常导致性能损失。确定您是否会看到性能提升的另一个关键方面是在预编译头文件中包含适当的头文件。只包含您经常使用的标题,并确保它们永不改变(即在将您自己的标题添加到此处之前,请考虑三次)

  2. 我不知道明确的瞬时化是否有任何效果,即使我怀疑它。如果任何人都看到了这个结果(无论编译器),那将是非常有趣的。

  3. “准备”提升标题听起来像改变它们,这听起来对我来说是一个非常糟糕的主意。你不想最终维护定制的标题...

  4. 可能不是你想象的那么虚幻。尽可能使用尽可能多的forward declarations以减少每个头文件的“占用空间”。考虑使用Pimpl模式来避免包含未在您的类的公共接口中反映的增强标题(offtopic:我认为Pimpl经常是不必要的,相反,我尝试将这些类切分为更小的片段,在“更干净“的时尚)。只要你在这些类的用法上保持一致,不要害怕包括一般的普通类(例如shared_ptr)(如果你在所有的类中使用它们,你不会看到太多的好处将它们从一个标题中隐藏起来) 。

  5. 升级MSVC(支持并行构建)将有所帮助。但是,这在C++中一直是个问题。为了最大限度地减少问题,您需要非常严格,并遵循指导方针来减少标题的占位面积。现在,您应该仔细查看包含子句,并确保没有不必要的内容。如果你的头文件列表中包含的内容越来越长,那么你可能会做一些错误的事情 - 大部分都应该包括,只有位于cpp中。

正如你在你的文章中提到的那样,boost代码包含很多模板代码,需要很多CPU周期才能编译。相比之下,多头文件的开销非常小。

您需要做的第一件事是找出哪个头文件或哪行代码负责编译的延迟。通常不是包含头文件,而是在其自己的代码中使用其中一个类/函数,导致延迟。你可以通过注释掉你的代码,直到编译再次快速,然后取消注释你的代码块,直到编译再次变慢为止,来分离出负责任的代码。然后,您可以决定是否要用其他方法替换慢速代码。您可以权衡这里的优点和缺点,或者编译速度与漂亮的提升代码。

还有一些其他的东西,你可以做的一样好:

  • 清理不需要的包括语句,尤其在你的头在你的头文件
  • ,更换包括前向声明(如果可能)
  • 获得更快的计算机:d
+0

看来它不会对我有用。我们已经使用非常快的计算机,但构建过程需要几个小时......以及如何自动“找出哪个头文件或哪行代码负责编译的延迟”? Codebase非常庞大。 – bocco 2009-09-09 05:33:15

+0

你有这个答案的任何基础?这似乎违反直觉,简单的测试(从一个空的main()开始,然后从STL零碎添加包含)表明包含一个文件具有非常实际的成本。我错过了什么?谢谢! – 2009-09-13 05:34:12

+0

我不否认包括文件有成本。但是,根据我的经验,有时使用某些升级代码的成本会高于包含本身。 – StackedCrooked 2009-09-13 12:16:06

包括升压头文件只有当他们真正需要的是有道理的。包含其他头文件的头文件会对IO造成压力,并对编译时间产生很大影响。前向声明有助于某些观点,但通过Boost,它可能是真正的痛苦。

在头文件中使用外部防护可避免不必要的加载。就像这样:

#ifndef BOOST_SHARED_PTR_HPP_INCLUDED 
# include <boost/shared_ptr.hpp> 
#endif 

另一种方式,以避免头级联使用"pimpl"-idiom,尤其是在复杂的类的时候。然后可以包含复杂的Boost内容,并仅由该编译单元使用。缺点是界面应该设计成不需要Boost特定的东西。但是,打破依赖也可能是一件好事。

+0

如果不是你的代码,外部包含警卫可能会有风险 - Boost会保证他们不会改变包含警卫的格式吗? – 2009-09-13 05:24:39

+0

是的。他们可能有风险。有时即使是你自己的代码。 :) 据我所知,并不能保证Boost的头部守卫会保持那样。但是,我愿意冒这个风险。如果它们发生变化,那只是一堆编译器错误,可以很容易地指向不包含的文件。 – Virne 2009-09-13 17:47:47

+0

要么是这样,要么是因为当实际的(为了参数的缘故)名称是BOOST_SHAREDPTR_INC时检查了BOOST_SHARED_PTR_HPP_INCLUDED,并且你的构建突然慢一点,所以你的优化方案被无声地破坏了。 – 2009-09-14 04:52:48

我想也助推了不少

  • 使用预编译的头就像你告诉(带来最)
  • 当使用链接库检查,如果你真的需要他们(联也很慢)

另一个也许愚蠢的暗示,但性能损失的本机上的主要来源:

  • 检查,如果您的防病毒,使按访问扫描并禁用它页眉&源目录(升压和你的项目)
+2

大拇哥为防病毒笔记!它们通常造成比病毒更多的伤害。 – Virne 2009-09-08 21:55:15

+0

反病毒之前打过我。 – 2009-09-08 23:08:57

+0

有关防病毒的好处,但已为构建目录禁用。我们还为项目文件和输出使用单独的HDD。它有很多帮助。 – bocco 2009-09-09 05:26:23