2011-01-20 47 views
6

我有一个dpr与290+单位。与许多单位的德尔菲项目需要很多运行

编译的exe是50MB。

朝鲜民主主义人民共和国代码是现在这个样子:

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

当我双击内置exe文件,我注意到有8秒后我才看到“初始化之前”。这是因为exe文件很大吗?或者有什么方法可以最小化这个时间?

回答

4

根据你的问题,它可以是任何东西。

我可以给你的唯一建议是测量:
记录所有单元初始化部分中每个入口/出口的时间戳。

根据您的意见一个(你应该添加到您的问题,因为它描述更详细):

WindowsCodecs.dll是由您的单位之一初始化,可能是从一种格式转换一个或多个图像到另一个。
您应该延迟转换,直到需要转换的结果为止。

--jeroen

17

Before Application.Initialize执行每个单元的每个初始化部分。你可能有一些需要时间的代码。

单位数量不是问题。我有一个1100多个单元的项目,EXE是35 MB,它瞬间启动。

如果您从网络驱动器或真正缓慢的磁盘开始,则可能会出现放缓现象。

+4

您可以诊断该程序被启动时它坚持一个分析器(例如http://delphitools.info/samplingprofiler/)消耗时间。 – 2011-01-20 12:49:16

+4

也可能由防病毒程序引起。 – gabr 2011-01-20 13:37:53

+5

快速提示:如上所述,执行应用程序中的初始化部分,同时执行组件的初始化部分。我在启动时发现的一个大的放缓(最多延迟60秒)是由于打印机属性对话框组件试图查询我在控制面板中安装的网络打印机的属性,而这些属性没有响应。映射的网络驱动器和其他未响应的网络资源以及组件初始化可能是一个问题区域。使用RAD Studio XE附带的AQTime来分析您的应用。 – 2011-01-20 14:19:36

1

单元的初始化部分通常不是速度问题(除非你有一些数据库相关的东西)。

什么是缓慢的TForm加载资源。

只有在需要时才会创建TForm: - 转到“Project”菜单,然后选择“Options”,然后选择“Forms”选项卡。 - 将左列表中的所有非强制性表单都放在右侧的“可用”列表中。 - 通过一些代码按要求创建表单。

单位仍然是相同的:

type 
    TOneForm = class(TForm) 
    .... 
    end; 

var 
    OneForm: TOneForm; 

但是你可以用下面的代码来创建要求的形式:

而不是你以前

OneForm.ShowModal; 

使用这种代码

if OneForm=nil then 
    OneForm := TOneForm.Create(Application); 
    OneForm.ShowModal; 

您会发现应用程序的加载速度要快得多。

注意: 我刚刚读到的问题是在表单加载之前。 因此,上述技巧不适用于这个特殊问题。 我保留答案,因为它可能对其他人有用。 下次我会读得更好。 :(

在所有情况下,从初始化运行很多代码是不是一个好设计 听起来像很多全局对象或变量......重构可能在这里有意义... :)

1

您已经知道如果您有很多表单,请尝试将表单移出“自动创建”列表,然后添加代码,以便在需要时创建表单,但在您面前发现此问题甚至可以创建一个表单。正如其他人所说,初始化部分是问题所在。

吉荣的博客中指出我在一个巨大的资源用于调试这样的:

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

他向我指出马尔科姆格罗夫斯:

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

1

有很多很好的建议,this question

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

在你的情况,听起来像很多初始化代码正在执行。