Delphi 代码优化(转)


======================================================
注:本文源代码点此下载
======================================================

delphi强力优化

nightmare(qingrui li)

**关于记录类型的返回值

c++程序员不会这样做,因为返回值会被压入堆栈,导致时间效率和空间效率都降低。但delphi无此问题。一般情况下,记录类型返回值会像out参数一样传递引用(在eax寄存器中)。

**公共表达式

delphi只在一个语句行内提取公共表达式。如果公共表达式包含函数调用,则不会被提取,因为可能改变语义。如果确保函数返回值相同,应预先计算。

**类属性

每次引用属性时都会使属性重新计算,即使属性是直接映射到域。频繁调用属性时应预先计算。

**循环内的重复计算表达式外提

c++程序员可能会让编译器做此优化,但delphi一般不会这么做。最安全且最有效的优化应由程序员来完成。

**使用const参数

当函数参量不被改变时,如果参量长度超过4字节或是接口、字符串、动态数组类型,使用const参数,可以使编译器尽可能的以地址方式用寄存器传递。

**长度为4字节的记录或数祖赋值时,编译器会自动按dword用32位寄存器处理

**记录数组的元素长度是偶数的话,可以生成更快的数组访问代码

**整除2或4会优化成右移位,乘2或4会优化成左移位,所以不需特意用移位运算,可以写出更可读的代码

**如果你在写大量浮点运算的程序,记住,delphi不对浮点计算做优化。手工优化,必要时用汇编,或者考虑用c(不是c++)。

**with语句

with语句不止是源代码上的简洁,而且生成更快更短的代码。

**delphi 6 的alignment

delphi 6 缺省按8字节对齐变量边界,在工程选项里将其改成4字节可以使生成的应用程序更短小。

**不要为delphi里没有宏而抱怨

参数较少的函数,调用时只耗1到2个时钟周期(register调用协议的优势),因为没有参数压栈的开销。

delphi代码优化(二) 整数篇

尽量使用32位变量

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

避免使用子域类型

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

简化表达式

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

不再畏惧乘法

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

临时子域类型

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

if ((x>=0) and (x==20) and (x关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值