Welcome

首页 / 软件开发 / Delphi / 一步步教你优化Delphi字串查找

一步步教你优化Delphi字串查找2008-02-02 csdn开发高手 朱晓峰本人在编写离线浏览器WebSeizer的过程中,用到大量字符串处理函数,这是很耗CPU的一个处理过程,为了编写出高效率的网页解析引擎,对优化代码作了一番研究。

1 、高精度的计时函数

代码优化时需要用到精确的计时器。常用的有GetTickCount函数,可以达到毫秒级的精度。但还是很不够的,这时可以采用提高循环次数的办法。另外,还有一个精度更高的定时——“高分辨率性能计数器”(high-resolution performance counter),它提供了两个API函数,取得计数器频率的QueryPerformanceFrequency和取得计数器数值的QueryPerformanceCounter。实现原理是利用计算机中的8253,8254可编程时间间隔定时器芯片实现的。在计算机内部有三个独立的16位计数器。

计数器可以以二进制或二—十进制(BDC)计数。计数器每秒产生1193180次脉冲,每次脉冲使计数器的数字减一,产生频率是可变的,用QueryPerformanceFrequency可以得到,一般情况下都是1193180。QueryPerformance Counter可以得到当前的计数器值。所以只要你的计算机

够快,理论上精度可以达到1/1193180秒。

2 、代码优化实例

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

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

function Pos(Substr: string; S: string): Integer;

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

在本人编写WebSeizer软件(天空软件站有下载)过程中,Pos已经不能满足要求。一方面:在处理网页中的字符串时,要求对大小写不敏感,即< h t m l > 和<HTML>代表的含义完全一样。另一方面:我们还要求有一个函数,返回值是Substr在S中最后一次出现的位置,而不是第一次出现的位置。下面是这个函数的未经优化的代码。

function RightPos(const Substr,S: string): Integer;
var
iPos: Integer;
TmpStr:string;
begin
TmpStr:=s;
iPos := Pos(Substr,TmpStr); Result:=0;
//查找Substr第一次出现位置
while iPos<>0 do
begin
Delete(TmpStr,1,iPos+length(Substr)-1);
//删除已经查找过的字符
Result:=Result+iPos;
iPos := Pos(Substr,TmpStr); //查找Substr出现位置
if iPos=0 then break;
Result:=Result+length(Substr)-1;
end;
end;