求最快生成WideString的方法 ( 积分: 50 )

  • 主题发起人 主题发起人 FlashDance
  • 开始时间 开始时间
F

FlashDance

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,下面是不是最快生成30000长度WideString的方法?
var
I,T:Integer;
S:WideString;
begin
SetLength(S,30000);
S:='';
T:=GetTickCount;
for I:=1 to 30000do
S:=S+'中';
Form1.Caption:=FloatToStr((GetTickCount-T)/1000);
end;
 
如题,下面是不是最快生成30000长度WideString的方法?
var
I,T:Integer;
S:WideString;
begin
SetLength(S,30000);
S:='';
T:=GetTickCount;
for I:=1 to 30000do
S:=S+'中';
Form1.Caption:=FloatToStr((GetTickCount-T)/1000);
end;
 
这是最慢的!
1、先 SetLength(S,30000);
再 S:='';
?? 给 S 分配内存岂不白干了?
2、S := S + '中';
这句将导致内存的反复开辟分配,S 越长速度将越慢。
应该:先开辟内存,再初始化数据:(在一下的测试中 3 比 2 快约 1000 倍)
procedure TForm1.Button2Click(Sender: TObject);
var
I, T: Integer;
S: WideString;
begin
T := GetTickCount;
SetLength(S, 30000);
S := '';
for I := 1 to 30000do
S := S + '中';
Form1.Caption := IntToStr(GetTickCount - T);
ShowMessage(Copy(S, 1, 10));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
I, T: Integer;
S: WideString;
P: WideString;
begin
T := GetTickCount;
SetLength(S, 30000);
P := '中';
for I := 1 to 30000do
Move(PWideChar(P)^, S, SizeOf(WideChar));
Form1.Caption := IntToStr(GetTickCount - T);
ShowMessage(Copy(S, 1, 10));
end;
 
为了突显差距,我把字符串长度加大到30000000;用毫秒显示
//楼主的方法
procedure TForm1.Button1Click(Sender: TObject);
var
I,T:Integer;
S:WideString;
begin
SetLength(S,30000000);
S:='';
T:=GetTickCount;
for I:=1 to 30000000do
S:=S+'中';
Form1.Caption:=FloatToStr((GetTickCount-T));
end;

//一楼的方法
procedure TForm1.Button3Click(Sender: TObject);
var
I, T: Integer;
S: WideString;
P: WideString;
begin
T := GetTickCount;
SetLength(S, 30000000);
P := '中';
for I := 1 to 30000000do
Move(PWideChar(P)^, S, SizeOf(WideChar));
Form1.Caption := IntToStr(GetTickCount - T);
//ShowMessage(Copy(S, 1, 10));
end;

//我的方法
procedure TForm1.Button2Click(Sender: TObject);
var
I,T:Integer;
F:WideString;
S:WideString;
begin

SetLength(S,30000000);
T:=GetTickCount;
F := '中';
for I:=1 to 30000000do
S := F[1];
Form1.Caption:=FloatToStr((GetTickCount-T));
end;
 
实际上,这个串是不知道长度的,需要在数据库中读入数据,字段之间用#9分开,每条数据间用#9#9分开,然后把这个串传入其它程序,事先没办法SetLength的。
如:
姓名    年龄    地址
张三    25     北京
李四    30     上海
串应该是:
'张三' + #9 + '25' + #9 + '北京' + #9#9 + '李四' + #9 + '30' + #9 +'上海'
怎样能最快的生成这个串呢?
 
用流的方式来写,避免每次s:=S+XXXX的迭代,每次都会重新分配S,并拷贝内存.
比如用TStringStream
 
var
S:TStringStream;
I,T:Integer;
begin
S:=TStringStream.Create('');
try
T:=GetTickCount;
for I:=1 to 100000do
S.Write('中华人民共和国',14);
S.Position:=0;
Caption:=S.ReadString(14*100000);
finally
FreeAndNil(S);
end;
//Form1.Caption:=FloatToStr((GetTickCount-T)/1000);
end;
循环在10000以内时成功,循环在100000时,失败,这样可不行啊!
 
用流的方式似乎没有二楼的方式快
 
多人接受答案了。
 
后退
顶部