Am 2017-04-13 um 13:17 schrieb MARCOU Gilles:
> Regarding this code:
>> SetLength(Array,Length(Array)+1);
>> Array[High(Array)] := …
> as I understood from (http://wiki.freepascal.org/Dynamic_array),
> SetLength will create a copy of the array and free the memory of the shorter 
array.
> In this case, a lot of memory operations and copy operations are performed 
thus
> degrading the performances of the code. Then it would be unwise to use such 
strategy:
> better allocate the size of the array correctly at the beginning of the run,
> or resize the array by block, to decrease the frequency of such operation:

Yes, that's my knowledge about dynamic arrays too.
Although it *can* happen that the array is not copied
(see answer mail from Sven) in general it will (is forced to)
allocate a new (larger) memory chunk and copy the data over to it.
This is IMO unavoidable if the existing memory area cannot be extended.

There are 2 strategies against it:

1.) If you already know the correct size at the end of an operation you can 
simply create the array with the final size in the first place.

2.) If you know that the array will be extended many times but you do not know 
in prior what the final size is,
then you can extend the array in larger slices (16, 32 or whatever).
Then, if the final size is reached, you can remove empty elements with
SetLength(Array,FinalSize);

But very often the performance degrade of Setlength is overvalued.
If the Length variation is done only seldom (compared to other code)
then it's not worth thinking about such optimizations.

Also, I often have dynamic arrays of pointers (strings or other managed types).
In this case the array elements consists of pointers and only the pointers will 
be copied
but not the data they point to.

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to