public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin/main] Cygwin: cygheap: compute bucket instead of looping over it
@ 2024-03-01 21:37 Corinna Vinschen
  0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2024-03-01 21:37 UTC (permalink / raw)
  To: cygwin-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=abb532a87ff6ed37f6ee2c8a58c65178a15aa345

commit abb532a87ff6ed37f6ee2c8a58c65178a15aa345
Author:     Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Fri Mar 1 22:27:40 2024 +0100
Commit:     Corinna Vinschen <corinna@vinschen.de>
CommitDate: Fri Mar 1 22:35:22 2024 +0100

    Cygwin: cygheap: compute bucket instead of looping over it
    
    Start at index 0 and use 32 bytes as minimal allocation size.
    Reduce NBUCKETS, we don't have such big objects on the
    cygheap anyway.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/local_includes/cygheap.h |  2 +-
 winsup/cygwin/mm/cygheap.cc            | 20 ++++++++++++--------
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/winsup/cygwin/local_includes/cygheap.h b/winsup/cygwin/local_includes/cygheap.h
index b6acdf7f18b7..9edd61c28abd 100644
--- a/winsup/cygwin/local_includes/cygheap.h
+++ b/winsup/cygwin/local_includes/cygheap.h
@@ -487,7 +487,7 @@ struct mini_cygheap
   cygheap_locale locale;
 };
 
-#define NBUCKETS 40
+#define NBUCKETS 32
 
 struct threadlist_t
 {
diff --git a/winsup/cygwin/mm/cygheap.cc b/winsup/cygwin/mm/cygheap.cc
index c763a0967388..4cc851716fbe 100644
--- a/winsup/cygwin/mm/cygheap.cc
+++ b/winsup/cygwin/mm/cygheap.cc
@@ -264,15 +264,15 @@ init_cygheap::init_installation_root ()
 
 /* Initialize bucket_val.  The value is the max size of a block
    fitting into the bucket.  The values are powers of two and their
-   medians: 24, 32, 48, 64, ...
+   medians: 32, 48, 64, 96, ...
    The idea is to have better matching bucket sizes (not wasting
    space) without trading in performance compared to the old powers
    of 2 method. */
 static const uint32_t bucket_val[NBUCKETS] = {
-  0, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048,
-  3072, 4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304,
-  131072, 196608, 262144, 393216, 524288, 786432, 1048576, 1572864, 2097152,
-  3145728, 4194304, 6291456, 8388608, 12582912
+  32, 48, 64, 96, 128, 192, 256, 384,
+  512, 768, 1024, 1536, 2048, 3072, 4096, 6144,
+  8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304,
+  131072, 196608, 262144, 393216, 524288, 786432, 1048576, 1572864
 };
 
 void
@@ -355,11 +355,15 @@ static void *
 _cmalloc (unsigned size)
 {
   _cmalloc_entry *rvc;
-  unsigned b;
+  unsigned b = 0;
 
   /* Calculate "bit bucket". */
-  for (b = 1; b < NBUCKETS && bucket_val[b] < size; b++)
-    continue;
+  if (size > bucket_val[0])
+    {
+      const unsigned clz = __builtin_clzl (size - 1);
+      b = (59 - clz) << 1;
+      b -= !((size - 1) & (1 << (62 - clz)));
+    }
   if (b >= NBUCKETS)
     return NULL;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-03-01 21:37 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-01 21:37 [newlib-cygwin/main] Cygwin: cygheap: compute bucket instead of looping over it Corinna Vinschen

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