Конференция "Прочее" » DELPHi На ubuntu
 
  • Sha © (15.12.08 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 © (15.12.08 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 © (15.12.08 17:24) [82]
    > [79] Sapersky   (15.12.08 17:08)
    > В BDS2006 и далее фасткодовские функции (все или нет - не
    > в курсе) используются в качестве стандартных.

    Не знаю откуда информация, но я сравнивал в RadStudio 2007 со свеми апдейтами
  • Sapersky (15.12.08 17:48) [83]
    Сейчас посмотрел 2006-й - да, похоже, StringReplace не меняли.
    Судя по system.pas - от фасткода взяли Move, FillChar, Pos, _lldiv (64-bit signed division), возможно, есть ещё что-то в других модулях.
 
Конференция "Прочее" » DELPHi На ubuntu
Есть новые Нет новых   [134447   +40][b:0][p:0]