Re: [fpc-devel] Growing a memory stream

2006-12-13 Thread Michael Van Canneyt


On Tue, 12 Dec 2006, [EMAIL PROTECTED] wrote:

 Attached patch grows a memory stream by at least a quarter of its original 
 capacity.

Thank you, applied.

Michael.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Growing a memory stream

2006-12-11 Thread Michael Van Canneyt


On Mon, 11 Dec 2006, Vincent Snijders wrote:

 Hi,
 
 Currently the TMemoryStream grows in steps of 4096 bytes.
 
 When writing 10 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 NewCapacity0 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 (Newcapacity0) then
 Raise EStreamError.Create(SMemoryStreamError);
 end;
 end;
 
 What do you think?

I don't see a problem with that. A similar mechanism is used to TStringList.

Michael.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Growing a memory stream

2006-12-11 Thread Micha Nelissen

Vincent Snijders wrote:

Hi,

Currently the TMemoryStream grows in steps of 4096 bytes.


Very nice would be a linked list of 8KB blocks or so, and when you 
access .Memory, then it's copied into an array.


Micha
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Growing a memory stream

2006-12-11 Thread Michael Van Canneyt


On Mon, 11 Dec 2006, Micha Nelissen wrote:

 Vincent Snijders wrote:
  Hi,
  
  Currently the TMemoryStream grows in steps of 4096 bytes.
 
 Very nice would be a linked list of 8KB blocks or so, and when you access
 .Memory, then it's copied into an array.

I think you can create a separate implementation for this, descended from
TCustomMemoryStream ?

Michael.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Growing a memory stream

2006-12-11 Thread Vincent Snijders

Micha Nelissen schreef:

Vincent Snijders wrote:

Hi,

Currently the TMemoryStream grows in steps of 4096 bytes.


Very nice would be a linked list of 8KB blocks or so, and when you 
access .Memory, then it's copied into an array.




A (maybe shortsighted) drawback would be that it doubles the amount of 
needed memory, once for the list and once for the memory pointed to with 
Memory?


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


Re: [fpc-devel] Growing a memory stream

2006-12-11 Thread Micha Nelissen
Vincent Snijders wrote:
 A (maybe shortsighted) drawback would be that it doubles the amount of
 needed memory, once for the list and once for the memory pointed to with
 Memory?

Well, the linked list would be freed (or the first item of it enlarged
to the total size, depending on implementation details).

Micha
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] Growing a memory stream

2006-12-11 Thread Vincent Snijders

Micha Nelissen schreef:

Vincent Snijders wrote:

A (maybe shortsighted) drawback would be that it doubles the amount of
needed memory, once for the list and once for the memory pointed to with
Memory?


Well, the linked list would be freed (or the first item of it enlarged
to the total size, depending on implementation details).


Still, the peak memory use will twice the size, won't it?

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


RE: [fpc-devel] Growing a memory stream

2006-12-11 Thread peter green
  Well, the linked list would be freed (or the first item of it enlarged
  to the total size, depending on implementation details).
 
 Still, the peak memory use will twice the size, won't it?
sure but unless you are very lucky a call to reallocmem also means 
alocate-copy-deallocate. 


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


Re: [fpc-devel] Growing a memory stream

2006-12-11 Thread Vincent Snijders

peter green schreef:

Well, the linked list would be freed (or the first item of it enlarged
to the total size, depending on implementation details).

Still, the peak memory use will twice the size, won't it?
sure but unless you are very lucky a call to reallocmem also means alocate-copy-deallocate. 


That is why I said shortsighted in my initial question :-)

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