在做一个测试项目,用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;

解决方案 »

  1.   

    for I := 0 to slist.Count - 1 do
    begin
      slist[I] := ReplaceStr(slist[I], #13#10, ',');
      Application.ProcessMessages;
    end;
      

  2.   

    修正
    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;
      

  3.   

    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;
    这里改为逗号。
      

  4.   


    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的时候,需要重组一次字符串,效率肯定差.还有其他地方,总之用在这里不适合.
      

  5.   

    谢谢Jpexe,
    你提供的方法,你现在的方式只能临时解决我当前遇见的问题,但如需要在大容量字符串中替换时还是有问题
    还是需要一个快速替换字符串匹配字符的函数。
      

  6.   

    谢谢SQLDebug_Fan,kiboisme:
    其实我已经有了快速拼接我需要的json数据的方法,没有用replacestr。但replacestr的效率低下是一个比较大的问题,所以才把原来的代码贴出来。已期望找到好的字符串替换方法或函数。
      

  7.   

    TStringList 在长度过长时,单单 .Text 就已经很慢了。
    StringReplace('src', 'old', 'new', [rfReplaceAll]) 速度不慢.
      

  8.   

    StringReplace的性能是不高,主要是要频繁申请释放内存,如果是单字符的替换,一个一个比较就可以了。
      

  9.   

    网上找到一组高效的字符串替换函数,LZ可以试试。
    http://blog.sina.com.cn/s/blog_722bc92e0100parr.html
      

  10.   

    估计是字符串内存重复调整的原因
    预先分配足够大的内存,再逐一复制 前面的旧内容+替换后的内容+后面的旧内容 进去,应该会快很多faststring不行了?xe3??
      

  11.   

    谢谢提供,这个函数我最早时就测试过,我在xe下,替换内容有错。替换内容会被变成乱码,而faststring中的函数也一样。会被替换成乱码,并填入不少的#0。我是win7系统。
    我不懂汇编,没法找到原因,并去改正。
      

  12.   


    我是win7 。xe。faststring替换后会被替换内容会成是乱码,并插入不少的#0,与上面的Q_replacestr函数类似。
    其实我在网上找到的几个用汇编操作的函数都已经不能正常替换了,被替换内容都不对。不知道是不是因为操作系统的问题
      

  13.   

    补充一下。Q_replacestr替换内容错误比较厉害。大家看看我原始的数据样式。
      

  14.   


    os是win7?delphi是多少版本?
    我d7编译的使用faststring的程序好像都还正常(xp和win7下)啊
      

  15.   

    os是win 7 旗舰,delphi 是 xe
      

  16.   

    这个地址下的方法也不行了。
    http://blog.csdn.net/lwm08106542000/article/details/6763727
      

  17.   


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

  18.   

    强制转换string到ansistring后,还是替换不对,而且效率很低,部分函数出现运行错误。
    还有就是我生成的字符串中暂时没有中文,所以替换错误的原因应该不是因为unicode。或者有大侠再测试下!
      

  19.   


    字符串中的英文,才会多一个0x0字节强制转换string到ansistring
    还是
    把那个函数里的string全部改为ansistring再编译?