* more moderate growing for large collections, Mantis .

git-svn-id: trunk@40214 -
This commit is contained in:
marco 2018-11-03 22:56:09 +00:00
parent a1904a055c
commit cf4496aa1e
2 changed files with 37 additions and 6 deletions
packages/fcl-stl/src

View File

@ -146,13 +146,29 @@ begin
end;
procedure TDeque.IncreaseCapacity;inline;
var i,OldEnd:SizeUInt;
const
// if size is small, multiply by 2;
// if size bigger but <256M, inc by 1/8*size;
// otherwise inc by 1/16*size
cSizeSmall = 1*1024*1024;
cSizeBig = 256*1024*1024;
var
i,OldEnd,
DataSize:SizeUInt;
begin
OldEnd:=FCapacity;
if(FCapacity=0) then
FCapacity:=1
DataSize:=FCapacity*SizeOf(T);
if FCapacity=0 then
FCapacity:=4
else
FCapacity:=FCapacity*2;
if DataSize<cSizeSmall then
FCapacity:=FCapacity*2
else
if DataSize<cSizeBig then
FCapacity:=FCapacity+FCapacity div 8
else
FCapacity:=FCapacity+FCapacity div 16;
SetLength(FData, FCapacity);
if (FStart>0) then
for i:=0 to FStart-1 do

View File

@ -157,11 +157,26 @@ begin
end;
procedure TVector.IncreaseCapacity();
const
// if size is small, multiply by 2;
// if size bigger but <256M, inc by 1/8*size;
// otherwise inc by 1/16*size
cSizeSmall = 1*1024*1024;
cSizeBig = 256*1024*1024;
var
DataSize:SizeUInt;
begin
DataSize:=FCapacity*SizeOf(T);
if FCapacity=0 then
FCapacity:=1
FCapacity:=4
else
FCapacity:=FCapacity*2;
if DataSize<cSizeSmall then
FCapacity:=FCapacity*2
else
if DataSize<cSizeBig then
FCapacity:=FCapacity+FCapacity div 8
else
FCapacity:=FCapacity+FCapacity div 16;
SetLength(FData, FCapacity);
end;