包含许多单元的Delphi项目需要大量运行

时间:2011-01-20 12:08:07

标签: performance delphi

我有一个拥有290多个单位的dpr。

编译的exe为50MB。

dpr代码现在是这样的:

begin
  ShowMessage('Before Initialize');
  Application.Initialize;

当我双击构建的exe时,我注意到8秒后才看到“Before Initialize”之前。这是因为大的exe大小?或者有没有办法减少这个时间?

5 个答案:

答案 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的博客指出了一个很好的调试资源:

http://wiert.wordpress.com/2010/07/21/delphi-great-post-by-malcolm-groves-about-debugging-initialization-and-finalization-sections/

他把我指向Malcom Groves:

http://www.malcolmgroves.com/blog/?p=649

答案 4 :(得分:1)

this question中有很多好的建议。

你绝对应该确保你不是在启动时创建你不需要的东西。这通常是具有大量形式的项目的最大启动延迟。

在您的情况下,听起来好像正在执行许多初始化代码。