-
-
> А можно на эту функцию взглянуть?
Функцию писал сам, но саму идею однопроходного поиска с сохранением позиций в стеке, где то подсмотрел. scPosStr, scCopyMem ассемблерные ускоренные аналоги стандартных, где то брал готовые. function scReplaceStr(const SourceString, FindString, ReplaceString: string): string; var P,PS: PChar; L,L1,L2,Cnt: Integer; I,J,K,M: Integer; begin L1 := Length(FindString); Cnt := 0; I := scPosStr(FindString,SourceString,1); while I <> 0 do begin Inc(I,L1); asm PUSH I end; Inc(Cnt); I := scPosStr(FindString,SourceString,I); end; if Cnt <> 0 then begin L := Length(SourceString); L2 := Length(ReplaceString); J := L+1; Inc(L,(L2-L1)*Cnt); if L <> 0 then begin SetString(Result,nil,L); P := Pointer(Result); Inc(P, L); PS := Pointer(LongWord(SourceString)-1); for I := 0 to Cnt-1 do begin asm POP K end; M := J-K; if M > 0 then begin Dec(P,M); scCopyMem(@PS[K],P,M); end; Dec(P,L2); scCopyMem(Pointer(ReplaceString),P,L2); J := K-L1; end; Dec(J); if J > 0 then scCopyMem(Pointer(SourceString),Pointer(Result),J); end else begin Result := ''; for i:=1 to Cnt do asm pop K end; end end else Result := SourceString; end;
-
> [79] Sapersky (15.12.08 17:08) > В BDS2006 и далее фасткодовские функции (все или нет - не > в курсе) используются в качестве стандартных.
Не знаю откуда информация, но я сравнивал в RadStudio 2007 со свеми апдейтами
-
Сейчас посмотрел 2006-й - да, похоже, StringReplace не меняли. Судя по system.pas - от фасткода взяли Move, FillChar, Pos, _lldiv (64-bit signed division), возможно, есть ещё что-то в других модулях.
|