StringReplace替代方案以提高性能

Ric*_*ras 10 delphi

我正在使用StringReplace将生成的XML中的>和<替换为char本身,如下所示:

StringReplace(xml.Text,'&gt;','>',[rfReplaceAll]) ;
StringReplace(xml.Text,'&lt;','<',[rfReplaceAll]) ;
Run Code Online (Sandbox Code Playgroud)

事情是,取代>的每一次出现都需要太长时间.

你是否有更好的想法让它更快?

Bru*_*Gee 8

如果您使用的是Delphi 2009,使用TStringBuilder时此操作比使用ReplaceString快3倍.它也是Unicode安全的.

我用从文本http://www.CodeGear.com与"<"和">"改变所有出现"&lt;",并"&gt;"作为我的出发点.

包括字符串赋值和创建/释放对象,这些在我的系统上分别花了大约25ms和75ms:

function TForm1.TestStringBuilder(const aString: string): string;
var
  sb: TStringBuilder;
begin
  StartTimer;
  sb := TStringBuilder.Create;
  sb.Append(aString);
  sb.Replace('&gt;', '>');
  sb.Replace('&lt;', '<');
  Result := sb.ToString();
  FreeAndNil(sb);
  StopTimer;
end;

function TForm1.TestStringReplace(const aString: string): string;
begin
  StartTimer;
  Result := StringReplace(aString,'&gt;','>',[rfReplaceAll]) ;
  Result := StringReplace(Result,'&lt;','<',[rfReplaceAll]) ;
  StopTimer;
end;
Run Code Online (Sandbox Code Playgroud)


Ger*_*lí- 7

试试Peter Morris的FastStrings.pas.

  • 快速字符串比普通的Delphi StringReplace函数更快速地跳跃.我真的希望彼得发布Delphi 2009的新版本. (3认同)
  • 请注意,FastString不是unicode,大多数是xml. (3认同)

Rod*_*ddy 6

你一定要看看Fastcode项目页面:http://fastcode.sourceforge.net/

他们对更快的StringReplace(Ansi StringReplace挑战)提出了挑战,并且'胜利者'比Delphi RTL快14倍.

Delphi本身的几个快速编码功能已包含在最新版本中(我认为是D2007),因此根据您使用的Delphi版本,性能改进可能会有很大差异.

如前所述,如果您真的想要处理XML,那么您应该真正关注基于Unicode的解决方案.