Форум: "Прочее";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];
ВнизDELPHi На ubuntu Найти похожие ветки
← →
Sha © (2008-12-15 17:16) [80]> Cobalt © (15.12.08 14:05) [76]
http://new.fastcodeproject.org/fastcode-challenges/challenges/37-challenges/45-ansi-stringreplace.html
разница 9-15 раз в зависимости от процессора
← →
atruhin © (2008-12-15 17:22) [81]> А можно на эту функцию взглянуть?
Функцию писал сам, но саму идею однопроходного поиска с сохранением позиций в стеке, где то подсмотрел.
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;
← →
atruhin © (2008-12-15 17:24) [82]> [79] Sapersky (15.12.08 17:08)
> В BDS2006 и далее фасткодовские функции (все или нет - не
> в курсе) используются в качестве стандартных.
Не знаю откуда информация, но я сравнивал в RadStudio 2007 со свеми апдейтами
← →
Sapersky (2008-12-15 17:48) [83]Сейчас посмотрел 2006-й - да, похоже, StringReplace не меняли.
Судя по system.pas - от фасткода взяли Move, FillChar, Pos, _lldiv (64-bit signed division), возможно, есть ещё что-то в других модулях.
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.009 c