5 ms·
I was under the impression that most large projects end up having to write a custom memory allocator, but after a few random probes into the source I didn't see
by afhof 15y ago
I was under the impression that most large projects end up having to write a custom memory allocator, but after a few random probes into the source I didn't see anything that stood out. Did I just miss it, or did they use the built in one?
- ars 15y agoWhy do you have that impression? That makes very little sense to do - every single project? Don't you think someone would have released a library to implement the "new and improved allocator" if everyone needs to use it?
- vilya 15y agoThat has been borne out by my experience so far too. There have been several successful efforts at writing better performing general-purpose allocators: * TCMalloc (http://goog-perftools.sourceforge.net/doc/tcmalloc.html) * jemalloc (http://www.canonware.com/jemalloc/) There's a great Facebook Engineering blog post about jemalloc which describes why a fast allocator is needed & why the standard malloc is not always sufficient: https://www.facebook.com/notes/facebook-engineering/scalable-memory-allocation-using-jemalloc/480222803919 https://www.facebook.com/notes/facebook-engineering/scalable...
- forrestthewoods 15y agoI've worked with several projects where a TCMalloc based allocator (threaded) was used to great success. A simple switch to DLMalloc (non-threaded) can also provide a significant performance boost. Moderate usage of STL can do nasty, nasty things to memory performance. In one case a game I worked on ran at 5-10fps and a simple, fast change to DLMalloc instantly took perf to 60fps.
- caf 15y agoIt's worth noting that at least on some platforms the system malloc is dlmalloc (presuming that DL is Doug Lea).
- vetler 15y ago+1 for TCMalloc. We used TCMalloc at Opera Community[0], and they still might be using it there for all I know ... it greatly improved performance on our MySQL servers! [0]: http://my.opera.com/ http://my.opera.com/
- anaisbetts 15y agoMost game projects do end up having to write a custom allocator, due to very specific memory budgets, deterministic malloc/free perf requirements, and issues with fragmentation.
- danssig 15y agoNo, the point of a custom allocator is writing one that works with your specific requirements. A general allocator will never be more efficient than a custom one designed for the specific task. It becomes just an issue of is the cost worth what the optimization buys you, and games are an area where you need every drop of speed you can get.
- barrybe 15y agoThere's one here: https://github.com/TTimo/doom3.gpl/blob/master/neo/idlib/Heap.cpp https://github.com/TTimo/doom3.gpl/blob/master/neo/idlib/Hea... Surprisingly there's not a lot of platform-specific cruft in that code. The Xbox version of Doom3 must have been a separate code branch.
- deleted 15y ago[deleted]
- justinhj 15y agothe xbox version was done by another activision studio called vicarious visions. no xbox or playstation code can be released due to developer license agreements
- deleted 15y ago[deleted]
- gurkendoktor 15y agoQuake 2 didn't have its own memory allocator either. Maybe the system allocator(s) got better with the years. http://fabiensanglard.net/quake2/index.php http://fabiensanglard.net/quake2/index.php
- klodolph 15y agoI don't know which Quake 2 you are looking at. Do a code search for Z_TagMalloc and Hunk_Alloc.
- gurkendoktor 15y agoTo quote the review (which I've read more than the source): The Zone Memory Allocator(common.c: Z_Malloc, Z_Free, Z_TagMalloc , Z_FreeTags) is still here in Quake2 but it is pretty much useless: Tagging is never used and allocation/deallocation is build on top of malloc and free (I have no idea why id software decided to trust the C Standard Library at this point). The overflow detector (using the Z_MAGIC contant) is never used either. So, unless I totally misunderstand things, it is half C stdlib, half Hunk allocator?
- mohaps 15y agoidlib/Heap.h and idlib/Heap.cpp implement a replacement malloc/free. From the header comments: /* =============================================================================== Memory Management This is a replacement for the compiler heap code (i.e. "C" malloc() and free() calls). On average 2.5-3.0 times faster than MSVC malloc()/free(). Worst case performance is 1.65 times faster and best case > 70 times. =============================================================================== */