【发布时间】:2018-09-05 12:01:09
【问题描述】:
我的 Delphi win32 VCL 应用程序被部署为一个大的 exe。该应用程序是一个客户端服务器应用程序,带有一个连接到 SQL Server 的胖客户端。
这很方便(更新共享文件夹中的一个文件并更新应用程序就足够了——当然数据库架构也会更新)。
由于我在每个版本中都使用了许多“胖”的第三方组件,例如 ReportBuilder 和 DevExpress,因此 exe 文件大小的增长主要是因为这些组件变得越来越大。
在 dpr 中,我设置了这些标志,以确保从共享文件夹或可移动设备启动 exe 时,它始终加载到内存中(并避免奇怪的连接错误):
{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
如果 exe 是使用 Release Build Configuration 构建的,则普通 exe 通常会减小大约 50% 的大小(与 Debug Build Configuration 相比)。但是由于我使用的是 EurekaLog,所以使用 Build 而不是 Debug 构建只会稍微减小大小。
目前我的 exe 为 115MB(使用“Build”构建配置和 EurekaLog 构建)。
任何人都可以体验吗?是否存在不宜超过的已知限制?
以下是近年来规模的增长情况:
2014 年:76MB
2015 年:82MB
2016 年:90MB
2017 年:97MB
2018 年:115MB
自从我最近超过了 100MB 的限制后,我开始担心。
我知道可以使用运行时包进行构建,但我的问题集中在尽可能保持单一的大型 exe 方法。
我记得 cnPack 有一个我过去尝试过的 Uses Cleaner 功能。这可能会帮助我删除一些未使用的单元,从而减少 exe 大小,但无论如何这无法阻止让我超过 100MB 的趋势。
谢谢。
【问题讨论】:
-
运行时包不会改变任何东西。事实上,这只会增加总规模。因为链接器将无法删除未使用的代码。你在压制 RTTI 吗?另外,为什么 100MB 的可执行文件会成为问题?你有任何实际问题吗?我不明白为什么使用像 Eureka log 这样的工具会影响可执行文件的大小。他们是否将地图文件打包到可执行文件中?我使用 madExcept,用于创建堆栈跟踪的信息位于外部文件中。
-
我在构建过程中使用 UPX,这使得 exe 文件大小约为原始大小的 25%。
-
UPX 可能会让事情变得更糟。更有可能吸引反恶意软件产品的注意,并且您强制在启动时从磁盘读取整个可执行文件,而不是让它按需分页。
-
@who 你有什么收获?我在 UPX 中根本看不到任何好处。也许 20 年前值得,但即使这样也值得怀疑。
-
一个更稀缺的资源是内存,而 up 需要更多。对于下载大小,您的下载内容将被打包。
标签: delphi exe delphi-10-seattle