【发布时间】:2009-07-12 06:32:27
【问题描述】:
您如何提高 Delphi 应用程序的启动速度(或减少启动时间)?
除了特定于应用程序之外,是否有始终有效的标准技巧?
注意:我不是在谈论快速算法或类似的东西。就速度而言,只有启动时的性能会有所提高。
【问题讨论】:
标签: performance delphi delphi-2009 startup
您如何提高 Delphi 应用程序的启动速度(或减少启动时间)?
除了特定于应用程序之外,是否有始终有效的标准技巧?
注意:我不是在谈论快速算法或类似的东西。就速度而言,只有启动时的性能会有所提高。
【问题讨论】:
标签: performance delphi delphi-2009 startup
在项目选项中,不要预先自动创建所有表单。根据需要创建和释放它们。
【讨论】:
尝试在主窗体的 OnCreate 事件中尽量少做。而是将一些初始化移动到不同的方法,并在表单显示给用户后执行此操作。应用程序正忙于忙碌的鼠标光标的指示有很长的路要走。
实验表明,如果您使用完全相同的应用程序并简单地向其添加启动通知,用户实际上会认为该应用程序启动速度更快!
除此之外,您还可以在编译器中执行排除调试信息并启用优化等常规操作。
除此之外,不要自动创建所有表单。根据需要动态创建它们。
【讨论】:
好吧,正如 Argalatyr 建议的那样,我将我的评论更改为单独的答案:
作为“不要自动创建表单”答案的扩展(这本身会非常有效),我建议延迟打开与数据库、互联网、COM 服务器和任何外围设备的连接,直到您首先需要它。
【讨论】:
在您的表单显示之前会发生三件事:
正如其他人指出的那样,您应该只自动创建少量表单(特别是如果它们是具有大量组件的复杂表单),并且不应在这些表单的 OnCreate 事件中进行冗长的处理。如果碰巧你的主窗体非常复杂,你应该重新设计它。一种可能性是将主窗体拆分为多个按需加载的框架。
其中一个初始化块也可能需要一些时间来执行。要进行验证,请在程序的第一行放置一个断点(.dpr 文件中的 main 'begin..end' 块)并启动程序。所有初始化块都会被执行,然后断点会停止执行。
以类似的方式,您可以单步执行 (F8) 主程序 - 您将看到创建每个自动创建的表单需要多长时间。
【讨论】:
显示一个启动画面,这样人们就不会注意到很长的启动时间:)。
【讨论】:
最快的代码 - 这是永远不会运行的代码。很明显,真的;)
【讨论】:
应用程序的部署可能(而且通常会!)以开发人员可能没有考虑到的方式发生。根据我的经验,这会产生比任何人想要的更多的性能问题。
一个常见的瓶颈是文件访问 - 启动应用程序所需的配置文件、ini 文件可以在开发人员机器上运行良好,但在不同的部署情况下表现很差。同样,应用程序日志记录可能会阻碍性能 - 无论是出于文件访问原因还是日志文件增长。
我经常看到的是部署在 Citrix 环境或共享网络驱动器上的富客户端应用程序,其中基础架构团队决定将用户临时文件或个人文件存储在应用程序发现问题的位置,这会导致性能或稳定性问题。
我经常看到影响应用程序性能的另一个问题是用于将数据导入和导出到文件的方法。通常在 Delphi 业务应用程序中,我看到了对 DataSet 起作用的导出函数——迭代和写入文件。考虑用于写入文件的方法,考虑可用内存,考虑写入/读取的“文件夹”可能在机器本地,也可能在远程服务器上。
开发人员可能会争辩说这些是安装问题,超出了他们的关注范围。在将此类问题确定为“基础设施问题”之前,我通常会看到许多开发人员分析周期。
【讨论】:
【讨论】:
将必须在启动时执行的长时间运行的任务(打开数据库连接、连接到应用服务器等)放入线程中。在线程完成之前,任何依赖于这些任务的功能都会被禁用。
不过,这有点作弊。主窗体立即出现,但您只是看起来启动时间更快。
【讨论】:
这仅适用于 IDE,但 Chris Hesick 发表了一篇关于 increasing startup performance under the debugger 的博文。
【讨论】: