чтобы получилось так:
ss := ss + s1;
Я делаю так:
SetLength(ss, Length(ss) + Length(s1));
Move(s1[1], ss[Length(ss)-Length(s1)], Length(s1));
долго работает
если одна строка - смысла нет, если много - считать общую длину и суммировать
program Project1; {$IFDEF FPC} {$ELSE} {$APPTYPE CONSOLE} {$ENDIF} uses SysUtils; const maxstrings=15000000; var TestData:array[0..maxstrings]of String; s:String; i,len:Integer; myTime:TDateTime; SB:TStringBuilder; begin myTime:=now; for i:=0 to high(TestData) do //setlength(TestData[i],11); TestData[i]:=inttostr(i); writeln(format('Generate strings %.4fsec',[(now-myTime)*10e4])); myTime:=now; len:=0; for i:=0 to high(TestData) do len:=len+length(TestData[i]); setlength(s,len); len:=1; for i:=0 to high(TestData) do begin Move(TestData[i][1],s[len],length(TestData[i])); len:=len+length(TestData[i]); end; //writeln(s); writeln(format('setlength and copy %.4fsec',[(now-myTime)*10e4])); myTime:=now; SB:=TStringBuilder.Create; for i:=0 to high(TestData) do SB.Append(TestData[i]); s:=SB.ToString; SB.Free; //writeln(s); writeln(format('TStringBuilder %.4fsec',[(now-myTime)*10e4])); myTime:=now; s:=''; for i:=0 to high(TestData) do s:=s+TestData[i]; //writeln(s); writeln(format('s:=s+TestData[i]; %.4fsec',[(now-myTime)*10e4])); readln; end.
с мувом быстрее всего
проморгал, для делфи наверно надо length(TestData[i])*sizeof(s[1])
поправь
Generate strings 0.5162sec setlength and copy 0.1944sec TStringBuilder 0.1273sec s:=s+TestData[i]; 0.3438sec
высылай патч)) или пул реквест))
Обсуждают сегодня