一步步教你優(yōu)化Delphi字串查找

字號(hào):

本人在編寫離線瀏覽器WebSeizer的過程中,用到大量字符串處理函數(shù),這是很耗CPU的一個(gè)處理過程,為了編寫出高效率的網(wǎng)頁解析引擎,對優(yōu)化代碼作了一番研究。
    1 、高精度的計(jì)時(shí)函數(shù)
    代碼優(yōu)化時(shí)需要用到精確的計(jì)時(shí)器。常用的有GetTickCount函數(shù),可以達(dá)到毫秒級(jí)的精度。但還是很不夠的,這時(shí)可以采用提高循環(huán)次數(shù)的辦法。另外,還有一個(gè)精度更高的定時(shí)——“高分辨率性能計(jì)數(shù)器”(high-resolution performance counter),它提供了兩個(gè)API函數(shù),取得計(jì)數(shù)器頻率的QueryPerformanceFrequency和取得計(jì)數(shù)器數(shù)值的QueryPerformanceCounter。實(shí)現(xiàn)原理是利用計(jì)算機(jī)中的8253,8254可編程時(shí)間間隔定時(shí)器芯片實(shí)現(xiàn)的。在計(jì)算機(jī)內(nèi)部有三個(gè)獨(dú)立的16位計(jì)數(shù)器。
    計(jì)數(shù)器可以以二進(jìn)制或二—十進(jìn)制(BDC)計(jì)數(shù)。計(jì)數(shù)器每秒產(chǎn)生1193180次脈沖,每次脈沖使計(jì)數(shù)器的數(shù)字減一,產(chǎn)生頻率是可變的,用QueryPerformanceFrequency可以得到,一般情況下都是1193180。QueryPerformance Counter可以得到當(dāng)前的計(jì)數(shù)器值。所以只要你的計(jì)算機(jī)
    夠快,理論上精度可以達(dá)到1/1193180秒。
    2 、代碼優(yōu)化實(shí)例
    下面以一個(gè)自定義的字符串函數(shù)的為例,說明代碼優(yōu)化過程。
    Delphi提供的字符串函數(shù)里有一個(gè)Pos函數(shù),它的定義是:
     function Pos(Substr: string; S: string): Integer;
    它的作用是在字符串S中查找字符串Substr,返回值是Substr在S中第一次出現(xiàn)的位置,如果沒有找到,返回值為0。
    在本人編寫WebSeizer軟件(天空軟件站有下載)過程中,Pos已經(jīng)不能滿足要求。一方面:在處理網(wǎng)頁中的字符串時(shí),要求對大小寫不敏感,即< h t m l > 和代表的含義完全一樣。另一方面:我們還要求有一個(gè)函數(shù),返回值是Substr在S中最后一次出現(xiàn)的位置,而不是第一次出現(xiàn)的位置。下面是這個(gè)函數(shù)的未經(jīng)優(yōu)化的代碼。
    function RightPos(const Substr,S: string): Integer;
    var
    iPos: Integer;
    TmpStr:string;
    begin
    TmpStr:=s;
    iPos := Pos(Substr,TmpStr); Result:=0;
    //查找Substr第一次出現(xiàn)位置
    while iPos<>0 do
    begin
    Delete(TmpStr,1,iPos+length(Substr)-1);
    //刪除已經(jīng)查找過的字符
    Result:=Result+iPos;
    iPos := Pos(Substr,TmpStr); //查找Substr出現(xiàn)位置
    if iPos=0 then break;
    Result:=Result+length(Substr)-1;
    end;
    end;