欢迎来到天天文库
浏览记录
ID:22648039
大小:60.00 KB
页数:10页
时间:2018-10-30
《[计算机]delphi代码优化》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Delphi代码优化分类:Delphi2008-03-1607:59·1.字符串优化o1.1.不重复初始化o1.2.使用SetLength预分配长字符串(AnsiString)o1.3.字符串与动态数组的线程安全(ThreadSafety)o1.4.避免使用短字符串o1.5.避免使用copy函数o1.6.总是使用长字符串,必要时转换为pchar·2.整数代码优化o2.1.尽量使用32位变量o2.2.避免使用子界类型o2.3.简化表达式o2.4.不再畏惧乘法o2.5.临时子界类型o2.6.大整数运算·3.
2、浮点优化o3.1.警惕Extendedo3.2.改变FPU控制字o3.3.多用Roundo3.4.传送实参o3.5.自己动手,丰衣足食o3.6.减少除法o3.7.浮点零的检查·4.其他优化o4.1.局部变量o4.2.局部过程o4.3.过程参数o4.4.指针变量o4.5.数组o4.6.流程控制o4.7.强制类型转换o4.8.枚举、集合o4.9.PentiumII带来的新问题o4.10.CPU视图o4.11.循环语句o4.12.case语句o4.13.填充和移动内存o4.14.接口和虚方法o4.15.代码对
3、齐o4.16.代码风格o4.17.相信编译器o4.18.代码计时o4.19.写在最后字符串优化delphi有三种字符串类型:短字符串(string[n],n=1..255)存储区为静态分配,大小在编译时确定,这是继承于bpfordos的类型;字符数组(pchar)主要是为了兼容各类api,在bp7中已经出现,如今在delphi中更加应用广泛,其存储区可以用字符数组静态分配,也可用getmem手动分配;而长字符串(ansistring)是delphi独有的,其存储区在运行时动态分配,最灵活也最易被滥用。不
4、重复初始化delphi默认字符串类型AnsiString会自动初始化为空。如下代码: vars:string;begins:="";……end;s:="";就属多此一举。但是值得注意的是这对函数返回值result无效。而一般说来,用var实参传递比返回字符串值要更快一些。使用SetLength预分配长字符串(AnsiString)动态分配内存是AnsiString的一大长项,但容易弄巧成拙,一个典型的例子如下: s2:="";fori:=2tolength(s1)dos2:=s2+s1[i];且不说可用
5、delete取代之,主要问题在于上例的循环中s2的内存区域被不停地重复分配,相当费时。一个简单有效的办法如下: setlength(s2,length(s1)-1);fori:=2tolength(s1)dos2[i-1]:=s1[i];这样s2内存只会重新分配一次。字符串与动态数组的线程安全(ThreadSafety)在delphi5以前动态数组与长字符串的操作这些非线程安全调用是由引用计数来处理其临界问题的,而自delphi5起就改为直接在一些临界指令前加lock指令前缀来避免这个问题。不幸的是这一
6、修改的代价相当昂贵,因为在pentiumⅱ处理器中lock指令相当费时,大概要耗费额外的28个指令周期来完成这一操作,因而整体效率至少下降一半。解决这个问题的办法只有一个,那就是修改delphirtl核心代码。在备份原文件后,将sourcertlsyssystem.pas中所有的lock替换为{lock},当然必须是整字替换。如此还未完全优化,下一步是将delphi4运行库中也有的xchg指令去掉,因为该指令有隐含的lock前缀,所以必须将system.pas内_lstrasg和_strlasg两
7、个过程中的xchgedx,[eax]替换为如下代码: movecx,[eax]mov[eax],edxmovedx,ecxok大功告成,编译一下,覆盖system.dcu即可。如此其执行效率将比delphi5提高6倍,比delphi4提高2倍。避免使用短字符串由于很多字符串操作会先把短字符串转换为长字符串,从而减慢了执行速度,因此还是少使用短字符串为妙。避免使用copy函数这也和滥用内存管理有关。一个典型的情形如下:ifcopy(s1,23,64)=copy(s2,15,64)then……这样导致分配了
8、两块临时内存,因而降低了效率。应当替换为如下代码:i:=0;f:=false;repeatf:=s1[i+23]<>s2[i+15];inc(i);untilfor(i>63);ifnotfthen……同样的,如下语句就显得相当低效:s:=copy(s,1,length(s)-10);应改为delete(s,length(s)-10,10);顺便提一句,在连接字符串时,s:=s1+s2;简单而有效;但在delphi2下则s:=format(
此文档下载收益归作者所有