CSDN-CSDN社区-Delphi-VCL组件开发及应用

收藏 检查一下你用的Delphi版本,是否具有良好的智能编译特点![问题点数:0,结帖人:sy_100000]

  • sy_100000
  • (飞雨)
  • 等 级:
  • 结帖率:
楼主发表于:2009-06-03 20:56:44
1、新建一个dll项目,什么代码不写,编译,看看编译出的dll是多少k字节;Delphi2009编译出来是127k!

2、把“uses  SysUtils, Classes;”删除,还是什么代码不写,再编译这个dll,看看看看编译出的dll是多少k字节!Delphi2009编译出来是22.5k!

同样是什么代码没有的,为什么编译出来的dll竟然相差近6倍?但在Delphi7下面,按照上面的方法编译空白的的dll项目,编译出的dll都是一样的!这说明了什么问题?说明Delphi2009的智能编译是极端弱智或存在严重Bug的,所以,你不用的单元,你应该人工去删除,否则编译出的目标代码是很庞大的!

然而还是存在一个问题:比方你只用了某个单元某一个函数,怎么办?比方,你use了Classes,不管你用没用,也不管你用了Classes内的多少东西,反正都得给你增加100多k!

我查阅网络上,不少关于Delphi2009编译出的目标代码为何太大的疑问。其实结论很简单:用Delphi2009,你不要相信它的智能编译,不用的单元,最好手工移除。若仅用了某个单元极少一部分东西,最好复制出来,不要去uses它!

Delphi2009只适合高手去玩玩,否则你会发现用Delphi2009编译出来的程序,比Delphi7编译出的程序,体积大很多,启动至少慢一半!

我现在是熟悉了Delphi2009这个畸形的怪物了,已经用得得心应手,而这个得心应手是付出了代价的:花了近一个月时间,夜以继日地改造了VCL库和RTL库,修改了不知道多少的bugs!
回复次数:19
#1楼 得分:0回复于:2009-06-03 21:01:21
2009没用过
现在仍在用D7
#2楼 得分:0回复于:2009-06-03 21:05:18
#3楼 得分:0回复于:2009-06-03 22:25:57
牛B的人...
#4楼 得分:0回复于:2009-06-04 07:30:52
我用delphi7分别按楼主的1和2要求来做,体积是85K和14.5k

2009没接触过,不过按现在的windows操作系统的演变来讲,体积变大,速度变慢都是正常的,因为硬件也在不断的升级中。倘若以后delphi把一些常用的VCL控件也加入到库里面(比如皮肤控件),估计楼主更要苦不堪言了  :)
#5楼 得分:0回复于:2009-06-04 09:38:15
我觉得吧,再你说这么多废话之前,还是先了解一下每个单元的 initialization/finalization 都做了些什么,如果不知道这两个段有什么作用的话,最好先去了解一下delphi的基本语法
决定最终文件大小的是链接器,跟编译器一点儿关系都没有。delphi的“智能编译”究竟有没有问题,反正从这些胡说八道来看,以你的水平是判断不出来的。“极端弱智或存在严重Bug的”既不是d2009的compiler,也不是它的linker,而是你自己
#6楼 得分:0回复于:2009-06-04 10:40:18
受教了
不过,估计除了D7,其它版本是不会再去用了.
D7之后这么些年,很多人都转VS去了.
#7楼 得分:0回复于:2009-06-04 10:45:29
引用 5 楼 Seamour 的回复: 我觉得吧,再你说这么多废话之前,还是先了解一下每个单元的 initialization/finalization 都做了些什么,如果不知道这两个段有什么作用的话,最好先去了解一下delphi的基本语法 决定最终文件大小的是链接器,跟编译器一点儿关系都没有。delphi的“智能编译”究竟有没有问题,反正从这些胡说八道来看,以你的水平是判断不出来的。“极端弱智或存在严重Bug的”既不是d2009的compiler,也不是它的linker,而是你自己


一般人都是这么认为,比如,不会认为微软的代码有问题,只会认为问题在我们自己。

initialization/finalization做些什么?我问问你,initialization会在什么时候执行?又为什么要特别有个initialization/finalization段?没有这两段,有没有其他更简单的方法替代这两段?

另外,initialization/finalization不管有什么就都该编译进去吗?
  • heikeyanxi用户头像
  • heikeyanxi
  • (心稳了,手也就稳了。)
  • 等 级:
#8楼 得分:0回复于:2009-06-04 10:51:04
学习学习
#9楼 得分:0回复于:2009-06-04 11:01:41
引用 4 楼 xinxinshou2009 的回复: 我用delphi7分别按楼主的1和2要求来做,体积是85K和14.5k 2009没接触过,不过按现在的windows操作系统的演变来讲,体积变大,速度变慢都是正常的,因为硬件也在不断的升级中。倘若以后delphi把一些常用的VCL控件也加入到库里面(比如皮肤控件),估计楼主更要苦不堪言了 :)


你见过多少有名的软件,都是基于原生VCL的?当然,Button、Edit、Label这些毫无技术含量的除外。因为基于原生的VCL,谁都可以做,所以一般是出不了名。
#10楼 得分:0回复于:2009-06-04 11:44:22
引用 7 楼 sy_100000 的回复: 一般人都是这么认为,比如,不会认为微软的代码有问题,只会认为问题在我们自己。 initialization/finalization做些什么?我问问你,initialization会在什么时候执行?又为什么要特别有个initialization/finalization段?没有这两段,有没有其他更简单的方法替代这两段? 另外,initialization/finalization不管有什么就都该编译进去吗?

你想说啥?
你认为我做出前面结论的原因是因为我迷信官方找不到bug?上个月我向qc提交的4个已open的bug中,有两个完全是我自己发现的,都是在多个版本中跟反汇编代码后,确认是一直就有的compiler的bug后提交的。rtl和vcl层面的bug(rtl里能找出bug来还真不太容易,都是用了10多年的老代码了)对我来说完全没吸引力,就算是run-time替换成自己的代码也没啥技术难度,改rtl和vcl完全没必要。而且这些bug是个人就都能发现,纠缠在这些以后肯定会fix的问题上纯粹浪费时间
initial/final做什么、什么时候执行之类的基础问题你还是自己翻书去吧。你问的这些问题我觉得对连compiler和linker都分不清的人解释实在是浪费时间。
btw,就算是vs的优化开到最高,我也还是能保证自己的代码都会执行到,而不会出现不应该被编译进去的废代码。有不需要编译的代码是你自己的问题,不是编译器的问题,跟链接器更没关系

ps,比如加载速度的问题,我估计你连pe文件的image base和.reloc section是有什么作用都没概念,更别说bound import table之类技术手段,肯定更是连听都没听过了

在你还没有足够了解一些东西的前提下,不要随便下结论,这不仅不会让你变得更高明,反而只会显出你的浅薄与浮躁,满足于自己的一知半解
#11楼 得分:0回复于:2009-06-04 11:58:33
说句公道话吧,当然谁都喜欢文件越小越好。但是老是在这些地方较真我觉得就有点钻牛角尖了,除非你是做黑客的。如果只是一般的应用程序,多几百K对应用真的没什么影响,硬盘越来越大了,CPU速度越来越快了,而且嫌DLL大也可以压缩下。有空不如多想想怎样让你的软件更有使用价值,或者从其它地方来进行优化更好点。
#12楼 得分:0回复于:2009-06-04 12:25:16
引用 10 楼 Seamour 的回复: 引用 7 楼 sy_100000 的回复: 一般人都是这么认为,比如,不会认为微软的代码有问题,只会认为问题在我们自己。 initialization/finalization做些什么?我问问你,initialization会在什么时候执行?又为什么要特别有个initialization/finalization段?没有这两段,有没有其他更简单的方法替代这两段? 另外,initialization/finalization不管有什么就都该编译进去吗? 你想说啥? 你认为我做出前面结论的原因是因为我…


这么说吧,我个人是追求极端精练的。比如我现在的程序,若用原生VCL和RTL编译,就近4M,但用我修改过的,只有1.26M!相差这么大!

其实,目前基本没有很智能的编译器,Delphi尤其缺乏智能编译。我在此提出这个问题,只是一个建议。

再者,中国有句古话:磨刀不误砍柴功。修改VCL和RTL,看似费时、吃力,但是之后你就顺风顺水了。

每个人都认为自己是高手,我有时也会这么认为。所以我不争论技术问题,只说说自己的看法,愿意看的就看,不愿意看的就拉倒。
#13楼 得分:0回复于:2009-06-04 12:31:31
引用 11 楼 Harryfin 的回复: 说句公道话吧,当然谁都喜欢文件越小越好。但是老是在这些地方较真我觉得就有点钻牛角尖了,除非你是做黑客的。如果只是一般的应用程序,多几百K对应用真的没什么影响,硬盘越来越大了,CPU速度越来越快了,而且嫌DLL大也可以压缩下。有空不如多想想怎样让你的软件更有使用价值,或者从其它地方来进行优化更好点。


理论上是这样。至于DLL大可压缩,而压缩的结果仅仅是占用的硬盘空间小了,运行前还是要解压后再映射到内存的。

硬盘上多占100M空间也无所谓,在使用时,多占用100M内存,不理想吧?

软件的使用价值在于功能和细节。Photoshop能用MFC来编写吗?
#14楼 得分:0回复于:2009-06-04 12:50:52
另外,思维不要永远定位在:现在硬盘这么大、CPU这么快,程序大点,速度慢点不会有感觉。

比方网络图象,为什么多是Gif、Png、Jpg,而不是Bitmap?

还有的程序,运行于服务器,可能有很多个用户同时在使用该软件,运行速度至关重要。

不要拿编写一些玩艺儿的态度去对待编程,玩艺儿毕竟是玩艺儿。
#15楼 得分:0回复于:2009-06-04 13:00:49
我说的是一般的应用软件
#16楼 得分:0回复于:2009-06-04 15:48:55
牛人
#17楼 得分:0回复于:2009-06-05 16:03:47
sy_100000=5415
  • icyf用户头像
  • icyf
  • (河马)
  • 等 级:
#18楼 得分:0回复于:2009-06-06 12:52:42
所有的工作直接用Windows API,这样程序肯定不会太大。
#19楼 得分:0回复于:2009-06-17 19:44:15
不好意思,鄙视你一下,这样的高手还问这个问题

http://topic.csdn.net/u/20090613/15/c32dc961-7a27-4e70-9c3b-f3be75906e3a.html?75348
我很惭愧...