Then swapped that out for a linear allocator, which is most efficient. The single allocation per thread is reset to the first byte at the beginning of each block. It's the same allocation for all blocks on that thread. Then the allocator just provides memory as requested by advancing a pointer. It's single threaded, so this is absolutely trivial and cannot be outperformed.