[计算机]Delphi代码优化.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[计算机]Delphi代码优化

Delphi 代码优化 分类: Delphi 2008-03-16 07:59 1. 字符串优化 1.1. 不重复初始化 1.2. 使用SetLength预分配长字符串(AnsiString) 1.3. 字符串与动态数组的线程安全(Thread Safety) 1.4. 避免使用短字符串 1.5. 避免使用copy函数 1.6. 总是使用长字符串,必要时转换为pchar 2. 整数代码优化 2.1. 尽量使用32位变量 2.2. 避免使用子界类型 2.3. 简化表达式 2.4. 不再畏惧乘法 2.5. 临时子界类型 2.6. 大整数运算 3. 浮点优化 3.1. 警惕 Extended 3.2. 改变FPU控制字 3.3. 多用Round 3.4. 传送实参 3.5. 自己动手,丰衣足食 3.6. 减少除法 3.7. 浮点零的检查 4. 其他优化 4.1. 局部变量 4.2. 局部过程 4.3. 过程参数 4.4. 指针变量 4.5. 数组 4.6. 流程控制 4.7. 强制类型转换 4.8. 枚举、集合 4.9. Pentium II带来的新问题 4.10. CPU视图 4.11. 循环语句 4.12. case语句 4.13. 填充和移动内存 4.14. 接口和虚方法 4.15. 代码对齐 4.16. 代码风格 4.17. 相信编译器 4.18. 代码计时 4.19. 写在最后 字符串优化 delphi有三种字符串类型:短字符串(string[n],n=1..255)存储区为静态分配,大小在编译时确定,这是继承于bp for dos的类型;字符数组(pchar)主要是为了兼容各类api,在bp7中已经出现,如今在delphi中更加应用广泛,其存储区可以用字符数组静态分配,也可用getmem手动分配;而长字符串(ansistring)是delphi独有的,其存储区在运行时动态分配,最灵活也最易被滥用。 不重复初始化 delphi默认字符串类型AnsiString会自动初始化为空。如下代码: ? var s:string; begin s:=; …… end; s:=;就属多此一举。但是值得注意的是这对函数返回值result无效。而一般说来,用var实参传递比返回字符串值要更快一些。 使用SetLength预分配长字符串(AnsiString) 动态分配内存是AnsiString的一大长项,但容易弄巧成拙,一个典型的例子如下: ? s2:= ; for i:=2 to length(s1) do s2:=s2+s1[i]; 且不说可用delete取代之,主要问题在于上例的循环中s2的内存区域被不停地重复分配,相当费时。一个简单有效的办法如下: ? setlength(s2,length(s1)-1); for i:=2 to length(s1) do s2[i-1]:=s1[i]; 这样s2内存只会重新分配一次。 字符串与动态数组的线程安全(Thread Safety) 在delphi 5以前动态数组与长字符串的操作这些非线程安全调用是由引用计数来处理其临界问题的,而自delphi5起就改为直接在一些临界指令前加lock指令前缀来避免这个问题。不幸的是这一修改的代价相当昂贵,因为在pentium处理器中lock指令相当费时,大概要耗费额外的28个指令周期来完成这一操作,因而整体效率至少下降一半。解决这个问题的办法只有一个,那就是修改delphi rtl核心代码。在备份原文件后,将source\rtl\sys\system.pas中所有的lock替换为{lock},当然必须是整字替换。如此还未完全优化,下一步是将delphi4运行库中也有的xchg指令去掉,因为该指令有隐含的lock前缀,所以必须将system.pas内_lstrasg和_strlasg两个过程中的 xchg edx,[eax] 替换为如下代码: ? mov ecx,[eax] mov [eax],edx mov edx,ecx ok大功告成,编译一下,覆盖system.dcu即可。如此其执行效率将比delphi5提高6倍,比delphi4提高2倍。 避免使用短字符串 由于很多字符串操作会先把短字符串转换为长字符串,从而减慢了执行速度,因此还是少使用短字符串为妙。 避免使用copy函数 这也和滥用内存管理有关。一个典型的情形如下: if copy(s1,23,64)=copy(s2,15,64) then …… 这样导致分配了两块临时内存,因而降低了效率。应当替换为如下代码: i:=0; f:=false; repeat f:=s1[i+23]s2[

文档评论(0)

ctuorn0371 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档