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

字號:

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