Hi,

Currently the TMemoryStream grows in steps of 4096 bytes.

When writing 100000 chunks of say 80 bytes to it, this causes a lot of reallocations. I think it is better to grow at least a quarter for example.

The new code could look something like:
function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;

begin
  // round off to block size.
  If NewCapacity<0 Then
    NewCapacity:=0
  else begin
    if NewCapacity - Capacity < Capacity div 4 then
        NewCapacity := Capacity + Capacity div 4;
    NewCapacity := (NewCapacity + (TMSGrow-1)) and not (TMSGROW-1);
  end;
  // Only now check !
  If NewCapacity=FCapacity then
    Result:=FMemory
  else
    begin
      Result:=Reallocmem(FMemory,Newcapacity);
      If (Result=Nil) and (Newcapacity>0) then
        Raise EStreamError.Create(SMemoryStreamError);
    end;
end;

What do you think?

For background see:
http://www.freepascal.org/mantis/view.php?id=7270

Vincent
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to