在做一个测试项目,用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;
后在网上找了一些改进后的函数,如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;
begin
slist[I] := ReplaceStr(slist[I], #13#10, ',');
Application.ProcessMessages;
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的获取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的时候,需要重组一次字符串,效率肯定差.还有其他地方,总之用在这里不适合.
你提供的方法,你现在的方式只能临时解决我当前遇见的问题,但如需要在大容量字符串中替换时还是有问题
还是需要一个快速替换字符串匹配字符的函数。
其实我已经有了快速拼接我需要的json数据的方法,没有用replacestr。但replacestr的效率低下是一个比较大的问题,所以才把原来的代码贴出来。已期望找到好的字符串替换方法或函数。
StringReplace('src', 'old', 'new', [rfReplaceAll]) 速度不慢.
http://blog.sina.com.cn/s/blog_722bc92e0100parr.html
预先分配足够大的内存,再逐一复制 前面的旧内容+替换后的内容+后面的旧内容 进去,应该会快很多faststring不行了?xe3??
我不懂汇编,没法找到原因,并去改正。
我是win7 。xe。faststring替换后会被替换内容会成是乱码,并插入不少的#0,与上面的Q_replacestr函数类似。
其实我在网上找到的几个用汇编操作的函数都已经不能正常替换了,被替换内容都不对。不知道是不是因为操作系统的问题
os是win7?delphi是多少版本?
我d7编译的使用faststring的程序好像都还正常(xp和win7下)啊
http://blog.csdn.net/lwm08106542000/article/details/6763727
那可能是xe的问题:把string默认为unicode了
需要把string改为ansistring
看看行不行
还有就是我生成的字符串中暂时没有中文,所以替换错误的原因应该不是因为unicode。或者有大侠再测试下!
字符串中的英文,才会多一个0x0字节强制转换string到ansistring
还是
把那个函数里的string全部改为ansistring再编译?