一个Delphi应用程序什么时候太大,不能放在一个单独的EXE文件中?

11

如果我将整个Delphi应用程序编译成单个exe文件,那么该文件的大小将会增长到5MB、10MB或更多。那什么时候文件大小才算太大?这样做存在哪些问题?目前该商业应用程序是在 Delphi XE 上开发的。

我知道有一个选项可以使用运行时包进行构建。听起来是个好主意,但我看到这里的评论指出了一些问题和缺点。


我猜你在应用程序中打包资源,比如图片等? - Cyclonecode
可执行文件的大小应该没有限制,但是加载非常大的可执行文件可能需要一些时间。我们曾经使用超过100MB的Delphi可执行文件,运行得非常好。 - Jens Mühlenhoff
那种大小是可以的。如果您得到大约1GB的可执行文件大小,那么您将开始在32位Windows下放置对可用地址空间的压力。 - David Heffernan
考虑安装软件,本质上可执行文件大小没有问题。另一方面,可能会有一个文件过滤驱动程序,希望在允许访问之前扫描整个文件,就像杀毒软件一样,或者可能会有用户希望从网络共享运行程序,每次运行时都会拉取整个文件。在我看来,这是无法回答的问题。 - Sertac Akyuz
2
我的减小exe文件大小的顶级技巧可以在这里找到:https://dev59.com/1Gs05IYBdhLWcg3wLO6Q#7398658 - David Heffernan
1
谢谢大家。有些鼓励的话在那里。澄清一下:没有图像。我满意应用程序的大小。问题是关于exe和vs包的大小。我假设如果我使用包构建,防病毒软件也会扫描包,所以我不认为会有任何节省。从网络运行也是一样的。 - Patrick Moloney
3个回答

32
一个Delphi应用程序从来不会真正变得“太”大。
然而,exe文件越大,重新分发文件就越困难。
此外,如果可执行文件位于网络磁盘上,则启动时间可能会受到影响。
许多因素使exe文件增加:
- 启用调试信息(会将exe大小增加一倍左右)。
enter image description here
在最终exe中禁用调试信息的包含(参见上面的屏幕截图)。 - 包括位图(在像imagelist或类似组件中)也会大大增加exe的大小。 - 包括资源(使用自定义*.res文件)将增加其大小。
我建议不要将资源放在单独的dll中。
这会使您的应用程序变得复杂,同时无法减少加载时间和分发问题。
在生产代码中关闭调试信息是必须的。
如果您有Delphi-2010或更新版本,可以选择在png格式中包含图像。
这将占用比旧式位图少得多的空间。
只要您的应用程序低于30 MB,我就不太担心文件大小问题。
剥离RTTI信息
David建议剥离RTTI信息(这将禁用实时绑定和一些其他高级功能),请参见:减小exe文件大小
根据David的说法,这可以节省大约30%的exe大小。 Exe大小仅会增加加载时间
更重要的是应用程序分配为存储使用的数据量。
您在此处使用(或浪费)的空间将对应用程序性能产生比原始exe大小更大的影响。如何找到 Delphi 中“非泄漏”内存使用问题的策略或工具?

更好的优化方式是确保不会泄漏资源
如何仅在调试模式下激活 ReportMemoryLeaksOnShutdown?
Windows API 调用内存泄漏检测

使用智能数据结构和算法
这里涉及的范围太广泛了,但要使用 O(缓慢增长) 算法而非 O(浪费增长) 算法。
八岁孩子也能懂的 Big-O?
尽可能地限制内存使用,只获取您需要的数据,而不是您可能需要的所有数据但实际上很可能永远都不需要
Delphi 数据结构
等等。


请注意,会使EXE文件大小膨胀的调试信息是由链接器选项控制的TD32调试信息,如图所示。编译器选项控制的调试信息对EXE文件大小没有影响;它将调试信息放在DCU文件中,但这不包括在EXE文件中。 - Rob Kennedy
2
写得很好,但大部分都是回答了一个并没有被问到的问题……我想知道你是如何想到超过 30MB 的。 - Sertac Akyuz
@SertacAkyuz,我搜索了我写过的所有项目。最大的exe大小是30MB :-)。所以如果你的应用程序是100MB,我猜你一定做了一些特殊的事情来让它变得臃肿。 - Johan
我那里没有调试信息,而且我也不是真的在尝试优化它,特别是如果它已经很好了。如果我需要微调它,这些想法也不错,但我现在不担心这个。 - Patrick Moloney

4

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


我有100MB的可执行文件,对此我没有任何问题。我认为当可执行文件大小超过500MB时,在服务软件时随意下载更新变得不方便(但仍然可能)。这是一个非常主观的问题。运行时包最痛苦的问题意味着即使可执行文件的大小变得痛苦,我也会一直避免使用它们。我可能会使用自己的DLL,但不使用Delphi的BPL系统。 - Warren P

1

使用RELEASE版本构建可以减小执行文件大小,提高性能。同时,使用运行时包可以减小exe文件大小,但会增加安装包的大小。


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