Fast GC allocation of many small objects

Alexandru Jercaianu alex.jercaianu at gmail.com
Fri Mar 30 23:11:32 UTC 2018


On Friday, 30 March 2018 at 23:09:33 UTC, Alexandru Jercaianu 
wrote:
> On Friday, 30 March 2018 at 20:46:43 UTC, Per Nordlöw wrote:
>> On Friday, 30 March 2018 at 20:38:35 UTC, rikki cattermole 
>> wrote:
>>> Use a custom allocator (that could be backed by the GC) using 
>>> std.experimental.allocators :)
>>
>> https://dlang.org/phobos/std_experimental_allocator.html
>>
>> is massive.
>>
>> I guess I should allocate my nodes using
>>
>>     auto node = theAllocator.make!StrNode("alpha");
>>
>> Could someone please give a working example of a GC-backed 
>> `theAllocator` suitable for my allocation pattern?
>
> Hello,
>
> You can try the following:
>     struct Node
>     {
>         char[64] arr;
>     }
>
>      enum numNodes = 100_000_000;
>      void[] buf = GCAllocator.instance.allocate(numNodes * 
> Node.sizeof);
>      auto reg = Region!(NullAllocator, 16)(cast(ubyte[])buf);
>
>      foreach(i; 0 .. numNodes)
>      {
>          Node* n = cast(Node*)(reg.allocate(Node.sizeof).ptr);
>          // do stuff with the new node
>      }
>
> I benchmarked this versus
>      foreach(i; 0 .. numNodes)
>      {
>          auto n = new Node;
>          // do stuff...
>      }
>
> The first approach was about 30% faster.

Sorry, I forgot to add which imports you need:

  import std.experimental.allocator.gc_allocator;
  import std.experimental.allocator.building_blocks.region;
  import std.experimental.allocator.building_blocks.null_allocator;


More information about the Digitalmars-d-learn mailing list