On Saturday, 9 August 2014 at 08:48:37 UTC, Mehrdad wrote:
Hi all,
This is barely relevant to D, but I thought I'd try posting it
here because I thought the audience might be interested. Let me
know if I should post it somewhere else.
Long story short, I wrote my own C++ heap memory manager a
while ago from scratch. First, here's a description:
Cons:
- Average-case performance is somewhat worse than heap managers
provided by the OS or language runtimes
- I'm not quite ready to open-source it yet (partly because I'm
not sure if it's worth licensing commercially vs.
open-sourcing, and partly because I'm not quite confident it's
completely bug-free yet)
Pros:
- It was built from the ground-up to have dependable worst-case
performance, and I think it's *pretty good* and robust under
various allocation patterns
- It keeps metadata entirely separate from data -- so when
allocate a 4KB page of memory, it's not going to allocate an
extra 4KB behind it just to put a "length" field there, which
has given me problems before. (This can reduce the working set
of the process considerably depending on your allocation
granularity.)
- It is alignment-agnostic -- so, it allocates _exactly_ as
much as requested (no performance penalty for this whatsoever)
- It's platform-independent (it's worked on Windows and also on
Linux the few times I tried it) -- it's pretty easy to supply
your own memory manager underneath, too.
- It has a very simple C (and C++) interface:
typedef uintptr_t ManageMemory(
void *context, uintptr_t address, size_t size,
bool deallocate, bool commitment);
extern ManageMemory manage_system_memory;
void *memory_heap_construct(
void *p, ManageMemory *manager, void *context);
void memory_heap_destroy(void *p);
void *memory_heap_allocate(
void *heap, size_t size, void *hint);
void memory_heap_deallocate(
void *heap, void *address, size_t size);
size_t memory_heap_size();
I was basically wondering if had any particular workloads they
were interested in testing this on and giving me feedback on
it. For now I'd give you a .DLL or a .so (though I haven't
redistributed Linux binaries before, so I'd have to figure out
how to do that) and the C/C++ header so you can use it and see
how it is. Maybe you'd find it potentially useful for D too,
but I guess that depends on how well it performs.
Let me know if you're interested.
There is no realloc, move, cpy ?