您的位置:首页 >> 编程开发 >> Delphi >> 正文
Delphi RSS
 

再谈DelphivsVC++

http://www.rdxx.com 06年12月20日 03:37 互联网 我要投稿

标签: VC++ , Delphi , VS , VC
 
偶然来找一个文件,却发现这里关于VC++和Delphi的讨论很是激烈。看了大家写的一些文章,觉得有些看法正确,有些就很偏颇甚至错误(也许无知?很抱歉我这样说:-)。我无意与任何人争论,更愿意把这看成是技术上的讨论。应该本着公正,不带偏见的态度(这并不意味着非要平分秋色,一切应以事实为准)。我用过除TP1以外的所有版本的Turbo Pascal,所有版本的Turbo C/Borland C++,所有版本的Delphi和C++ Builder;以及MSC 5.0/6.0,MSC/C++ 7.0和Visual C++ 4.2/5.0。不敢说有多高的水平,至少也算有一点经验吧。下面就谈一下我的看法。1. 编译器应该说Borland的编译器是最好的。因为Borland有全世界最好的编译器开发组(虽然Anders Hejlsberg离开了)。从技术上来讲,Borland领先任何竞争对手至少2~3年。一般来说,Borland的编译器总是能生成更小的代码并且通常(并不是在任何情况下)更快的代码。紫云英、曾登高在文章中说VC++编译的程序小,这其实是使用了动态连接的结果。M$把VC++的运行库(msvcrt*.dll, msvcp*.dll, mfc*.dll, 你看看这些文件加在一起有多大)在安装Windows时就放在了System/System32目录中了。两位说“协商接口”的问题,恐怕是对某些英文文章的理解错误。M$就是不愿意在Windows中带上其他公司的运行文件,没有技术上的原因。其实Delphi/C++ Builder不论在动态连接或静态连接的情况下,生成的程序都要比VC++的小。比如MDI的例子程序:在Delphi/C++ Builder中选New ... | projects | MDI Application,在VC++中用MDI App Wizard;生成的程序功能是非常类似的。下面是比较结果:(Delphi打开优化,C++ Builder使用最大速度优化,VC++ 5使用最小代码优化) Delphi 3 Delphi 5 C++ Builder 5 VC++ 5Dynamic Link 21k 35k 44k 70kStatic Link 253k 398k 467k 490k凡是使用了应用类库的程序(不管是MFC,OWL,VCL以及新的CLx框架)都要比不使用的大不少。这是因为目前的智能连接(Smart Link)技术还只能针对全局变量/过程,而不能用于对象结构。哪怕你只使用了某个类(或被这个类间接引用)的一个属性或方法,这个类以及它所引用的所有类都全部被连接到EXE中。目前所有的编译器都没有解决这个问题。(PS: 其实能生成最小代码(真编译)的高级语言编译器是Turbo Pascal,不信你写程序比较一下:program Test;begin writeln('Hello, world.');end.生成的EXE不到1.5K。而同样的C程序:#include <stdio.h>main(){ printf("Hello, world.\n");}最精悍的C/C++编译器生成的代码也有6K。)那么几个编译器生成的代码质量又如何呢?举一个例子,比如我们在编程时经常用到的for循环语句:(1) Object Pascal:procedure Foo;var i, j: integer;begin for i := 0 to 15 do j := j + i;end;(2) C++void Foo(void){ int i, j; for (i = 0; i < 16; i++) j = j + i;}Delphi 3生成的代码(打开优化): 字节数 时钟周期00424AA9 33C0 xor eax,eax 100424AAB 40 inc eax 100424AAC 83F810 cmp eax,0x10 100424AAF 75FA jnz -0x06 0 (可并行) ----------------- 8 3C++ Builder 5生成的代码(最大速度优化):00401535 33C0 xor eax,eax 100401537 40 inc eax 100401538 83F810 cmp eax,0x10 10040153b 7CFA jl -0x06 0 (可并行) ----------------- 8 3Visual C++ 5生成的代码(最大速度优化):27: for (i = 0; i < 16; i ++)00401205 mov ecx,dowrd ptr [j] 100401208 xor eax,eax 0 (可并行)28: {29: j = j + i;0040120A add ecx,eax 10040120C inc eax 10040120D cmp eax,10h 100401210 jl Foo(0x0040120a)+0Ah 0 (可并行)00401212 mov dword ptr [j],ecx 0/1 (取决于上一条指令的分支预测情况)30: }; ----------------- 16 4.2 (假定分支预测准确

9 7 3 1 2 3 4 5 4 8 :


 
 
打印本文
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站