【问题标题】:How to speed up c++ linking time如何加快 C++ 链接时间
【发布时间】:2010-10-29 15:10:42
【问题描述】:

有什么方法可以优化 MS Visual Studio C++ (2005) 中的链接时间?我们使用 Xoreax Incredibuild 来加速编译,但没有链接。

目前每个链接大约需要 30 秒。当我打开增量链接时,大约需要 35-40 秒。 (无论我是否使用 incredibuild 编译项目)

有什么办法,如何分析链接器并观察需要多长时间?或者任何并行链接的工具?或者任何代码优化技巧以加速链接器?

感谢回复 卢德克伏迪加


编辑:

感谢您的第一次回复和其他信息:

  • 整个程序优化和链接时代码生成已关闭。
  • 尽可能使用 PIMPL 成语
  • 其他静态库已通过#pragma comment(lib, "pathToLib") 包含在内。 (也因为更容易维护]
  • 硬件:四核 q6600,8GB 内存,3x WD raptor raid 0。Windows Vista 64 位

【问题讨论】:

  • 30 秒对我来说听起来并不多。如果您进行明智的开发,您多久执行一次编译/链接周期?如果你速度很快,也许每 10-30 分钟一次。如果你必须在那里等待 30 秒真的很重要吗?
  • 并行编译阶段需要多长时间?您通常一次构建多少个目标?如果编译阶段需要 10 秒,而您只构建了一个目标,那么我对您的情况没有太多同情。 :)
  • 在开发新功能时,如您所说,我们每 10-20 分钟编译一次,但在搜索和修复错误时,可能是每分钟一次;-( 整个项目编译大约需要 2 分钟并构建一个target. 当只编译一个改变的文件时,fil编译大约需要3秒,链接大约35秒;-(
  • (编译运行在 3 个 14 个 cpu 核心的 comps 上)
  • 你可以在这个线程中阅读我的帖子。 stackoverflow.com/questions/143808/…

标签: c++ linker visual-c++


【解决方案1】:

我不知道有任何并行链接工具;我知道 Incredibuild 不允许这样做。

工具箱中用于避免链接时间的最大工具是适当的抽象级别。如果你的链接时间很长,可能是因为对象对其他对象了解太多。将它们解耦是关键——通过抽象接口(可能使用 PIMPL 范例),或者通过其他方法,例如事件传递。

通过项目依赖关系链接项目的开销也相当高。如果您的目标平台仅为 Win32,或者主要是 Win32,您可以考虑使用标头通过 #pragma comment(lib, "pathToLib") 链接您的依赖库。

【讨论】:

  • 通过项目属性设置依赖 |链接器 |输入或通过 pragma cmets 是一样的。设置项目依赖项不会自动链接(我认为它曾经在旧版本中使用过),它只需要在第二个构建之前进行第一个构建。
【解决方案2】:

如果您可以在没有优化的情况下生存,请关闭链接时代码生成(删除 /GL 开关或在属性 c/c++ -> 优化 -> 整个程序优化。对于链接器删除 /ltcg 或使用链接时间代码生成设置)。不过,这会使编译器变慢,因为代码生成现在发生在编译期间。

我见过使用 /GL+/LTCG 构建需要数小时的项目,如果不使用则只需几秒钟(例如:http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/750ed2b0-0d51-48a3-bd9a-e8f4b544ded8

【讨论】:

  • 是的。这加快了链接时间,但减慢了编译时间。
【解决方案3】:

您是否考虑过改进硬件?
您是否使用单独的物理硬盘进行构建?您使用哪种驱动器?

作为一般建议:投入一些内存,获取Velociraptor,仅将源和构建目录放在那里,再次测量。如果有帮助,请考虑使用 RAID 0。

我听说从 XP 内核升级到 W2K3 内核显着缩短了构建时间,这可能是由于更好的内存管理和缓存。

作为更改代码的建议,您可以将一些功能移至 DLL,并进行并行链接。但我不会仅仅为了缩短构建时间而做出这样的改变。

【讨论】:

    【解决方案4】:

    Improving link time with IncrediBuild有一些通用设置建议

    您还可以使用IncrediLink跳过静态库的链接,您不会分发它们

    我们发现添加签名后构建步骤会阻止 IncrediBuild 处理以下项目,在构建后添加评论应该会有所帮助

    rem IncrediBuild_AllowOverlap
    

    IncrediBuild_AllowOverlap doc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多