Re: [fpc-devel] Growing a memory stream
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
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
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
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
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
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
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
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
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