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 956e91f..9cbed4c 100644 (file)
@@ -1,5 +1,31 @@
 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.
 
         Renamed log => retire for clarity.
index 85b7f7e..78a2932 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 5f11170..575eced 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 b3bde56..b0c5281 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;