一步步教你优化Delphi字串查找

一步步教你优化Delphi字串查找,第1张

一步步教你优化Delphi字串查找,第2张

在编写离线浏览器WebSeizer的过程中,我使用了大量的字符串处理函数,这是一个CPU密集型的处理过程。为了编写一个高效的网页解析引擎,我对优化代码做了一些研究。

1.高精度计时功能

代码优化需要精确的计时器。常用GetTickCount函数,可以达到毫秒级精度。但这仍然不够。这时,我们可以增加循环次数。此外,还有一个更精确的计时——“高分辨率性能计数器”,它提供了两个API函数,分别是获取计数器频率的QueryPerformanceFrequency和获取计数器值的QueryPerformanceCounter。其实现原理是利用计算机中的8253、8254可编程时间间隔定时器芯片实现的。计算机内部有三个独立的16位计数器。

计数器可以用二进制或二进制-十进制(BDC)计数。计数器每秒产生1,193,180个脉冲,每个脉冲使计数器的个数减一,产生的频率是可变的,可以用QueryPerformanceFrequency得到,一般为1,193,180。QueryPerformance计数器可以获取当前计数器值。所以只要你的电脑
足够快,理论上的精度可以达到1/1193180秒。

2.代码优化示例

以自定义字符串函数为例,说明代码优化过程。

Delphi提供的字符串函数中有一个Pos函数。它的定义是:

函数Pos(Substr:string;S: string):整数;

它的作用是在字符串S中查找字符串Substr,返回值是Substr在S中的第一个出现位置,如果没有找到,返回值为0。

在编写WebSeizer软件(可以从[/k0/]软件站下载)的过程中,Pos已经不能满足要求。一方面,在处理网页中的字符串时,要求不区分大小写,即< h t m l >与代表的意义完全相同。另一方面:我们还需要一个函数,它的返回值是Substr在S中最后出现的位置,而不是第一次出现的位置。下面是这个函数的未优化代码。

函数RightPos(const Substr,S:string):Integer;
var
iPos:整数;
TmpStr:string;
begin
TmpStr:= s;
iPos := Pos(Substr,TmpStr);结果:= 0;
//当IPOs 0 do
begin
delete(tmpstr,1,ipos+length (substr)-1)时,查找Substr的第一个出现位置;
//删除搜索到的字符
结果:=结果+iPos;
iPos := Pos(Substr,TmpStr);//找到Substr的位置
如果iPos=0则break
Result:= Result+length(Substr)-1;
end;
end;

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 一步步教你优化Delphi字串查找

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情