我的公司已经在Delphi上运行了一个大型项目十多年了。我们的代码库多年来一直在增长,现在大约有400万行代码。编译速度正在成为一个问题。我们花了一些时间来清除单元循环引用(一种已知的慢速编译原因)并检查了设置的各个方面。它达到了一个点,我们无法通过我们可以控制的内容进一步改进它。
目前,在运行Windows XP SP3和Delphi 2006的4核处理器的最先进PC上,启动Delphi并进行全面构建,需要约40秒。然后,如果我们立即在同一个Delphi会话中进行另一次完整构建,则需要1m 40s。再做一次完整的构建,它会变得更糟。等等。
(我们很清楚Windows本身会缓存文件,这对编译速度有很大的影响。上面的数据是基于文件的缓存。我们通过让Delphi编译一次项目来设置这样的场景,终止它然后开始一个新的Delphi会话。所以虽然40秒看起来并不慢,但这只是因为文件是由Windows缓存的。我们这样做是为了进行苹果到苹果的比较。)
令我们困惑的是编译速度变得更糟的原因。 (我们在过去观察到,如果项目有很多单元循环引用,则减速更糟。)如果我们终止Delphi并开始一个新的会话,编译时间将回到40秒。我们观察到的一个更有趣的事情是,我们可以通过单击“取消”按钮中止编译来实现相同的速度“改进”,然后立即完成整个构建。编译时间也将恢复到40秒。
在我们看来,Delphi自己的单元依赖缓存并不像从头开始构建它那样高效,而且随着时间的推移它变得越来越糟糕。并且它还会显示取消按钮以某种方式清除此缓存。我们的想法是,如果我们可以利用Delphi IDE子系统进行清除,我们可以始终将编译速度保持在最高性能。但我们不知道如何。
有谁知道我们能做什么?
我们仍在使用Delphi 2006,因为我们尚未找到将大型项目移植到Unicode的可行方法。我在论坛上看到最新的Delphi XE在单元循环引用方面表现出类似的编译速度问题。有人知道Delphi XE是否解决了这个问题?
P.S。我们还意识到将项目拆分为运行时包可以减少编译时间。但出于部署和管理原因,我们尽量避免使用运行时包。
答案 0 :(得分:23)
如果你构建你的应用程序,这里有一些技巧来加快这个过程:
del *.dcu /s
); Delphi 2007的编译速度应该快于Delphi 2006。
Delphi 2009/2010 / XE可能会更慢:从用户实验,泛型的实现和新的RTTI使编译过程更复杂,并且发现实际的实现更慢,例如而不是使用Delphi 2007。更新
您是否尝试启用 ProjectClearUnitCacheItem 隐藏菜单条目?
我通过CnPack启用此条目,或DDevExtension启用(我不知道哪一个执行此操作,可能是后者)。这可用于清除内部单元缓存。
答案 1 :(得分:18)
逐渐降低性能可能是由于某种内存泄漏或编译器中的其他错误。天知道D2005和D2006已经足够了!如果您无法升级到支持Unicode的Delphi版本,那么您至少应该更新到D2007(我认为仍然可以从Embarcadero获得)以获得更好的稳定性。
此外,正如罗伯特·弗兰克在评论中提到的,请查看Andreas Hausladen的工具。就在几天前,他发布了一个补丁,可以提高编译速度。不幸的是,这个特定功能显然仅适用于D2009及更高版本,但他的许多修复程序有助于加快各种速度,包括编译器。
答案 2 :(得分:7)
非常值得尝试使用Andreas Hausladen的DelphiSpeedUp,但这只会帮助IDE性能而不是我理解的编译。
没人建议的另一个想法是使用高规格的固态硬盘。
我建议使用带有大量RAM的64位Windows 7,以获得最佳的文件缓存性能。
感谢您的项目不是用C ++编写的!
答案 3 :(得分:1)
考虑在内部构建运行时包,然后在向QA部门发送代码或分发应用程序时构建单片可执行文件。
这需要额外的维护,但建造时间的急剧增加值得IMO。
我们有一个2.4 MLOC项目,大约有40-50个较小的支持应用程序。当针对一组运行时包进行编译时,该项目构建大约500K行并且构建大约快6倍(15秒对90秒)。许多较小的应用程序在一秒钟或更短的时间内编译,因为大部分打包的代码都是共享的。
您需要确保测试单片可执行文件,而不是打包的可执行文件。但是,如果您遵循良好的编码实践,通常您不应该看到太多许多行为差异。
答案 4 :(得分:0)
您是否尝试使用脚本命令行编译代码?
从命令行重新编译是否使该过程持续40秒?
从cmd“dcc32.exe”运行以查看用法。
更新: 我现在无法检查它,但是您应该尝试从命令行进行编译,看看您是否尝试从ide运行,ide不应该重新编译,并允许您使用debug运行。
答案 5 :(得分:0)
这个question有更多建议可以提高编译速度。避免循环引用和检测未使用的单位(使用CnWizards)会产生更大的影响。