[fpc-pascal] How to avoid Copy
Sven Barth
pascaldragon at googlemail.com
Sat Dec 30 09:20:45 CET 2023
Amir via fpc-pascal <fpc-pascal at lists.freepascal.org> schrieb am Sa., 30.
Dez. 2023, 08:11:
>
>
> On Dec 29, 2023 9:50 PM, Adriaan van Os <adriaan at adriaan.biz> wrote:
>
> Amir--- via fpc-pascal wrote:
> > Hi all,
> >
> > I have a List of record, where the record has a WideString field.
> > I have some code like the following:
> >
> > function check(constref v: TMyRecord; data: TListOfMyRecord): Boolean;
> > var
> > r: TMyRecord;
> >
> > begin
> > Result := False;
> > for r in data do
> > if r.State = v.State then
> > Exit(True);
> > end;
> >
> > I call this method a lot and the CPU profiling shows a lot of cpu time
> > spent on "fpc_copy_proc" (which I assume is doing the deep copy on
> > records) from "TCustomListEnumerator.GetCurrent".
> > I considered other alternatives like using enumerators but they all need
> > a to return a record (and hence copying the widestring field).
> > I can think of two solutions to get rid of the wasting(!) so much time
> > on "fpc_copy_proc":
> > 1) Changing the TMyRecord to TMyClass. But then I need to Create and
> > Free a "lot" of objects.
> > 2) Update TListOfMyRecord to TListOfPointerToMyRecord. This requires a
> > "lot" of memory allocation/fragmentation.
> >
> > Is there a better solution?
>
> Pass the data parameter by reference.
>
> This means I need to have a ListOfMyRecord and a ListOfConstRefMyRecord,
> right?
>
No, that's not a thing.
You simply need to declare your "data" parameter as "constref" or "const"
as well, just like your "v" parameter.
Note: prefer the use of "const" instead of "constref" unless you really
need a reference, because the compiler will then pick the optimal way to
pass the value (e.g. small ones will be passed by register instead of as an
address).
Regards,
Sven
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20231230/705b45b4/attachment-0001.htm>
More information about the fpc-pascal
mailing list