【问题标题】:How to increase the startup speed of the delphi app?如何提高delphi app的启动速度?
【发布时间】:2009-07-12 06:32:27
【问题描述】:

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

除了特定于应用程序之外,是否有始终有效的标准技巧?

注意:我不是在谈论快速算法或类似的东西。就速度而言,只有启动时的性能会有所提高。

【问题讨论】:

    标签: performance delphi delphi-2009 startup


    【解决方案1】:

    在项目选项中,不要预先自动创建所有表单。根据需要创建和释放它们。

    【讨论】:

    • +1 - 让我补充一下:在您首先需要的时候打开任何连接,无论是数据库、互联网、COM 还是其他任何东西。
    • @Uwe:您的评论足够独特,应该是一个单独的答案。我会这样做,除非我看起来像一个代表猎犬,虽然我可以让我的答案顺时针,但你不会得到代表。
    • @Argalatyr:感谢您的建议
    【解决方案2】:

    尝试在主窗体的 OnCreate 事件中尽量少做。而是将一些初始化移动到不同的方法,并在表单显示给用户后执行此操作。应用程序正忙于忙碌的鼠标光标的指示有很长的路要走。

    实验表明,如果您使用完全相同的应用程序并简单地向其添加启动通知,用户实际上会认为该应用程序启动速度更快!

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

    除此之外,不要自动创建所有表单。根据需要动态创建它们。

    【讨论】:

    • 那么,什么是好的启动通知呢?我个人不喜欢启动画面。还能是什么?
    • 在主窗体显示到主窗体某处的小标签后,状态消息告诉用户您正在做什么的任何内容。如果可能,进度条也很有用,或者旋转进度条。
    • @utku 我理解你不喜欢启动画面,但是当主窗体没有立即显示时它们很有用。否则,您的用户可能不知道应用程序已启动并尝试重新启动它。
    • R.E.启动屏幕,主窗体的图片怎么样 - 看起来它启动得很快,即使你不能用它做任何事情。有点像Vista,真的。 ;-)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在您的表单显示之前会发生三件事:

      1. 所有单元中的所有“初始化”块均按“先见”顺序执行。
      2. 创建所有自动创建的表单(从 DFM 文件加载并调用其 OnCreate 处理程序)
      3. 您的主窗体已显示(调用 OnShow 和 OnActivate)。

      正如其他人指出的那样,您应该只自动创建少量表单(特别是如果它们是具有大量组件的复杂表单),并且不应在这些表单的 OnCreate 事件中进行冗长的处理。如果碰巧你的主窗体非常复杂,你应该重新设计它。一种可能性是将主窗体拆分为多个按需加载的框架。

      其中一个初始化块也可能需要一些时间来执行。要进行验证,请在程序的第一行放置一个断点(.dpr 文件中的 main 'begin..end' 块)并启动程序。所有初始化块都会被执行,然后断点会停止执行。

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

      【讨论】:

        【解决方案5】:

        显示一个启动画面,这样人们就不会注意到很长的启动时间:)。

        【讨论】:

        • 它作为产品品牌的一种形式。
        【解决方案6】:

        最快的代码 - 这是永远不会运行的代码。很明显,真的;)

        【讨论】:

        • 很明显......真的。但也没那么有用。
        【解决方案7】:

        应用程序的部署可能(而且通常会!)以开发人员可能没有考虑到的方式发生。根据我的经验,这会产生比任何人想要的更多的性能问题。

        一个常见的瓶颈是文件访问 - 启动应用程序所需的配置文件、ini 文件可以在开发人员机器上运行良好,但在不同的部署情况下表现很差。同样,应用程序日志记录可能会阻碍性能 - 无论是出于文件访问原因还是日志文件增长。

        我经常看到的是部署在 Citrix 环境或共享网络驱动器上的富客户端应用程序,其中基础架构团队决定将用户临时文件或个人文件存储在应用程序发现问题的位置,这会导致性能或稳定性问题。

        我经常看到影响应用程序性能的另一个问题是用于将数据导入和导出到文件的方法。通常在 Delphi 业务应用程序中,我看到了对 DataSet 起作用的导出函数——迭代和写入文件。考虑用于写入文件的方法,考虑可用内存,考虑写入/读取的“文件夹”可能在机器本地,也可能在远程服务器上。

        开发人员可能会争辩说这些是安装问题,超出了他们的关注范围。在将此类问题确定为“基础设施问题”之前,我通常会看到许多开发人员分析周期。

        【讨论】:

          【解决方案8】:
          • 首先要做的是清除自动 创建的表单列表(查找项目 选项)。即时创建表单 需要时,特别是如果 应用程序使用数据库连接 (数据模块)或包含的表格 大量使用控件。
          • 也考虑使用表单继承 减小 exe 大小(资源使用最小化)
          • 减少表单数量并将相似或相关的功能合并到一个表单中

          【讨论】:

          • 使用继承来减小 EXE 大小?这对我来说听起来很奇怪......也许你可以解释你的意思。如果你遵循你的第一点,你的最后一点可能就没有必要了……
          • 假设您有一个两表数据库应用程序。你基本上有两种不同的表格列出数据。并且您拥有使用其他形式激活 CRUD 操作的控件。如果您使用一些设计模式并将“逻辑”从这些表单中移出,那么您将不会为每个表创建表单。但是你仍然有道理说我的第一个和最后一个在某种程度上有一些矛盾。希望这个解释能说明一点。 (告诉你这样做并不意味着我总能成功实现它:))
          【解决方案9】:

          将必须在启动时执行的长时间运行的任务(打开数据库连接、连接到应用服务器等)放入线程中。在线程完成之前,任何依赖于这些任务的功能都会被禁用。

          不过,这有点作弊。主窗体立即出现,但您只是看起来启动时间更快。

          【讨论】:

            【解决方案10】:

            使用ASPackUPX 之类的东西压缩您的可执行文件和任何dll。更快的加载时间足以弥补减压时间。

            UPX 被用作example 如何更快地加载 FireFox。

            注意有downsides来压缩exe。

            【讨论】:

              【解决方案11】:

              这仅适用于 IDE,但 Chris Hesick 发表了一篇关于 increasing startup performance under the debugger 的博文。

              【讨论】:

              • Cris Hesick 的每篇博文现在都下架了... :( 至少我们还可以使用 Archive.org...有人应该在博文中重新审视这些主题。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-10
              • 2012-04-24
              • 2014-12-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多