如何增加Delphi应用程序的启动速度?

14

您如何增加Delphi应用程序的启动速度(或减少启动时间)?

除了应用程序特定的方法外,是否有一种始终有效的标准技巧?

注意:我所说的并不是快速算法等方面。仅指在启动时提高性能速度。

11个回答

27
在项目选项中,不要自动预先创建所有的窗体。按需创建并释放它们。

7
+1 - 并且让我补充一点:在你首次需要它的时候打开所有连接,无论是数据库、互联网、COM还是其他什么。 - Uwe Raabe
1
@Uwe:你的评论足够独立,应该单独作为一个答案。我可以这样做,但我会看起来像是在追求声望,虽然我可以将我的答案设为社区wiki,但那样你就得不到声望了。 - Argalatyr

19

尽量减少在主窗体的OnCreate事件中的操作,而是将一些初始化移到不同的方法中,并在窗体显示给用户后再进行。显示忙碌鼠标光标可以让用户知道应用程序正在忙。

实验表明,如果您采取相同的应用程序并只是添加启动通知,用户实际上会感觉该应用程序启动更快!

除此之外,您还可以像编译器中排除调试信息和启用优化等常规操作。

此外,请勿自动创建所有窗体。根据需要动态创建它们。


那么,什么是好的启动通知?我个人不喜欢闪屏。还有其他什么选择吗? - utku_karatas
在主窗体显示后,可以通过状态消息告诉用户正在进行的操作,或者在主窗体的某个标签上显示。如果可能的话,进度条也是非常有用的,或者可以使用旋转的进度条作为替代方案。 - Maltrap
3
我理解你不喜欢启动画面,但当主窗体无法立即展示时,启动画面是有用的。否则,用户可能不知道应用程序已经启动并尝试重新启动它。 - Bruce McGee
R.E.启动画面,不如放一张主窗体的图片——这样看起来它启动得很快,尽管你还不能对它进行任何操作。有点像Vista,哈哈。;-) - HMcG

17

好的,正如Argalatyr建议的那样,我将我的评论改为一个单独的答案:

作为“不要自动创建表单”的扩展答案(本身就相当有效),我建议延迟打开与数据库、互联网、COM服务器和任何外围设备的连接,直到你首次需要它们。


13

在显示表单前会发生以下三件事:

  1. 所有单元中的“初始化”块按照“首次出现”的顺序执行。
  2. 所有自动创建的表单都被创建(从DFM文件加载并调用其OnCreate处理程序)。
  3. 您的主要表单被显示(调用了OnShow和OnActivate)。

正如其他人指出的那样,您应该仅自动创建少量表单(特别是如果它们是具有大量组件的复杂表单),并且不应将长时间的处理放在这些表单的OnCreate事件中。如果您的主表单非常复杂,可以重新设计它。一种可能性是将主表单拆分成多个帧,这些帧可以按需加载。

还有可能其中一个初始化块需要一些时间来执行。为了验证,请在程序的第一行(.dpr文件中的主“begin..end”块)上设置断点,然后启动程序。所有初始化块都将被执行,然后断点将停止执行。

以类似的方式,您可以逐步执行主程序(F8)- 您将看到每个自动创建的表单创建需要多长时间。


4
显示启动画面,这样人们就不会注意到长时间的启动时间 :).

它作为一种产品品牌的形式。 - Bruce McGee

2

最快的代码就是从未运行过的代码。这很明显,不是吗? ;)


显而易见...是真的。但也不是很有帮助。 - jpfollenius

2
应用程序的部署可能会以开发人员未考虑的方式进行,这往往会导致更多的性能问题。常见的瓶颈是文件访问——在开发人员机器上运行良好的配置文件、ini文件,在不同的部署情况下可能表现极差。同样,应用程序日志记录也可能影响性能——无论是出于文件访问原因还是日志文件增长原因。
我经常看到的情况是,富客户端应用程序在Citrix环境或共享网络驱动器上部署,在这些情况下,基础设施团队决定将用户临时文件或个人文件存储在应用程序发现问题的位置,这会导致性能或稳定性问题。
我经常看到影响应用程序性能的另一个问题是用于导入和导出数据到文件的方法。在Delphi业务应用程序中,我经常看到基于数据集迭代和写入文件的导出函数。考虑写入文件的方法,考虑可用内存,考虑“文件夹”被写入/读取的位置可能是本地机器上,也可能在远程服务器上。
开发人员可能会认为这些是安装问题,超出了他们的关注范围。在发现这种“基础设施问题”之前,我通常看到开发人员对这种问题进行多次分析。

2
  • 首先要做的是清除自动创建的表单列表(查找“项目选项”)。在需要时动态创建表单,特别是如果应用程序使用数据库连接(数据模块)或包含大量控件的表单。
  • 考虑使用表单继承来减小exe大小(资源使用最小化)
  • 减少表单数量,并将类似或相关功能合并到单个表单中

使用继承来减小EXE文件大小?这听起来很奇怪...也许你可以解释一下你的意思。如果你遵循你的第一个观点,你最后的观点可能就不必要了... - jpfollenius
假设您有一个双表数据库应用程序。并且您有两个不同的表单基本上列出数据。并且您有控件,使用其他表单激活CRUD操作。如果您使用某些设计模式并将“逻辑”移出这些表单,则您不会为每个表格创建表单。但是您仍然可以说我的第一个和最后一个在某种程度上存在一些矛盾。希望这个解释能够让它变得更清楚。(告诉您这样做并不意味着我总是能够成功实现它:)) - user114285

2
将必须在启动时执行的长时间运行任务(打开数据库连接、连接应用程序服务器等)放入线程中。任何依赖于这些任务的功能都将在线程完成之前被禁用。
然而,这有点欺骗性。主窗体立即出现,但你只是给出更快的启动时间的假象。

2

使用类似于ASPackUPX的工具来压缩你的可执行文件和任何dll文件。虽然解压时间会增加,但更快的加载时间将弥补这一点。

示例中使用了UPX来加速FireFox的加载。

请注意,exe压缩存在缺点


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接