★★★★★关于Delphi EXE文件减肥的思索 ★★★★★(50分)

  • 主题发起人 主题发起人 北京男人
  • 开始时间 开始时间

北京男人

Unregistered / Unconfirmed
GUEST, unregistred user!
今天用程序生成10000个变量、常量、函数来研究了一下Delphi程序变大的原因。
-----------------------------------------------------------------------------------------------
没用到的变量、常量、函数、单元引用能造成什么后果?
-----------------------------------------------------------------------------------------------
不被引用的常量不被编译到Exe文件里。
不被引用的变量不被编译到Exe文件里,也不让程序变慢、占用内存也不变大,唯一变长的是编译时间长了。

不被引用的变量、常量、函数不会被编译到Exe文件里去,所以不会让EXE文件变大;程序运行期占用内存也不变大,因为编译器都进行了优化,唯一变大的就是编译时间变长了,尤其是定义多余的变量时,不信定义10000个没用的变量试试!
不被引用的用uses语句引用的单元文件让程序变大,这是程序变大的主要远因。想让程序变小,必须把这些没用的Uses去掉,千万别忘从工程里删除此文件的引用,否则程序仍然不减肥!
不被引用的函数不会让程序变大,不管这个函数在什么地方,如果这个函数在另外一个很大的公用单元文件中,那么程序变大的主要原因是因为引用了那个单元文件而不是因为这个单元包含了10000个函数!比如uses 了一下 DBTables.pas单元那么程序马上比原先变大211K,比如你用了其中的15个函数,那么总共也只变大几个K,所以不要怕引用大的单元文件里的函数。
-----------------------------------------------------------------------------------------------
假如你程序里有10000个字符串
-----------------------------------------------------------------------------------------------
假如你程序里引用了10000个字符串,那么程序一定不小,你也许会从这10000个字符串中提取出一些公用的字符串部分,然后用这些字符串拼凑成10000个字符串吗?不,你错了!这样EXE文件并不减肥几个K(除非你10000个字符串都相同),这样反而给自己带来了大量字符串合并的烦琐问题,得不偿失!
-----------------------------------------------------------------------------------------------
总结以上可以作出结论:
1、Delphi程序变大的最大的原因就是引用了多余的单元文件!和引用的单元文件里有多少个函数、变量、常量无关!
和使用了其中多少个有点关系。
2、Delphi程序变慢绝对不是因为定义了过多没用的变量导致的,因为Dephi编译器很聪明的!
3、Delphi程序编译速度变慢有可能是因为定义了过多没用的变量导致的,再聪明也经不起你这样折腾啊!呵呵!!!;)
-----------------------------------------------------------------------------------------------
以下是另外一些建议:
-----------------------------------------------------------------------------------------------
让Delphi EXE减肥的方法:
-------------------------------
1、删除所有没必要的Uses语句,可能会让你程序减肥几百K!!所以少用组件也是个方法。
2、图片组建方面:不要ImageList直接装入图标;少用Image,最好动态装入JPG。
3、可视组件方面:尽量少用大量VCL组件,能少放一个就是少放一个。
4、不可视组建方面:尽量少用非可视组建。最好动态生成。
5、让EXE变大的组件如下:MediaPlayer、ToolBar
不让EXE变多大的组件如下:GroupBox
6、最后用AsPack软件压缩Exe文件
 
加一句:
对于EXE文件,在程序中,如果用了大量的有句柄的元件,程序会点用更多的系统资源。
建议尽量少用有句柄的元件,也可以提高EXE的速度及减小资源消耗。比起EXE文件大小本身的减肥更有意义。
 
看了很受用!只是小弟初学delphi不清楚“有句柄的元件”指哪些?能不能举个例子出来
 
1、删除所有没必要的Uses语句,可能会让你程序减肥几百K!!
第一个方法我是一直用的,编译器竟然不会自动删除没用到的单元!
譬如,我用raize控件中的Edit,单元中多了RzEdit,但是删除那个Edit,那个RzEdit不会自动删除,我一般对可疑的觉得不必要的删除,然后ctrl+s,引用到的自动又会增加的!
楼主精神不错!嘿嘿
 
能接受焦点的组件应该都有句柄。
 
收藏研究
 
我还有一个关于USEs的问题,同一个单元的多次添加会不会增加程序的体积?
比如说:datamodule在设计的时候,每个页面都会uses里添加一下
这样的话,会不会增加exe的体积?每个页面在设计完后再在uses中去掉datamodule,程序启动的时候保证datamodule已经创建就可以了!
 
DataModule的情况我会研究的:)
关于什么是有句柄的窗口:
procedure TForm1.Button1Click(Sender: TObject);
var
b: TButton;
begin
b.Handle;
{如果能编译通过,就是窗口控件!也就是说TWinControl的子类就是有
句柄的,能得到焦点,也叫做可视控件。你也可以在Handle上按下Ctrl+鼠标左键
来查看它是不是在TWinControl里定义的,无法跳过去就不是了。
如果你是 Delphi 初学者或者对 VCL类层次感兴趣,请到我的主页
下载我做的 VCLTree 程序,安装在你Delphi上(2.0版只支持Delphi5),到这里下载:
http://5inet.cn/web/Delphi/Share.htm }
end;
 
谢谢!那个东西不错,对我很有帮助。
 
没有句柄的元件是由TGraphicControl类继承下来的,此类元件不能接受键盘的输入。
比如:TLable、TImage、TPaintBox、TShape、TSpeedButton、TSplitter、TCustomLabel、TToolButton等等
 
1、删除所有没必要的Uses语句,可能会让你程序减肥几百K!!
delphi 在 Form 上放上组件后会自动 uses 对应的 unit, 删除放上去的组件, delphi 不会自动删除对应的 unit。但是 delphi 对自带组件对应的 unit 会自动判断,没有用到的 unit 不会编译进 exe 文件(即不会增大尺寸),对第三方组件对应的 unit 则不会自动判断,必须人工删除,否则会增大 exe 尺寸。
 
kaida,你说的不对,比如你做个什么都没有的程序运行!大小大概是300K,然后再uses 一下DBTables,再运行!程序肯定500多K!
难道DBTables不是Delphi自己带的吗?
昨天网上看到有个KOL组件,可以用Delphi做几十K的小EXE文件。听说那东西不用VCL,用Delphi的开发环境和Object pascal语法再加上KOL组件开发很小的程序,那我想Borland为什么不采取这门技术呢?是因为KOL组件还不够完美,以并不完善的功能为代价的原因吗?
 
我确实说错了。我仅仅对以下单元做了测试。做一个仅有一个窗体的 project,以下单元只要保留 Windows,其它单元任意增删,均不影响 exe 大小:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, ExtCtrls, StdCtrls, Menus, Mask, Buttons, Grids,
CheckLst, ValEdit, ComCtrls, ImgList, ToolWin;
 
讨论很精彩,我也来说两句。
同一空白的Project在D6下编译351KB,在D7下359KB
一个功能比较复杂但完全用VCL实现的Project在D6中编译593KB,在D7下编译626KB
               用ASPack.exe1.07B压缩250KB, 261KB
看来用版本较低的delphi生成的Exe较小一点。       
 
在我的计算机上,d6生成的EXE文件都比d7大
空工程(默认工程设置):
d6:392704
d7:366592
 
我用的是XP(一年没重装了),D6和D7都用过很长时间,我再次测试D6生成的Exe都比D7生成的大。((改天有空找个全新的系统再试试
 
多人接受答案了。
 
后退
顶部