zub писал(а):Проверку на нулевую длину никто не отменял.
Так длиннее. >_< Ну окей.
Тоже написал бенчмарк. В цикле соединяются по 3 строки, результат заведомо умещается в 255 символов.
- Код: Выделить всё
{$mode objfpc}
{$coperators+}
{$macro+}
uses
SysUtils, DateUtils;
function RandomString: ansistring;
const
MinLen = 10;
var
i: SizeUint;
begin
SetLength(result, MinLen + random((256 - MinLen) div 3));
for i := 1 to length(result) do
result[i] := chr(ord('a') + random(ord('z') - ord('a') + 1));
end;
const
NStrings = 1000000;
Iterations = 15;
var
ss: array[0 .. NStrings - 1] of shortstring;
ss_concat: array[0 .. (NStrings + 1) div 3 - 1] of shortstring;
ls: array[0 .. NStrings - 1] of ansistring;
ls_concat: array[0 .. (NStrings + 1) div 3 - 1] of ansistring;
i, ci, iteration: integer;
dt: TDateTime;
ms: integer;
begin
write('Generating... (1/2) ');
for i := Low(ss) to High(ss) do
begin
ss[i] := RandomString;
if (i + 1) mod (length(ss) div 10) = 0 then write('#');
end;
writeln;
write(' (2/2) ');
for i := Low(ls) to High(ls) do
begin
ls[i] := RandomString;
if (i + 1) mod (length(ls) div 10) = 0 then write('#');
end;
writeln(' OK');
writeln;
{$define test :=
write('Testing ' + typename + '... ');
dt := Now;
for iteration := 0 to Iterations - 1 do
begin
i := iteration;
ci := 0;
while i + 2 <= High(strings_array) do
begin
concatenated_array[ci] := strings_array[i] + strings_array[i + 1] + strings_array[i + 2];
i += 3;
ci += 1;
end;
end;
ms := MillisecondsBetween(dt, Now);
writeln('avg. ', ms / (NStrings * Iterations) * 1e6:0:2, ' ns');
{$undef typename} {$undef strings_array} {$undef concatenated_array}}
{$define typename := 'ShortString'}
{$define strings_array := ss}
{$define concatenated_array := ss_concat}
test
{$define typename := 'AnsiString'}
{$define strings_array := ls}
{$define concatenated_array := ls_concat}
test
{$undef test}
end.
В худшем случае ansistring медленнее на 35%, в лучшем (достигается, если, например, в RandomString сделать постоянную длину) — вдвое быстрее, в общем, шортстринги себя не оправдывают, единственное преимущество — и то спорное.