我有一个拥有290多个单位的dpr。
编译的exe为50MB。
dpr代码现在是这样的:
begin
ShowMessage('Before Initialize');
Application.Initialize;
当我双击构建的exe时,我注意到8秒后才看到“Before Initialize”之前。这是因为大的exe大小?或者有没有办法减少这个时间?
答案 0 :(得分:17)
在Application.Initialize之前执行每个单元的每个初始化部分。你可能有一些代码需要时间。
单位数量不是问题。我有一个1100多个单元的项目,exe是35 MB,它立即开始。
如果您从网络驱动器或非常慢的磁盘启动,您可能会遇到速度减慢。
答案 1 :(得分:4)
根据您的问题,它可以是任何内容。
我能给你的唯一建议是衡量:
记录所有单元初始化部分中每个进入/退出的时间戳。
根据您的一条评论(您应该将其添加到您的问题中,因为它描述了更多细节):
WindowsCodecs.dll由您的某个单位初始化,可能会将一种或多种图像从一种格式转换为另一种格式。
您应该延迟转换,直到需要转换结果。
- 的Jeroen
答案 2 :(得分:1)
单位的初始化部分通常不是速度问题(除非你有一些与数据库相关的东西)。
从资源中加载TForm可能会很慢。
只有在必要时才能动态创建TForm: - 转到“项目”菜单,然后选择“选项”,然后选择“表单”选项卡。 - 将所有非强制性表格从左侧列表放入右侧“可用”列表。 - 通过一些代码按要求创建表单。
单位保持不变:
type
TOneForm = class(TForm)
....
end;
var
OneForm: TOneForm;
但您可以使用以下代码根据请求创建表单:
而不是你以前的
OneForm.ShowModal;
使用这种代码
if OneForm=nil then
OneForm := TOneForm.Create(Application);
OneForm.ShowModal;
您可以更快地找到应用程序的加载。
注意:强> 我刚刚宣读问题是在表单加载之前。 因此上述技巧不适用于这个特定问题。 我保留答案,因为它可能对其他人有用。 我下次会读得更好。 :(
在所有情况下,从初始化开始运行大量代码并不是一个好的设计。 这听起来像很多全局对象或变量......重构在这里有意义......:)
答案 3 :(得分:1)
您已经知道,如果您有很多表单,请尝试将表单移出“自动创建”列表,然后添加代码,以便在需要时创建表单,但是在您之前看到此问题甚至可以创建一个表单。因此,正如其他人所说,初始化部分是问题所在。
Jeroen的博客指出了一个很好的调试资源:
他把我指向Malcom Groves:
答案 4 :(得分:1)