Browse Source

* more moderate growing for large collections, Mantis #34420.

git-svn-id: trunk@40214 -
marco 6 years ago
parent
commit
cf4496aa1e
2 changed files with 37 additions and 6 deletions
  1. 20 4
      packages/fcl-stl/src/gdeque.pp
  2. 17 2
      packages/fcl-stl/src/gvector.pp

+ 20 - 4
packages/fcl-stl/src/gdeque.pp

@@ -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
+  if DataSize<cSizeSmall then
+    FCapacity:=FCapacity*2
   else
-    FCapacity:=FCapacity*2;
+  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

+ 17 - 2
packages/fcl-stl/src/gvector.pp

@@ -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
+  if DataSize<cSizeSmall then
+    FCapacity:=FCapacity*2
+  else
+  if DataSize<cSizeBig then
+    FCapacity:=FCapacity+FCapacity div 8
   else
-    FCapacity:=FCapacity*2;
+    FCapacity:=FCapacity+FCapacity div 16;
   SetLength(FData, FCapacity);
 end;