为什么C++;链接几乎不使用CPU? 在本地C++项目中,现在链接可能需要一两分钟。然而,在此期间,CPU从编译期间的100%降至几乎为零。这是否意味着链接主要是一种磁盘活动
如果是这样,这是SSD将进行重大更改的主要区域吗?但是,为什么我的所有OBJ文件(或尽可能多的文件)在编译后不保存在RAM中以避免这种情况?有了4GB的RAM,我应该能够节省大量的磁盘访问,并使其再次绑定CPU,不是吗为什么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)文件,而是
更新:接下来的问题是,VC++编译器和链接器能否更好地进行对话,以简化工作并将OBJ文件保存在内存中,这与如何进行类似?在Visual Studio的调试版本中,您可以使用它,这样通常可以避免在链接上花费大量时间。基本上,这意味着它不是从头开始链接整个EXE(或DLL)文件,而是建立在上次链接的文件上,只替换更改的内容
但是,不建议将其用于发布版本,因为它会在运行时增加一些开销,并可能导致EXE文件比通常的文件大几倍。链接实际上主要是基于磁盘的活动。Borland Pascal(回到当年)会将整个程序保存在内存中,这就是为什么它会链接得如此之快 您的OBJ文件没有保存在RAM中,因为编译器和链接器是独立的程序。如果您的开发环境有一个集成的编译器和链接器(而不是将它们作为单独的进程运行),那么它确实可以将所有内容都保存在RAM中
但是您将失去将开发环境与编译器和/或链接器分离的能力-您将不得不使用相同的编译器/链接器,您将无法在环境之外运行编译器。您可以尝试安装一些RAM磁盘实用程序,并将obj目录保留在RAM磁盘上,甚至保留整个项目目录。这将大大加快速度
不要忘了在之后将其永久化:-D如果不知道链接器是如何与操作系统交互的,很难说到底是什么让链接器花了这么长时间。谢天谢地,微软提供了这样的服务,您可以做到这一点
它帮助我在不访问源代码的情况下诊断Visual Studio IDE和调试器的错误。Visual Studio链接器很大程度上受I/O限制,但这取决于几个变量
使用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文件保存在内存中以加快链接速度,那么编译速度可能会更慢。