<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[173538] trunk/Source/bmalloc</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/173538">173538</a></dd>
<dt>Author</dt> <dd>ggaren@apple.com</dd>
<dt>Date</dt> <dd>2014-09-11 13:58:02 -0700 (Thu, 11 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>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):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourcebmallocChangeLog">trunk/Source/bmalloc/ChangeLog</a></li>
<li><a href="#trunkSourcebmallocbmallocAllocatorcpp">trunk/Source/bmalloc/bmalloc/Allocator.cpp</a></li>
<li><a href="#trunkSourcebmallocbmallocAllocatorh">trunk/Source/bmalloc/bmalloc/Allocator.h</a></li>
<li><a href="#trunkSourcebmallocbmallocSizesh">trunk/Source/bmalloc/bmalloc/Sizes.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourcebmallocChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/ChangeLog (173537 => 173538)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/ChangeLog        2014-09-11 20:54:35 UTC (rev 173537)
+++ trunk/Source/bmalloc/ChangeLog        2014-09-11 20:58:02 UTC (rev 173538)
</span><span class="lines">@@ -1,5 +1,31 @@
</span><span class="cx"> 2014-09-11  Geoffrey Garen  &lt;ggaren@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        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  &lt;ggaren@apple.com&gt;
+
</ins><span class="cx">         Reviewed by Sam Weinig.
</span><span class="cx"> 
</span><span class="cx">         Renamed log =&gt; retire for clarity.
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocAllocatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/Allocator.cpp (173537 => 173538)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/Allocator.cpp        2014-09-11 20:54:35 UTC (rev 173537)
+++ trunk/Source/bmalloc/bmalloc/Allocator.cpp        2014-09-11 20:58:02 UTC (rev 173538)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx"> Allocator::Allocator(Deallocator&amp; deallocator)
</span><span class="cx">     : m_deallocator(deallocator)
</span><span class="cx">     , m_smallAllocators()
</span><del>-    , m_mediumAllocator()
</del><ins>+    , m_mediumAllocators()
</ins><span class="cx">     , m_smallAllocatorLog()
</span><span class="cx">     , m_mediumAllocatorLog()
</span><span class="cx"> {
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx"> {
</span><span class="cx">     scavenge();
</span><span class="cx"> }
</span><del>-    
</del><ins>+
</ins><span class="cx"> void Allocator::scavenge()
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; allocator : m_smallAllocators) {
</span><span class="lines">@@ -62,8 +62,10 @@
</span><span class="cx">     }
</span><span class="cx">     processSmallAllocatorLog();
</span><span class="cx"> 
</span><del>-    retire(m_mediumAllocator);
-    m_mediumAllocator.clear();
</del><ins>+    for (auto&amp; allocator : m_mediumAllocators) {
+        retire(allocator);
+        allocator.clear();
+    }
</ins><span class="cx">     processMediumAllocatorLog();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -129,7 +131,7 @@
</span><span class="cx"> 
</span><span class="cx"> void* Allocator::allocateMedium(size_t size)
</span><span class="cx"> {
</span><del>-    MediumAllocator&amp; allocator = m_mediumAllocator;
</del><ins>+    MediumAllocator&amp; allocator = m_mediumAllocators[mediumSizeClassFor(size)];
</ins><span class="cx">     size = roundUpToMultipleOf&lt;alignment&gt;(size);
</span><span class="cx"> 
</span><span class="cx">     void* object;
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocAllocatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/Allocator.h (173537 => 173538)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/Allocator.h        2014-09-11 20:54:35 UTC (rev 173537)
+++ trunk/Source/bmalloc/bmalloc/Allocator.h        2014-09-11 20:58:02 UTC (rev 173538)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">     Deallocator&amp; m_deallocator;
</span><span class="cx"> 
</span><span class="cx">     std::array&lt;SmallAllocator, smallMax / alignment&gt; m_smallAllocators;
</span><del>-    MediumAllocator m_mediumAllocator;
</del><ins>+    std::array&lt;MediumAllocator, mediumMax / alignment&gt; m_mediumAllocators;
</ins><span class="cx"> 
</span><span class="cx">     FixedVector&lt;std::pair&lt;SmallLine*, unsigned char&gt;, smallAllocatorLogCapacity&gt; m_smallAllocatorLog;
</span><span class="cx">     FixedVector&lt;std::pair&lt;MediumLine*, unsigned char&gt;, mediumAllocatorLogCapacity&gt; m_mediumAllocatorLog;
</span></span></pre></div>
<a id="trunkSourcebmallocbmallocSizesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/bmalloc/bmalloc/Sizes.h (173537 => 173538)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/bmalloc/bmalloc/Sizes.h        2014-09-11 20:54:35 UTC (rev 173537)
+++ trunk/Source/bmalloc/bmalloc/Sizes.h        2014-09-11 20:58:02 UTC (rev 173538)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">     static const size_t largeAlignmentShift = 6;
</span><span class="cx">     static_assert(1 &lt;&lt; largeAlignmentShift == largeAlignment, &quot;largeAlignmentShift be log2(largeAlignment).&quot;);
</span><span class="cx">     static const size_t largeMax = largeChunkSize * 99 / 100; // Plenty of room for metadata.
</span><del>-    static const size_t largeMin = 1024;
</del><ins>+    static const size_t largeMin = mediumMax;
</ins><span class="cx"> 
</span><span class="cx">     static const size_t segregatedFreeListSearchDepth = 16;
</span><span class="cx"> 
</span><span class="lines">@@ -97,6 +97,12 @@
</span><span class="cx">         static const size_t smallSizeClassMask = (smallMax / alignment) - 1;
</span><span class="cx">         return mask((size - 1ul) / alignment, smallSizeClassMask);
</span><span class="cx">     }
</span><ins>+
+    inline size_t mediumSizeClassFor(size_t size)
+    {
+        static const size_t mediumSizeClassMask = (mediumMax / alignment) - 1;
+        return mask((size - 1ul) / alignment, mediumSizeClassMask);
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> using namespace Sizes;
</span></span></pre>
</div>
</div>

</body>
</html>