From: Eric Wong <e@80x24.org>
To: mwrap-perl@80x24.org
Subject: [RFC] dlmalloc: use jemalloc-inspired size classes
Date: Mon, 1 Apr 2024 08:25:58 +0000 [thread overview]
Message-ID: <20240401082558.2755919-1-e@80x24.org> (raw)
For allocations too small for direct mmap and too large for
fastbins, use jemalloc-inspired size classes to reduce
fragmentation. This means mid-sized allocations pay a 0-20%
overhead to improve the likelyhood of having a good fit
over repeated allocations and frees.
---
dlmalloc_c.h | 32 ++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)
diff --git a/dlmalloc_c.h b/dlmalloc_c.h
index e842a53..7193982 100644
--- a/dlmalloc_c.h
+++ b/dlmalloc_c.h
@@ -2239,7 +2239,7 @@ typedef unsigned int flag_t; /* The type of various bit flag sets */
/* pad request, checking for minimum (but not maximum) */
#define request2size(req) \
- (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
+ (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(size_class_pad(req)))
/* ------------------ Operations on head and foot fields ----------------- */
@@ -4899,6 +4899,34 @@ static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb,
return newp;
}
+static size_t size_align_(size_t size, size_t alignment)
+{
+ return ((size + (alignment - 1)) & ~(alignment - 1));
+}
+
+static inline size_t size_class_pad(size_t bytes)
+{
+ if (bytes <= MAX_SMALL_REQUEST || bytes >= MAX_REQUEST)
+ return bytes;
+ /*
+ * Use jemalloc-inspired size classes for mid-size allocations to
+ * minimize fragmentation. This means we pay a 0-20% overhead on
+ * the initial allocations to improve the likelyhood of reuse.
+ */
+ size_t max = 256;
+ size_t nxt;
+ size_t mmap_threshold = mparams.mmap_threshold;
+ do {
+ if (bytes <= max) {
+ size_t sc_bytes = size_align_(bytes, max >> 3);
+ return sc_bytes <= mmap_threshold ? sc_bytes : bytes;
+ }
+ nxt = max << 1;
+ } while (nxt > max && max < mmap_threshold && (max = nxt));
+
+ return bytes;
+}
+
static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
void* mem = 0;
if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
@@ -5573,7 +5601,7 @@ void* mspace_malloc(mspace msp, size_t bytes) {
else if (bytes >= MAX_REQUEST)
nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
else {
- nb = pad_request(bytes);
+ nb = pad_request(size_class_pad(bytes));
if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
check_malloced_chunk(ms, mem, nb);
goto postaction;
next reply other threads:[~2024-04-01 8:25 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-01 8:25 Eric Wong [this message]
2024-04-01 8:40 ` [RFC] dlmalloc: use jemalloc-inspired size classes Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240401082558.2755919-1-e@80x24.org \
--to=e@80x24.org \
--cc=mwrap-perl@80x24.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mwrap-perl.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).