【问题标题】:When is a Delphi application too big for a single EXE?什么时候 Delphi 应用程序对于单个 EXE 来说太大了?
【发布时间】:2012-01-01 07:21:52
【问题描述】:

如果我将整个 Delphi 应用程序编译为单个 exe,该文件将增长到 5MB、10MB 甚至更多。什么时候太大了?这有什么问题?这是一个商业应用程序,目前在 Delphi XE 上。

我知道使用运行时包构建的选项。这听起来是个好主意,但我看到这里的 cmets 指出存在一些问题和缺点。

【问题讨论】:

  • 我猜您是在应用程序中打包图片等资源?
  • 可执行文件的大小应该没有限制,但是加载一个非常大的可执行文件当然需要一些时间。我们的 Delphi 可执行文件 > 100 MB 运行良好。
  • 那种尺寸没问题。如果您获得大约 1GB 的可执行文件大小,那么您将开始对 32 位 Windows 下的可用地址空间施加压力。
  • 我的减少 exe 文件大小的重要技巧可以在这里找到:stackoverflow.com/questions/7398580/reduce-exe-file/…
  • 谢谢大家。那里有些鼓励。澄清一下:没有图像。我对应用程序的大小感到满意。问题是关于 exe 和 vs 包的大小。我假设如果我使用包构建,AV 软件也会扫描包,所以我看不到任何保存。与从网络运行相同。

标签: delphi delphi-xe


【解决方案1】:

Delphi 应用程序永远不会太大很大。
但是,exe 越大,重新分发文件就越困难。
此外,如果可执行文件位于网络磁盘上,启动时间可能会受到影响。

许多因素使 exe 增长:

  • 启用调试信息(将或多或少加倍 exe 大小)。

    禁用在最终 exe 中包含调试信息(参见上面的屏幕截图)。
  • 包括位图(在imagelist 或类似的组件中)也会大大增加exe。
  • 包括资源(使用自定义 *.res)文件会增大大小。

我建议反对将资源放在单独的 dll 中。
这将使您的应用程序复杂化,同时不会减少加载时间和分发问题。
必须在生产代码中关闭调试信息。
如果您有 Delphi-2010 或更新版本,您可以选择包含 png 格式的图像。
这将比老式位图占用更少的空间。

只要您的应用程序小于 30 MB,我就不会真正担心文件大小。

剥离 RTTI 信息
David 建议剥离 RTTI 信息(这将禁用实时绑定和其他一些高级内容),请参阅:Reduce exe file
根据 David 的说法,它可以节省大约 30% 的 exe 大小。

Exe 大小只会增加加载时间
更重要的是您的应用程序分配为存储的数据量。
您在此处使用(或浪费)的空间量对应用程序性能的影响远大于原始 exe 大小。
Strategy or tools to find "non-leak" memory usage problems in Delphi?

更好的优化方法是确保不泄露资源
How to activate ReportMemoryLeaksOnShutdown only in debug mode?
Windows API calls memory leak detection

使用智能数据结构和算法
在这里真正缩小范围太笼统了,但使用 O(缓慢增加) 超过 O(浪费增加) 的算法。
Big-O for Eight Year Olds?
并尝试通过仅获取您需要的数据而不是所有您可能需要但可能永远不会的数据来限制内存使用。
Delphi data structures
等等等等。

【讨论】:

  • 请注意,膨胀EXE大小的调试信息是由Linker选项控制的TD32调试信息,如图所示。 Compiler 选项控制的调试信息对 EXE 大小没有影响;它将调试信息放在 DCU 文件中,但不包含在 EXE 中。
  • 写得很好,但大部分都回答了一个未提出的问题...我想知道您是如何提出 >30MB 的 ..
  • @SertacAkyuz,搜索了我编写的所有项目。 30 MB 是最大的 exe 大小:-)。因此,如果您的应用程序是 100MB,我想您必须做一些特别的事情才能让它像那样膨胀。
  • 我没有调试信息,我也没有真正尝试优化它,特别是如果它像它一样好的话。如果我能对其进行调整,这主意不错,但我并不担心。
【解决方案2】:

我不知道应用程序的 exe 大小有任何问题。我目前正在使用 exe 大约 60MB 并且没有问题的应用程序。
我知道的唯一限制是可用内存的限制。使用运行时包的应用程序将消耗更多的工作内存,因为所有运行时包都是在应用程序启动时加载的。并且这些软件包包含很多代码,您的应用程序中可能没有使用这些代码。
我真的很喜欢运行时包的想法,但我不喜欢 Delphi 中的实现。一个主要缺点是您必须使用一堆软件包来发布您的应用程序,这使得它难以维护。

【讨论】:

  • 我有 100mb 的可执行文件,我也没有问题。我认为当 EXE 大小超过 500 兆时,在维护软件时随意下载更新变得不方便(但仍然可能)。这就是我的痛苦开始的地方。但确实是非常主观的问题。运行时包最痛苦的问题意味着即使可执行文件的大小变得痛苦,我也总是会避免它们。我可能会使用自己的 DLL,但不会使用 Delphi 的 BPL 系统。
【解决方案3】:

使用 RELEASE Build 来减少执行大小,提高性能。也使用运行时包来减少 exe 文件,但使用运行时包会导致增加包(设置)文件大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2021-04-23
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多