【发布时间】:2009-05-28 12:17:08
【问题描述】:
我正在开发一个包含大量依赖项的大型 delphi 6 项目。编译整个项目需要几分钟。一些更改后的重新编译有时会更长,因此可以更快地终止 Delphi,擦除所有 dcu 文件并重新编译所有内容。
有没有人知道一种方法来识别,是什么让编译器越来越慢?关于如何组织代码以提高编译器性能的任何提示?
我已经尝试过以下事情:
- 明确包含 dpr 中的大多数单元,而不是依赖搜索路径:它没有任何改进。
- 使用命令行编译器 dcc32:它并不快。
- 尝试查看编译器做了什么(使用 SysInternals 的 ProcessExplorer):显然它大部分时间都在运行一个名为“KibitzGetOverloads”的函数。但我不能用这些信息做任何事情......
编辑,到目前为止的答案摘要:
对我来说效果最好的答案:
- cnpack 中的“清理未使用的单元引用”功能。它几乎自动清理了 1000 多个引用,使“冷”编译快了大约两倍。 (“冷”编译 = 在编译前擦除所有 dcu 文件)。 它从编译器获取参考列表。因此,如果您有一些 {$IFDEF },请检查您的所有配置是否仍然可以编译。
接下来我想尝试:
- 手动重构单元引用(最终使用抽象类)
但这是更多的工作,因为我首先需要确定问题出在哪里。一些可能有帮助的工具:
- GExperts在delphi IDE中添加项目依赖浏览器(可惜不能显示每个分支的大小)
- Delphi Unit Dependency Viewer V1.0 做同样的事情,但没有 Delphi。它可以计算一些简单的统计数据(哪些单位被引用最多,...)
- Icarus 在其中一个答案中被 a link 引用。
对我来说没有任何改变的事情:
- 将我程序中的每个文件和所有组件放在一个文件夹中,不包含子文件夹。
- 磁盘碎片整理(我尝试使用 ramdisk)
- 对代码源和输出文件夹使用 ramdisk。
- 关闭实时扫描杀毒软件
- 列出 dpr 文件中的所有单元,而不是依赖搜索路径。
- 使用命令行编译器 dcc32 或 ecc32。
不适用于我的情况的事情:
- 避免依赖网络共享。
- 使用DelphiSpeedUp,因为我已经有了它。
- 对所有 dcu 使用单个文件夹(我总是这样做)
我没有尝试过的事情:
- 升级到另一个 Delphi 版本。
- 使用 dcc32speed.exe
- 使用固态驱动器(我没有尝试过,但我尝试使用 ramdisk 来放置所有源代码。但也许我也应该在 ramdisk 上安装 delphi)
【问题讨论】:
-
关于您的 $IFDEF 问题,您应该用适当的 $IFDEF 将使用过的单元本身括起来,以缓解 CnPack 将它们删除为未使用的问题。
-
@Lieven:用适当的 $IFDEf 封装整个单元是个好主意。但这并不总是可能的:如果该单元是您不想更改的库的一部分,则必须将 $IFDEF 放在“使用”中。
标签: delphi optimization compiler-construction