2010-07-07 98 views
21

我使用Delphi 2009为桌面程序发布单个可执行文件(.EXE)。我没有任何程序运行所需的外部DLL或资源。我能做些什么来减少我的可执行文件的大小(Delphi)?

我使用两个组件:LMD Innovative's ELPackSergey Tkachenko's TRichView,它们被编译到我的可执行文件中。

当我构建我的生产版本时,使用“Release”构建配置,生成的可执行文件为13,533 KB。

在使用Delphi 2009之前,我使用的是Delphi 4.它生成的可执行文件只有2671 KB,同时包含相同的两个组件,基本上与我的当前版本具有相同的代码。

我的确明白Delphi 2009完全是Unicode(这是我升级的主要原因),而且Unicode可能会导致大小增加一倍。但是这大约是5倍。

是否有一个原因,为什么我的可执行文件必须保持5倍大?还是有一些简单的方法来减少可执行文件的大小?


请注意。有些人正在回答压缩Delphi EXE的方法。这不是我想要做的。我试图简单地看看为什么要使用这么多的空间来删除​​可能没有必要的内容。如果这样做,如果需要,压缩仍然可以在之后完成。

安装完成后,可执行文件的大小无关紧要。它用于下载目的,并最大限度地减少要压缩的服务器负载和下载时间。我更喜欢使用Inno Setup并在安装例程本身内部压缩程序。然后在安装时将其扩展为完整大小。这既可以防止可能的病毒检测,也可以消除在内存中解压程序所需的额外启动时间。此外我代码签署我的可执行文件和我的安装例程,并且一些压缩技术与此不兼容。

有关压缩的详细信息,请参见StackOverflow的问题:Delphi EXE compressor?


ldsandon问我,我用什么选项来提供,所以在这里,他们是:

Compiling Options http://www.beholdgenealogy.com/img/compilingoptions.jpg

Linking Options http://www.beholdgenealogy.com/img/linkingoptions.jpg

+2

您目前使用哪个编译器开关?那些影响代码大小的是那些将调试信息或控制代码添加到项目中的代码。 – 2010-07-08 07:18:53

+1

@splash:我的约20个单元中有大约400 KB的我自己的代码。它们包括14个使用大约500 KB的dfm文件的表单。这不包括我使用的两个组件中的代码。 – lkessler 2010-07-08 18:29:57

+0

@ldsandon:我想我正在使用“发布”版本配置的所有默认设置。 – lkessler 2010-07-08 18:31:42

回答

13

当移动f从德尔福7到德尔福2010年,我们的.exe的增长例如从16兆到35兆。

几周前,我在Embarcadero论坛上问了一个类似于你的问题。 (link)在我的OP中,我列出了一系列有关此主题的链接,您可能会发现有帮助。

我们尝试使用UPX压缩我们的.exe文件。让它工作了几个小时显著降低了我们的.exe文件,但我们可能不会在生产中使用它的原因如下:

  1. 我们有相当多的.exe文件的,不希望等待1/2每个版本的一天。 (这有可能是我们能找到一个非蛮力的参数设置UPX,这将减少这...)

  2. 虽然.exe文件的大小减小,我们可交付不是,因为我们的安装(毫不奇怪)无法从已压缩的文件中挤出更多的压缩数据......但它能够将原始的16兆.exe降低到8兆。

  3. 我读过一些报道,在某些时候(很少但从不),UPX exe会引发各种反病毒程序来报告包含病毒的应用程序。 (我不记得日期,地点或我在哪里看到这些信息的细节,所以我在这里报告这件事有点不公平。)但是,我们对于冒这种可能性的风险如此不利,以至于UPX是假表...

的英巴卡迪诺论坛的链接还包括link另一个有关这个主题的SO线程。

对于我们在移植到Delphi 2010时发现的代码膨胀,我仍然感到惊讶和失望。正如Nick所指出的,Unicode的2X是相当过分的。

但是,移动到D2010时,膨胀是一个相对较小的折衷,因为IMO,D2010在许多其他方面是如此惊人的升级。但是,它确实意味着我们可能不得不移动到运送2张CD而不是一张。我不期待看到我们组织对此的反应......

+3

@ Tom1952:你不能压缩两次。因此,最好使用安装程序进行压缩以减少下载大小。我使用InnoSetup,它包含我的13.5 MB程序到一个只有4.5 MB的安装包中。安装程序运行时,会将程序解压缩为全尺寸,因此不会有任何可能的病毒检测问题。 – lkessler 2010-07-08 03:50:00

+0

@ Tom1952:感谢您提供关于Embarcadero论坛上类似问题的链接。这是一个非常有趣的讨论(包括Peter Below的一些评论)。你提到的一点是关于大图标。那么,我确实在我的程序中添加了一些大型的Vista图标,可以在这个大小上添加一个MB。也许你写的程序可能会帮助我。 – lkessler 2010-07-08 03:53:52

+0

@ Tom1952:我还没有看到其他的SO问题。这是一个很好的想法,并链接到一些有用的实用程序。 – lkessler 2010-07-08 04:02:22

6

从Unicode中分出预期的2倍增加,并最终得到一个2.5X增加不明。考虑到你跳过了多少个版本,这是有道理的。自Delphi 4以来,很多已被添加到VCL和RTL中,并不是所有的东西都可以很容易地被智能连接出来,即使你从不使用它。取决于你使用的单位数量,你可能会带来相当多的额外行李。

Allen Bauer和编译团队增加了a new feature into D2010 to help reduce this,但显然他们小心谨慎地行事,并没有在尽可能多的地方使用它。希望我们会在2011年和随后的发布中看到更多的信号减少。

+13

对于Unicode来说2X是相当大的。 – 2010-07-08 00:29:52

+0

我知道。这比公平的少一点,因为并不是应用程序中的所有内容都是字符串。但我的主要观点是,它的很多来自标准库变得更大。 – 2010-07-08 00:35:05

+0

我的下一次重大升级将用于64位或跨平台编译,以先到者为准。我希望我的可执行文件不会增长到30 MB。 – lkessler 2010-07-08 01:12:50

10

没有看到“发布”版本配置使用的实际设置,因此解释了这种规模的增加需要大量的推测。

除了一些可能不太可能的因素导致大量增加被“拖入”的代码即使未被使用,增加的幅度最容易通过包含调试信息来解释。

我会检查你的编译器和链接器设置:

  • 调试信息(编译器设置)
  • TD32信息(链接)
  • 远程调试信息(链接)

比较这些设置在Delphi 2009项目中与Delphi 4中的等效项相同。

+0

谢谢@Deltics:我相信我正在使用所有默认的Delphi 2009“Release”设置。在Delphi 2009中,TD32的设置已被链接调试信息(请参阅:http://blogs.embarcadero.com/chrishesik/2009/09/15/34920/)取代,我将其作为“False”。链接器中的远程调试符号为False。但是我确实有将Debug信息编译为True,将符号调试为真和本地符号奇怪地与它们对立为False。然后链接器输出为“生成DCU”和“详细映射文件”。我可以和那些人一起玩,但是如果他们非常拯救我,我会感到惊讶。 – lkessler 2010-07-08 00:57:39

+2

您可能会对调试信息可以产生多少差异感到惊讶。至少它是值得关闭和发现。另外,您是否正在使用MadExcept或任何可能将MAP文件嵌入到可执行文件中的类似实用程序? – Deltics 2010-07-08 01:17:13

+0

@Deltics:我确实使用EurekaLog进行跟踪错误,但我关闭了其大部分选项(包括内存泄漏)。完全关闭EurekaLog只会将可执行文件减少90 KB。 – lkessler 2010-07-08 04:21:39

5

使用“UPX - 压缩或扩展的可执行文件” @http://upx.sourceforge.net


如果你去工具/配置工具,并进行设置,这样,你可以压缩你的工作可执行轻松通过IDE中的菜单项。

Configuration

+2

IMO,你最好在以后的部署过程中离开UPX。即不要在IDE中打扰它,它只会减慢你的速度。等到你准备好部署,并在同一个作业(.bat文件,Visual Build Pro等)中进行你的编码,本地化,建立设置等。 – 2010-07-08 12:35:39

+2

我问的问题不是简单地减小可执行文件的大小,但要确定任何无用的多余大小,并找出为什么它在Delphi版本之间增长很多。为了减少下载时间,我使用InnoSetup来创建一个压缩的安装文件。看到我对Tom1952的回答的评论。 – lkessler 2010-07-08 13:43:47

2

如果你不想使用exe文件压缩,那么你应该给StripReloc一试。

+0

但是你可以使用StripReloc和一个压缩器。 – philnext 2010-07-08 13:39:41

+0

查看我对Adam的回答的评论。 – lkessler 2010-07-08 13:54:35

+0

stripreloc是好的(因为它不是压缩器),但它不能减小尺寸 – VibeeshanRC 2010-11-11 04:50:31

4

另一种方法是看看'什么单位增加尺寸?'。

为此,我使用集成在JCL/JVCL安装的IDE中的JCL'Project Analyzer IDE',它向您显示所有具有相应大小的单元。您可以将其导出为文本文件。 如果您在2种环境中使用(D4 & D2009),您将获得大量相关信息。

+0

Thans @philnext。不幸的是,当我去一台新机器时,我没有重新安装Delphi 4。我需要老版本的ElPack和TRichView来处理它,我记得他们当时是一个安装bug的工具,所以它永远不值得费心,尤其是因为我的新代码是Unicode,并且现在完全与Delphi 4不兼容。 – lkessler 2010-07-08 13:47:33

+0

这实际上是一个非常好的方式来追捕那些讨厌的16k PNG图像,潜入形式为3MB位图。 – 2014-11-19 08:41:47

0

您较新的delphi中的标准单元可能包含更多的字符串和常量(如错误字符串),即使禁用调试信息也会包含这些字符串和常量。检查你的用途。

除了不使用特定单元或从中删除不需要的数据之外,没有太多的细节。

(我的经验与德尔福5)

6

我会加几句话。 只有链接器能够遵循代码层次结构,链接器才能删除未使用的过程和函数。下面列出的链接器的梦魇列表:

  • 消息驱动的代码,这个不幸的消息是,这个代码不能被任何删除,这就是为什么德尔福空白项目规模的不断从版本增长到版本。每个新的Windows消息(例如,只要我最近介绍了WM_TOUCH)都会创建无法删除的过程调用层次结构(即使您根本没有计划使用Touch API)。这是因为每个的情况下WM_:片段是链接器无法决定是否会使用的东西。代码和数据结构从单元的开始结束,初始化,结束部分访问。在这里你有一些控制,删除不必要的调用或对象创建。即使你创造需求对象,只有释放他们在最后确定部分,请仔细

2

1)你生成一个详细的地图文件,因为您已设置“使用调试的DCU”它也将包含RTL/VCL单元的符号。如果异常处理系统使用它来生成调用堆栈等,则可以将其添加到可执行文件中。如果不以某种方式压缩,它可能会使你的.exe文件的大小非常大。

2)使用debug dcus也会让你的.exe稍微大些,因为通常它们是在没有优化和调试选项的情况下编译的,而且它们也会让你的代码变慢。它们不应该用于发布版本。

3)调试信息应该只添加到设备的debig信息,而不是可执行文件,尽管需要IIRC生成映射文件。

4

我已经做了一些测试,看看D2007和D2010之间的区别,因为我们正在升级到D2010。我测试了一个中等规模的管理GUI应用程序,大约有60个表单(带有详细表单,框架等的表格)。我们正在使用TMS组件+ Remobjects。

D2007:
“正常” 的编译:18.8MB
与调试DCU的:18.8MB(同样大小!)

D2010
正常:23.9
调试DCU的:(!)48.8mb

因此,使用调试DCU双打我们的exe文件大小...

测试与我们的业务服务(没有什么大的DFM的):
D2007:12.3MB
D2010:17.1mb

所以,是的,D2010增加了exe(一点),但这对我的客户来说不是问题。

编辑:有关编译尺寸的一些信息:
D2007:
alt text
D2010:
alt text

所以增加代码大小,但比数据的两倍多!

0

由于D2010添加了扩展RTTI,RTTI是增加exe大小的一个臭名昭着的因素,所以有趣的是看D2009的二进制文件对于那个应用程序有多大。

如果D2009的二进制文件明显更小,它不是Unicode等。对于我自己的二进制文件,我只有从D7到D2009增加了30%左右。

2

检查dfm-s的格式。如果你想让你的exe变小,它们必须是二进制格式。

0

前面已经说过,使用可执行压缩程序会减小exe文件的大小,但不会降低安装包的大小。但是,如果你想要一台好的压缩机,那么试试ASPack

@ Tom1952:ASPACK是非常快,只需几秒钟,以压缩文件

+0

是的,每个人都知道EXE压缩机可以压缩exe文件,ASpacks是一个好的压缩机,但这不是一个问题,讨论哪个是最好的压缩机 – VibeeshanRC 2010-11-11 04:43:40

0

你也可以改变图标。在最新的delphi IDE(即XE3)中的图标是Vista/7兼容的,并且包含所有尺寸(据我所知高达256x256)。所以你可以通过改变Icon来减少exe文件的大小。

0

取消选中项目选项中的调试信息。 如果embarcadero无法提供任何解决方案或解释!我认为这个解决方案很简单:不要仅仅使用Delphi就会有很多编程语言,每一个都只受程序员想象力的限制。

相关问题