使用Delphi编译出的exe文件大小超过100MB,是否存在风险?

6
我的 Delphi win32 VCL应用程序 作为一个单一的大exe部署。该应用程序是一个客户端 - 服务器应用程序,其中一个胖客户端连接到 SQL Server
这很方便(只需更新共享文件夹中的一个文件即可更新应用程序-当然,DB模式也会更新)。
由于我使用许多“肥”第三方组件,如 ReportBuilder DevExpress ,因此每次发布时,exe大小都会增长,主要是因为这些组件变得越来越大。
在dpr中,我设置了这些标志,以确保从共享文件夹或可移动设备启动exe时,它总是加载在内存中(并避免奇怪的连接错误):
{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

如果使用 Release Build 配置构建 exe 文件,通常其大小与 Debug Build 配置相比会减少约50%。但由于我使用了 EurekaLog,使用 Build 而不是 Debug 构建只会轻微地减小文件大小。
目前我的 exe 大小为 115MB(使用“Build” Build 配置和 EurekaLog 构建)。
这种情况在其他人的经验中是否正常?有没有已知的建议不要超过的限制?
以下是最近几年文件大小的变化情况:
2014: 76MB
2015: 82MB
2016: 90MB
2017: 97MB
2018: 115MB
由于最近超过了100MB的限制,我开始担心。
我知道可以使用运行时包进行构建,但我的问题关注的是如果可能的话保持单个大 exe 的方法。
我记得 cnPack 有一个我以前试过的 Uses Cleaner 功能。这可能有助于删除一些未使用的单位,从而减小 exe 大小,但无论如何都不能阻止将我带过100MB的趋势。
谢谢。

2
运行时包不会改变任何东西。实际上,它只会增加总大小。因为链接器无法剥离未使用的代码。您抑制了RTTI吗?此外,一个100MB的可执行文件有什么问题吗?您遇到了实际问题吗?我不明白为什么使用像 Eureka log 这样的工具会影响可执行文件的大小。他们是否将其映射文件打包到可执行文件中?我使用 madExcept,在那里用于创建堆栈跟踪的信息位于外部文件中。 - David Heffernan
1
我在构建过程中使用UPX,这可以将EXE文件大小缩小到原始大小的约25%。 - whosrdaddy
6
UPX可能会使情况变得更糟。它更容易引起反恶意软件产品的注意,并迫使整个可执行文件在启动时从磁盘上读取,而不是让它按需分页。 - David Heffernan
3
@who 你得到了什么?我完全看不出在使用UPX有任何好处。也许20年前它还值得一试,但现在甚至这点也值得怀疑。 - David Heffernan
1
一个更为稀缺的资源是内存,而UP需要更多。至于下载大小,您的下载将被打包。 - David Heffernan
显示剩余11条评论
2个回答

1
我向EurekaLog提问,他们回复说:
EXE文件在经过EurekaLog处理后的大小主要由MAP文件的大小决定。其他影响EXE大小的因素包括你选择的EurekaLog选项,如内存检查、发送器、JCL支持等等。
你可以通过选择EL压缩选项来稍微减小EXE的大小。请注意,压缩会影响启动时间,因为需要在启动EXE时解压缩调试信息。
你可以通过关闭程序中不需要进行堆栈跟踪的部分的调试信息来进一步减小MAP文件的大小。像DevExpress这样的大型组件库是个好的起点。
最后,你可能有其他编译器选项,如开/关范围检查与EurekaLog一起使用。某些编译器选项可能会增加EXE的大小。
你可以使用我们的EurekaLog PE分析器查看调试信息大小、压缩等详细信息。
一些用户认为调试信息是问题的原因,所以回答这个问题时,拥有大型exe没有问题,要减小exe大小必须使用发布版本配置,在使用Eureka Log时应尝试减小映射文件的大小,在上述引用中大部分提示都在那里。

简单的解决方案。切换到 madExcept,无需将地图文件打包到可执行文件中即可获得更好的功能。 - David Heffernan
2
@DavidHeffernan 兴奋吗?;-) - dummzeuch

0

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