为什么C++;链接几乎不使用CPU? 在本地C++项目中,现在链接可能需要一两分钟。然而,在此期间,CPU从编译期间的100%降至几乎为零。这是否意味着链接主要是一种磁盘活动

为什么C++;链接几乎不使用CPU? 在本地C++项目中,现在链接可能需要一两分钟。然而,在此期间,CPU从编译期间的100%降至几乎为零。这是否意味着链接主要是一种磁盘活动,c++,visual-c++,linker,compilation,C++,Visual C++,Linker,Compilation,如果是这样,这是SSD将进行重大更改的主要区域吗?但是,为什么我的所有OBJ文件(或尽可能多的文件)在编译后不保存在RAM中以避免这种情况?有了4GB的RAM,我应该能够节省大量的磁盘访问,并使其再次绑定CPU,不是吗 更新:接下来的问题是,VC++编译器和链接器能否更好地进行对话,以简化工作并将OBJ文件保存在内存中,这与如何进行类似?在Visual Studio的调试版本中,您可以使用它,这样通常可以避免在链接上花费大量时间。基本上,这意味着它不是从头开始链接整个EXE(或DLL)文件,而是

如果是这样,这是SSD将进行重大更改的主要区域吗?但是,为什么我的所有OBJ文件(或尽可能多的文件)在编译后不保存在RAM中以避免这种情况?有了4GB的RAM,我应该能够节省大量的磁盘访问,并使其再次绑定CPU,不是吗


更新:接下来的问题是,VC++编译器和链接器能否更好地进行对话,以简化工作并将OBJ文件保存在内存中,这与如何进行类似?

在Visual Studio的调试版本中,您可以使用它,这样通常可以避免在链接上花费大量时间。基本上,这意味着它不是从头开始链接整个EXE(或DLL)文件,而是建立在上次链接的文件上,只替换更改的内容


但是,不建议将其用于发布版本,因为它会在运行时增加一些开销,并可能导致EXE文件比通常的文件大几倍。

链接实际上主要是基于磁盘的活动。Borland Pascal(回到当年)会将整个程序保存在内存中,这就是为什么它会链接得如此之快

您的OBJ文件没有保存在RAM中,因为编译器和链接器是独立的程序。如果您的开发环境有一个集成的编译器和链接器(而不是将它们作为单独的进程运行),那么它确实可以将所有内容都保存在RAM中


但是您将失去将开发环境与编译器和/或链接器分离的能力-您将不得不使用相同的编译器/链接器,您将无法在环境之外运行编译器。

您可以尝试安装一些RAM磁盘实用程序,并将obj目录保留在RAM磁盘上,甚至保留整个项目目录。这将大大加快速度


不要忘了在之后将其永久化:-D

如果不知道链接器是如何与操作系统交互的,很难说到底是什么让链接器花了这么长时间。谢天谢地,微软提供了这样的服务,您可以做到这一点


它帮助我在不访问源代码的情况下诊断Visual Studio IDE和调试器的错误。

Visual Studio链接器很大程度上受I/O限制,但这取决于几个变量

  • 增量链接(在调试构建中常见)通常需要更少的I/O

  • 写一个PDB文件(用于符号)会消耗很多时间。这是微软在VS2010中针对的一个特定瓶颈。PDB写入现在是异步完成的。我没有试过,但我听说它可以帮助链接很多次

  • 如果您使用链接时代码生成(LTCG)(在发布版本中很常见),那么您最初就拥有了所有常用的I/O。然后,链接器重新调用编译器,为可以进一步优化的部分重新生成代码。这一部分通常更需要CPU。一方面,我不知道链接器是否真的在一个单独的进程中启动编译器并等待(在这种情况下,您仍然会看到链接器进程的CPU使用率较低),或者编译是否在链接器进程中完成(在这种情况下,您会看到链接器经历大量I/O阶段,然后是大量CPU)


  • 使用SSD可以帮助处理I/O绑定部分。仅仅拥有第二个驱动器也会有所帮助。例如,如果您的源和对象都在一个驱动器上,并且您将PDB写入一个单独的驱动器,则链接器应该花更少的时间等待PDB写入器。拥有第二个旋转驱动器已经极大地帮助了我当前团队的链接时间。

    对不起,这并没有解决这个问题。它确实解决了链接性能的“重大变化”问题。嗯?他问如果ssd是io绑定的,它是否会加快链接速度。提供替代方法与回答文字问题一样有效(除非问题表明替代方法已经被考虑并放弃)。我认为增量链接(/Gm?)是一个有效的答案。遗憾的是,为了更好地使用我的内核,我已经关闭了/MP(多线程编译)。我认为可能会关闭,但对于Delphi的各种版本,我不确定它是否仍然会关闭。如果在任何合理的操作系统上运行,信息将已经缓存在内存中,减少了在内存中设置整个对象以进行链接的需要。我在XP、Vista和W7上运行过它,它似乎没有多大区别。我不认为W7提供了任何方法来查看哪些文件被RAM缓存?obj,尤其是pdb文件通常很大,根本无法放入内存(至少不能放入内存系统愿意用作缓存的部分)。我不相信我在构建时会得到4Gb的临时文件。。。如果几年前我这样做了,我的磁盘空间就会一直用完。此外,当虚拟机被包括在内时,Windows可以使用它所拥有的和几乎无限的内存。。。我认为您可以将中间文件设置为单独存放,这样就不需要永久存放,除非ONJ文件丢失,否则您必须始终进行完整构建。不确定是否值得这么麻烦,这取决于RAM磁盘在自动化所有这些+1方面的帮助程度。从旋转盘片移动到SSD可以使大多数构建过程的速度发生难以置信的变化。速度的提升通常必须被视为是可信的:-)。我推测,如果在编译的基础上有足够的内存,那么应该让操作系统将它们缓存在RAM中以避免这种情况,这是可以做到的。由于编译需要大量RAM,这可能会导致操作系统将OBJ文件刷新到磁盘。如果您强制它将OBJ文件保存在内存中以加快链接速度,那么编译速度可能会更慢。