如何测量Delphi编译器各单元编译耗时以优化项目构建?
针对大型Delphi项目编译耗时分析的解决方案
关于Delphi编译模式与时间戳的有效性
Delphi编译器采用依赖驱动的嵌套编译模式,而非简单的顺序编译:
- 当编译单元A时,若A依赖的单元B需要重新编译(源码有修改或.dcu缺失),编译器会暂停A的编译,优先递归处理B的依赖链,待所有依赖单元编译完成后,才会继续A的编译。
- 因此,.dcu文件的修改时间戳仅能反映单元编译完成的时间点,相邻单元的时间差会包含其他依赖单元的编译耗时,无法准确计算单个单元的实际编译时间。加上.dcu的创建与修改时间差几乎为零(编译器生成文件的过程极快),通过时间戳分析编译耗时的思路完全不可行。
生成带计时信息的编译日志方法
1. 命令行编译器(dcc32/dcc64)
从Delphi 10.3 Rio及以后版本开始,命令行编译器支持--timing参数,可直接输出每个单元的编译耗时:
# 针对32位项目 dcc32 --timing YourProject.dpr # 针对64位项目 dcc64 --timing YourProject.dpr
执行后,控制台会输出类似以下的日志,清晰显示每个单元的开始编译时间、结束时间及耗时:
[00:00:00.123] Compiling UnitMain.pas
[00:00:02.456] Finished UnitMain.pas (耗时: 2.333秒)
[00:00:02.457] Compiling UnitUtils.pas
[00:00:03.120] Finished UnitUtils.pas (耗时: 0.663秒)
2. Delphi IDE内置日志
在IDE中开启计时信息显示:
- 打开
Tools > Options(不同版本路径略有差异,如Delphi 11 Alexandria为Tools > Options > Language > Delphi > Compiler > Output) - 找到Output设置项,勾选「Show timing information」
- 重新编译项目,Messages窗口会显示每个单元的编译耗时,可直接排序筛选耗时最长的单元。
3. MSBuild编译(适用于自动化构建场景)
若使用MSBuild编译项目,可结合/verbosity:detailed参数配合编译器的--timing选项,在构建日志中获取计时信息:
msbuild YourProject.dproj /p:DCC_Options="--timing" /verbosity:detailed
内容的提问来源于stack exchange,提问作者kgz
相关产品推荐
相关产品推荐

