bmalloc should segregate medium-sized objects by line like it does for small-sized...
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Sep 2014 20:58:02 +0000 (20:58 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Sep 2014 20:58:02 +0000 (20:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=136693

Reviewed by Gavin Barraclough.

4% reduction in heap size on the MallocBench *_memory_warning benchmarks.

No throughput change.

We keep an array of medium allocators, just like our array of small
allocators.

In future, we can simplify the allocation fast path by merging the small
and medium allocator arrays. For now, this is the simplest change that
gets the win.

* bmalloc/Allocator.cpp:
(bmalloc::Allocator::Allocator):
(bmalloc::Allocator::scavenge):
(bmalloc::Allocator::allocateMedium):
* bmalloc/Allocator.h:
* bmalloc/Sizes.h:
(bmalloc::Sizes::mediumSizeClassFor):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@173538 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/Allocator.cpp
Source/bmalloc/bmalloc/Allocator.h
Source/bmalloc/bmalloc/Sizes.h

index 956e91f1a63d83405f5d8370a7604b92235aedd5..9cbed4c27fcd5904051f6705117df641798c9543 100644 (file)
@@ -1,3 +1,29 @@
+2014-09-11  Geoffrey Garen  <ggaren@apple.com>
+
+        bmalloc should segregate medium-sized objects by line like it does for small-sized objects
+        https://bugs.webkit.org/show_bug.cgi?id=136693
+
+        Reviewed by Gavin Barraclough.
+
+        4% reduction in heap size on the MallocBench *_memory_warning benchmarks.
+
+        No throughput change.
+
+        We keep an array of medium allocators, just like our array of small
+        allocators.
+
+        In future, we can simplify the allocation fast path by merging the small
+        and medium allocator arrays. For now, this is the simplest change that
+        gets the win.
+
+        * bmalloc/Allocator.cpp:
+        (bmalloc::Allocator::Allocator):
+        (bmalloc::Allocator::scavenge):
+        (bmalloc::Allocator::allocateMedium):
+        * bmalloc/Allocator.h:
+        * bmalloc/Sizes.h:
+        (bmalloc::Sizes::mediumSizeClassFor):
+
 2014-09-11  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Sam Weinig.
index 85b7f7e17ba4428bf9670329b3e011c91ea90a90..78a29324695bcdaa44c499c2426fd257a2e2e7b2 100644 (file)
@@ -38,7 +38,7 @@ namespace bmalloc {
 Allocator::Allocator(Deallocator& deallocator)
     : m_deallocator(deallocator)
     , m_smallAllocators()
-    , m_mediumAllocator()
+    , m_mediumAllocators()
     , m_smallAllocatorLog()
     , m_mediumAllocatorLog()
 {
@@ -53,7 +53,7 @@ Allocator::~Allocator()
 {
     scavenge();
 }
-    
+
 void Allocator::scavenge()
 {
     for (auto& allocator : m_smallAllocators) {
@@ -62,8 +62,10 @@ void Allocator::scavenge()
     }
     processSmallAllocatorLog();
 
-    retire(m_mediumAllocator);
-    m_mediumAllocator.clear();
+    for (auto& allocator : m_mediumAllocators) {
+        retire(allocator);
+        allocator.clear();
+    }
     processMediumAllocatorLog();
 }
 
@@ -129,7 +131,7 @@ void* Allocator::allocateXLarge(size_t size)
 
 void* Allocator::allocateMedium(size_t size)
 {
-    MediumAllocator& allocator = m_mediumAllocator;
+    MediumAllocator& allocator = m_mediumAllocators[mediumSizeClassFor(size)];
     size = roundUpToMultipleOf<alignment>(size);
 
     void* object;
index 5f111700caf9a260c4999fa0036ca83da964f899..575eced59dd151da82a47ea897d09bd0c829a50d 100644 (file)
@@ -65,7 +65,7 @@ private:
     Deallocator& m_deallocator;
 
     std::array<SmallAllocator, smallMax / alignment> m_smallAllocators;
-    MediumAllocator m_mediumAllocator;
+    std::array<MediumAllocator, mediumMax / alignment> m_mediumAllocators;
 
     FixedVector<std::pair<SmallLine*, unsigned char>, smallAllocatorLogCapacity> m_smallAllocatorLog;
     FixedVector<std::pair<MediumLine*, unsigned char>, mediumAllocatorLogCapacity> m_mediumAllocatorLog;
index b3bde5680fbd48727d4c4622c56d0d7d98a5b0c1..b0c52816afde3331e1dfdf0c698489085a6dbe2c 100644 (file)
@@ -71,7 +71,7 @@ namespace Sizes {
     static const size_t largeAlignmentShift = 6;
     static_assert(1 << largeAlignmentShift == largeAlignment, "largeAlignmentShift be log2(largeAlignment).");
     static const size_t largeMax = largeChunkSize * 99 / 100; // Plenty of room for metadata.
-    static const size_t largeMin = 1024;
+    static const size_t largeMin = mediumMax;
 
     static const size_t segregatedFreeListSearchDepth = 16;
 
@@ -97,6 +97,12 @@ namespace Sizes {
         static const size_t smallSizeClassMask = (smallMax / alignment) - 1;
         return mask((size - 1ul) / alignment, smallSizeClassMask);
     }
+
+    inline size_t mediumSizeClassFor(size_t size)
+    {
+        static const size_t mediumSizeClassMask = (mediumMax / alignment) - 1;
+        return mask((size - 1ul) / alignment, mediumSizeClassMask);
+    }
 };
 
 using namespace Sizes;