Performance 为什么德尔福';它的编译速度随着时间的延长而降低';它是开放的,我能怎么办?

Performance 为什么德尔福';它的编译速度随着时间的延长而降低';它是开放的,我能怎么办?,performance,delphi,compilation,Performance,Delphi,Compilation,我的公司十多年来一直在Delphi上运行一个大型项目。我们的代码库多年来一直在增长,现在大约有400万行代码。编译速度正在成为一个问题。我们已经花时间剔除了单元循环引用(编译速度慢的一个已知原因),并检查了设置的各个方面。它发展到了一个地步,我们无法用我们所能控制的来进一步改善它 目前,在运行Windows XP SP3和Delphi 2006的4核最先进PC上,重新启动Delphi并进行完整构建,需要约40秒。然后,如果我们立即在同一个Delphi会话中进行另一个完整构建,将需要1m 40秒。

我的公司十多年来一直在Delphi上运行一个大型项目。我们的代码库多年来一直在增长,现在大约有400万行代码。编译速度正在成为一个问题。我们已经花时间剔除了单元循环引用(编译速度慢的一个已知原因),并检查了设置的各个方面。它发展到了一个地步,我们无法用我们所能控制的来进一步改善它

目前,在运行Windows XP SP3和Delphi 2006的4核最先进PC上,重新启动Delphi并进行完整构建,需要约40秒。然后,如果我们立即在同一个Delphi会话中进行另一个完整构建,将需要1m 40秒。再做一次完整的构建,它会变得更糟。诸如此类

(我们很清楚Windows本身会缓存文件,这对编译速度有很大影响。上面的数字是基于文件被缓存的情况。我们设置了这样的场景,让Delphi编译一次项目,终止它,然后启动一个新的Delphi会话。因此,虽然40秒不会太慢,但这只是因为es由Windows缓存。我们这样做是为了进行苹果对苹果的比较。)

让我们困惑的是,为什么编译速度会变差。(我们在过去观察到,如果项目有大量的单元循环引用,那么速度会变差。)如果我们终止Delphi并开始新的会话,编译时间将回到40秒。我们观察到的更有趣的事情是,我们可以达到相同的速度单击“取消”按钮中止编译,然后立即执行完整构建,从而实现“改进”。编译时间也将回到40秒

在我们看来,Delphi自己的单元依赖缓存不如从头开始构建它那么高效,而且随着时间的推移,它变得越来越糟糕。而且,它还显示Cancel按钮以某种方式清除了这个缓存。我们想的是,如果我们能够进入执行此清除的Delphi IDE子系统,我们就可以始终保持编译速度这是最高性能。但我们不知道如何

有人知道我们能做什么吗

我们仍然在使用Delphi 2006,因为我们还没有找到一种可行的方法将我们的大型项目移植到Unicode。我在论坛上读到,最新的Delphi XE在单元循环引用方面表现出类似的编译速度问题。有人知道Delphi XE是否解决了这个问题吗


p、 我们也知道,将项目拆分为运行时包可以减少编译时间。但出于部署和管理原因,我们尽量避免使用运行时包。

性能逐渐下降可能是由于编译器中的某种内存泄漏或其他错误。天知道D2005和D2006已经受够了哼哼!如果你不能升级到一个支持Unicode的Delphi版本,你至少应该升级到D2007(我相信它仍然可以从Embarcadero获得)以获得更好的稳定性


此外,正如Robert Frank在评论中提到的,请查看Andreas Hausladen的工具。就在几天前,他发布了一个补丁,大大提高了编译速度。不幸的是,这个特定功能显然只适用于D2009及更高版本,但他的许多修复程序都有助于加快各种速度,包括编译器。

如果您构建了应用程序中,以下是一些加快此过程的技巧:

  • 在生成之前删除所有*.dcu(
    del*.dcu/s
  • 在相应的硬盘上运行
  • 将大多数源文件放在同一个目录中,并尽量使IDE和项目库路径尽可能短,首先使用最多的条目
  • 安装
Delphi2007的编译速度应该比Delphi2006快

Delphi 2009/2010/XE可能会慢一些:从用户实验来看,泛型和新RTTI的实现使得编译过程更加复杂,并且发现实际的实现比Delphi 2007慢一些

更新:

是否尝试启用ProjectClearUnitCacheItem隐藏菜单项


我已经通过CnPack或(我不知道是哪一个,可能是更晚的)启用了此项。这可以用于清除内部单元缓存。

从Andreas Hausladden那里尝试加速是很值得的,但这只会帮助IDE的性能,而不是我所理解的编译

另一个还没有人提出的想法是使用高规格的固态磁盘

我建议使用具有大量RAM的64位Windows 7,以获得最佳的文件缓存性能


感谢您的项目不是用C++编写的!< /P> < P>您是否尝试使用脚本命令行编译代码?

从命令行重新编译是否使进程持续40秒

从cmd“dcc32.exe”运行以查看用法

更新:
我现在无法检查它,但是您应该尝试从命令行编译,看看是否尝试从ide运行,ide不应该重新编译,并允许您使用调试运行。

这有一些建议可以提高编译速度。避免循环引用并检测未使用的单元(使用CNWizard)更有效。

考虑在内部使用运行时包构建,然后在向QA部门发送代码或分发应用程序时构建单片可执行文件

这需要额外的维护,但是构建时间的急剧增加是值得的

我们有一个2.4 MLOC的项目,其中包含大约40-50个较小的支持应用程序。当针对一组运行时包进行编译时,该项目的构建速度约为500K行,构建速度约为6倍(15秒vs.90秒)。许多较小的应用程序在1秒或更短的时间内编译,因为大量打包的代码是共享的

您需要确保测试单片可执行文件,