Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2024-11

GetMem slow in threads

2 messages · 2 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Hairy Pixels

I diagnosed a threading performance problem down to merely calling GetMem. I did a test and it was 4x slower to call GetMem on 8 threads (my computer core count) than one thread. Due the large amount of allocations in the program it was actually slower to multithread the task.

I assume the problem is a mutex blocking the threads right?

The solution would be to be to use a different allocator but because FPC only allows overriding NewInstance per class it would be mean you would need a mutex anyway to control which allocator was used depending on the thread.

Maybe a threadvar could be used to get the allocator for the class type? I haven’t tried but I know there’s a penalty to use that too and it may wipe out of the gains again. I’m not sure what a threadvar is though or how it’s implemented just that the docs say it could be slow.

Any ideas would be appreciated.

Regards,
Ryan Joseph

Reply by email

Marco van de Voort
to Hairy Pixels

Op 9-11-2024 om 14:59 schreef Hairy Pixels via fpc-pascal:

Show quoted text 12 lines
The solution would be to be to use a different allocator but because FPC only allows overriding NewInstance per class it would be mean you would need a mutex anyway to control which allocator was used depending on the thread. Maybe a threadvar could be used to get the allocator for the class type? I haven’t tried but I know there’s a penalty to use that too and it may wipe out of the gains again. I’m not sure what a threadvar is though or how it’s implemented just that the docs say it could be slow. Any ideas would be appreciated.

Afaik the FPC heapmanager's design is to avoid that lock too frequently and have a small per thread heap. This can get frustrated when you do a lot of allocating in one thread, and releasing into another.

Reply by email