网站建设| 数据库类| 图形图象| 程序设计| 现代办公| 操作系统| 考试认证| 网络技术| 软件工程| 电脑相关| 文学作品
网站开发| 网页制作| 操作系统| 图象图形| 考试认证| 数据库类| 程序设计| 硬件技术| 现代办公| 网络技术| 笑话频道
 
您的位置: 电脑书库首页-> 电脑文摘-> 程序设计-> Delphi/Pascal-> Delphi代码优化(二) 整数篇

Delphi代码优化(二) 整数篇
作者:佚名 来源:InterNet 加入时间:2004-11-25
相关文章
  • 代码优化完结篇
  • 相关书籍:

    Delphi代码优化(二) 整数篇

     

    尽量使用32位变量

    32位代码中,32位变量是默认处理格式;16位变量(wordshortintwidechar)的运算会令处理器临时切换为16位处理模式,因而需要双倍的处理时间;相较之下,8位变量(bytechar)只要不与其它混用,却不会太慢。如果实在需要多次使用一个816位变量,可以考虑把它临时转换成32位变量,这只需要一步赋值:ADWord:=Aword;

     

    避免使用子域类型

    Pascal语言的一大优势便是其丰富的数据类型,DelphiObject Pascal继承了这一传统,枚举和子域类型即属此类。但不幸的是,他们会为优化带来麻烦,因为它们的占用的字节数取决于其子域的大小。比如一个元素数不超过256个的枚举类型会占用1个字节,而例如MyYear=1900..2000则会占用两个字节,而如前文所述,16位变量是很慢的。

     

    简化表达式

    过于复杂的表达式会妨碍编译器的自动优化,这时可以考虑引入临时变量来化简表达式,这样可能(!)可以得以优化,更重要的是提高了代码的可读性。

     

    不再畏惧乘法

    PII出现以前,乘法运算是相当费时的,以至于当时的经典优化方法便是把一类特殊的乘法转变为移位运算和加法。而今,在作为标准配置的PII上,乘法和多数其它运算一样,只需要一个指令周期即可完成。当然Delphi编译器仍然会把诸如*2之类的运算优化为shl 1,这也不坏,不是吗?

     

    临时子域类型

    才揭过子域类型的短,又来说它的妙用:-p 但这也不是真正的子域类型,不过是形式上相似罢了。像以下的语句:

    if  ((x>=0) and (x=<10)) or ((x>=20) and (x<=30))  then …

    可以改写为:

    if  x in [0..10,20..30]  then …

    子域数越多,优化效果越明显。不过除了在NOI题目里以外,天下可没有免费馅饼,这回的代价是占用一个临时寄存器。

     

    movzx xor/mov

    这是读入小于32位数据的两种不同方法,后者在PII以前更具优势,而前者在PII上因其乱序执行的特性而显得更有效率。编译器对此的取舍规则似乎很复杂,必要时还是自己用嵌入汇编好了。

     

    大整数运算

    对付大整数(超过32位的),你有四种武器(为什么不是七种?问Borland,别来问我)——int64compdoubleextended。其中除了64位整数类型int64外,其余都是浮点数,其运算都是由FPU指令实现的。这其中的comp类型,存储结构同int64一模一样,按照Borland的官方说法,comp类型已经过时,应当被int64所取代,理由很简单——整数运算总比浮点快吧。然而根据一项在PII上进行的测试,int64除了在加减运算中具有无可比拟的优势外,在乘除方面,竟比浮点数还慢!

    好在还有老当益壮的comp,只是稍有些繁琐。

    首先将变量声明为int64,并声明两个辅助元:

    var

     a,b,c,d,e: int64;

     ca:comp absolute a;

     cc:comp absolute c;

    加减法不用变,除法就如下处理:

    c:=trunc(ca/b); //is faster than c:= a div b

    乘法这么来:

    e:=round(ca*b+cc*d); //is faster than e:=a*b+c*d;

     



    [文章录入员:fightter]

    相关文章
  • 代码优化完结篇
  • 相关书籍:
    本站推荐内容

    近期主机类热搜关键词:
    美国服务器 美国服务器租用 海外服务器租用 国外服务器租用

    Delphi/Pascal
    C/C++/VC
    C++Builder
    Basic/VB类
    Delphi/Pascal
    Java编程
    FORTRAN
    其它
    电脑教程阅读排行
    ·DELPHI下的多线程程序设计(...
    ·Delphi与Excel的亲密接...
    ·Delphi实现串口通信的常用的...
    ·Delphi中初始化.Ini文件...
    ·Delphi中用于读写(I/O)...
    ·谈谈Delphi中的类和对象
    ·Delphi编译错误中文手册
    ·Delphi中关于TApplic...
    ·OPENGL图形程序设计
    ·SQL的基本操作