[fpc-pascal] How to avoid Copy

Adriaan van Os adriaan at adriaan.biz
Sat Dec 30 06:50:00 CET 2023


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.

Regards,

Adriaan van Os


More information about the fpc-pascal mailing list