mwrap (Perl version) user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
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;

             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).