首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

ReplaceStr效率太低,哪里有好的高效的字符串替换函数

2013-01-01 
ReplaceStr效率太低,哪儿有好的高效的字符串替换函数?在做一个测试项目,用stringlist生成后,准备用Replace

ReplaceStr效率太低,哪儿有好的高效的字符串替换函数?
在做一个测试项目,用stringlist生成后,准备用ReplaceStr替换其中的回车和换行,但发现当用stringlist生成的字符串长度稍长,ReplaceStr的效率就直线下降,当字符串长度达到1M以上时,替换的等待时间就基本让人难以忍受了。
后在网上找了一些改进后的函数,如faststring单元等,但发现在xe下都已经不能正确替换了,
特向大家求助!

本人的代码如下:
当len=10000时,等待时间已经很长了。在程序中基本不能忍受。

function  getJsonData (len:Integer):string;
var
i:Integer;
  slist:TStringList;
  s_data:string;
  r_seed:Single;
  lng:Single;
  alt:Single;
  dt:Integer;
begin
slist:=TStringList.Create;
  Randomize;
for i := 0 to len do
  begin
r_seed:=Random(100000)/1000000;
lng:=r_seed;
 r_seed:=Random(10)/1000000;
    alt:=r_seed;
s_data:=format('{"c":1,"y":%2.6f,"x":%3.6f,"t":%d}',[lng,alt,DateTimeToUnix(now)]);
    slist.Add(s_data);
  end;
  s_data:=slist.Text;
  s_data:=ReplaceStr(s_data, #13#10, ',');
  Result:=StrUtils.LeftStr(s_data,Length(s_data)-1);
  slist.Free;

end;


[解决办法]
修正

for I := 0 to slist.Count - 1 do
begin
  slist[I] := ReplaceStr(slist[I], #13#10, ',');
  Application.ProcessMessages;
end;
{如果slist的每一行中并没有回车换行符的话可以不用上面的代码}
slist.Delimiter := ',';
Result := slist.DelimitedText;

[解决办法]
TStringList的话,可以把每个Item组装起来就可以了。
可以参考TStringList的获取Text方法:

function TStrings.GetTextStr: string;
var
  I, L, Size, Count: Integer;
  P: PChar;
  S, LB: string;
begin
  Count := GetCount;
  Size := 0;
  LB := sLineBreak;
  for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + Length(LB));
  SetString(Result, nil, Size);
  P := Pointer(Result);
  for I := 0 to Count - 1 do
  begin
    S := Get(I);
    L := Length(S);
    if L <> 0 then
    begin
      System.Move(Pointer(S)^, P^, L);
      Inc(P, L);
    end;
    L := Length(LB);
    if L <> 0 then
    begin
      System.Move(Pointer(LB)^, P^, L);
      Inc(P, L);
    end;
  end;
end;

LB := sLineBreak;
这里改为逗号。

[解决办法]

function getJsonData(Len:Integer):String;
var
  i , nCount , n : Integer;
  s_data : string;
  lng , alt : Single;
  P : PChar;
begin
  if Len<0 then begin
    Result := '';


    exit;
  end;
  //s_data:=format('{"c":1,"y":%2.6f,"x":%3.6f,"t":%d},',[lng,alt,DateTimeToUnix(now)]);
  //预估s_data最大长度<80
  SetLength(Result , 80 * (Len+1));
  P := Pointer(Result);
  Randomize;
  nCount := 0;
  for i := 0 to Len do begin
    lng    := Random(100000)/1000000;
    alt    := Random(10)/1000000;
    s_data := format('{"c":1,"y":%2.6f,"x":%3.6f,"t":%d},',[lng,alt,DateTimeToUnix(now)]);
    //注意format的参数,格式描述中的最后多了一个, 也就是你最后想替换的那个
    n      := Length(s_data);
    Move(Pointer(s_data)^ , P^ , n*SizeOf(Char));
    P      := P + n;
    inc(nCount , n);
  end;
  SetLength(Result , nCount);
end;


我觉得楼主的思路不太好,不是说字符处理都要用TStringList的,换这个函数,处理Len=10万几乎不超过0.5秒
TStringList最后取Text的时候,需要重组一次字符串,效率肯定差.还有其他地方,总之用在这里不适合.

[解决办法]
网上找到一组高效的字符串替换函数,LZ可以试试。
http://blog.sina.com.cn/s/blog_722bc92e0100parr.html
[解决办法]
引用:
引用:
os是win7?delphi是多少版本?
 我d7编译的使用faststring的程序好像都还正常(xp和win7下)啊
os是win 7 旗舰,delphi 是 xe


那可能是xe的问题:把string默认为unicode了
需要把string改为ansistring
看看行不行

热点排行