<!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>[195575] trunk/Source/JavaScriptCore</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/195575">195575</a></dd>
<dt>Author</dt> <dd>akling@apple.com</dd>
<dt>Date</dt> <dd>2016-01-25 18:57:51 -0800 (Mon, 25 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>MarkedSpace should have more precise allocators.
&lt;https://webkit.org/b/153448&gt;
&lt;rdar://problem/23897477&gt;

Reviewed by Geoffrey Garen.

The four classes responsible for the bulk of MarkedBlock allocations today are:

    - FunctionCodeBlock (640 bytes)
    - UnlinkedFunctionCodeBlock (304 bytes)
    - FunctionExecutable (168 bytes)
    - UnlinkedFunctionExecutable (144 bytes)

Due to the size class distribution in MarkedSpace, we've been wasting quite a lot
of heap space on these objects. Our &quot;precise&quot; allocators allowed allocation sizes
in 16-byte increments up to 128 bytes, but after that point, we'd only allocate
in 256-byte size increments.

Thus each instance of those classes would waste space as follows:

    - FunctionCodeBlock (768-byte cell, 128 bytes wasted)
    - UnlinkedFunctionCodeBlock (512-byte cell, 208 bytes wasted)
    - FunctionExecutable(256-byte cell, 88 bytes wasted)
    - UnlinkedFunctionExecutable(256-byte cell, 112 bytes wasted)

This patch raises the limit for precise allocations from 128 to 768, allowing us
to allocate these objects with far better space efficiency.

The cost of this is 7kB worth of MarkedAllocators and 70 (~2x) more allocators to
iterate whenever we iterate all the allocators.

* heap/MarkedSpace.h:
* heap/MarkedSpace.cpp:
(JSC::MarkedSpace::MarkedSpace):
(JSC::MarkedSpace::resetAllocators):
(JSC::MarkedSpace::forEachAllocator):
(JSC::MarkedSpace::isPagedOut):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedSpacecpp">trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedSpaceh">trunk/Source/JavaScriptCore/heap/MarkedSpace.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (195574 => 195575)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-01-26 02:18:13 UTC (rev 195574)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-01-26 02:57:51 UTC (rev 195575)
</span><span class="lines">@@ -1,3 +1,43 @@
</span><ins>+2016-01-25  Andreas Kling  &lt;akling@apple.com&gt;
+
+        MarkedSpace should have more precise allocators.
+        &lt;https://webkit.org/b/153448&gt;
+        &lt;rdar://problem/23897477&gt;
+
+        Reviewed by Geoffrey Garen.
+
+        The four classes responsible for the bulk of MarkedBlock allocations today are:
+
+            - FunctionCodeBlock (640 bytes)
+            - UnlinkedFunctionCodeBlock (304 bytes)
+            - FunctionExecutable (168 bytes)
+            - UnlinkedFunctionExecutable (144 bytes)
+
+        Due to the size class distribution in MarkedSpace, we've been wasting quite a lot
+        of heap space on these objects. Our &quot;precise&quot; allocators allowed allocation sizes
+        in 16-byte increments up to 128 bytes, but after that point, we'd only allocate
+        in 256-byte size increments.
+
+        Thus each instance of those classes would waste space as follows:
+
+            - FunctionCodeBlock (768-byte cell, 128 bytes wasted)
+            - UnlinkedFunctionCodeBlock (512-byte cell, 208 bytes wasted)
+            - FunctionExecutable(256-byte cell, 88 bytes wasted)
+            - UnlinkedFunctionExecutable(256-byte cell, 112 bytes wasted)
+
+        This patch raises the limit for precise allocations from 128 to 768, allowing us
+        to allocate these objects with far better space efficiency.
+
+        The cost of this is 7kB worth of MarkedAllocators and 70 (~2x) more allocators to
+        iterate whenever we iterate all the allocators.
+
+        * heap/MarkedSpace.h:
+        * heap/MarkedSpace.cpp:
+        (JSC::MarkedSpace::MarkedSpace):
+        (JSC::MarkedSpace::resetAllocators):
+        (JSC::MarkedSpace::forEachAllocator):
+        (JSC::MarkedSpace::isPagedOut):
+
</ins><span class="cx"> 2016-01-25  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix the comment about FTL_USES_B3.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedSpacecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp (195574 => 195575)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp        2016-01-26 02:18:13 UTC (rev 195574)
+++ trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp        2016-01-26 02:57:51 UTC (rev 195575)
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx">         destructorAllocatorFor(cellSize).init(heap, this, cellSize, true);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</del><ins>+    for (size_t cellSize = impreciseStart; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</ins><span class="cx">         allocatorFor(cellSize).init(heap, this, cellSize, false);
</span><span class="cx">         destructorAllocatorFor(cellSize).init(heap, this, cellSize, true);
</span><span class="cx">     }
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx">         destructorAllocatorFor(cellSize).reset();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</del><ins>+    for (size_t cellSize = impreciseStart; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</ins><span class="cx">         allocatorFor(cellSize).reset();
</span><span class="cx">         destructorAllocatorFor(cellSize).reset();
</span><span class="cx">     }
</span><span class="lines">@@ -154,7 +154,7 @@
</span><span class="cx">         functor(destructorAllocatorFor(cellSize));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</del><ins>+    for (size_t cellSize = impreciseStart; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</ins><span class="cx">         functor(allocatorFor(cellSize));
</span><span class="cx">         functor(destructorAllocatorFor(cellSize));
</span><span class="cx">     }
</span><span class="lines">@@ -191,7 +191,7 @@
</span><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    for (size_t cellSize = impreciseStep; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</del><ins>+    for (size_t cellSize = impreciseStart; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
</ins><span class="cx">         if (allocatorFor(cellSize).isPagedOut(deadline) 
</span><span class="cx">             || destructorAllocatorFor(cellSize).isPagedOut(deadline))
</span><span class="cx">             return true;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedSpaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedSpace.h (195574 => 195575)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2016-01-26 02:18:13 UTC (rev 195574)
+++ trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2016-01-26 02:57:51 UTC (rev 195575)
</span><span class="lines">@@ -67,13 +67,14 @@
</span><span class="cx"> class MarkedSpace {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(MarkedSpace);
</span><span class="cx"> public:
</span><del>-    // [ 16 ... 128 ]
</del><ins>+    // [ 16 ... 768 ]
</ins><span class="cx">     static const size_t preciseStep = MarkedBlock::atomSize;
</span><del>-    static const size_t preciseCutoff = 128;
</del><ins>+    static const size_t preciseCutoff = 768;
</ins><span class="cx">     static const size_t preciseCount = preciseCutoff / preciseStep;
</span><span class="cx"> 
</span><del>-    // [ 256 ... blockSize/2 ]
-    static const size_t impreciseStep = 2 * preciseCutoff;
</del><ins>+    // [ 1024 ... blockSize/2 ]
+    static const size_t impreciseStart = 1024;
+    static const size_t impreciseStep = 256;
</ins><span class="cx">     static const size_t impreciseCutoff = MarkedBlock::blockSize / 2;
</span><span class="cx">     static const size_t impreciseCount = impreciseCutoff / impreciseStep;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>