<!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>[201314] trunk/Source/WTF</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/201314">201314</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2016-05-23 19:10:16 -0700 (Mon, 23 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Speed up move of vectors of POD types that have an inline buffer
https://bugs.webkit.org/show_bug.cgi?id=158003

Reviewed by Benjamin Poulain.

When moving a vector of POD types that have an inline buffer, we would
call std::swap() on the inline buffers. This unnecessarily slow because:
1. It does not consider the vector size, and therefore may end up doing
   more work than necessary when the inline buffer is not full.
2. In the &quot;move&quot; case, the destination buffer is completely empty so
   we don't really want a swap. We merely want the move the content of
   the source's inline buffer into the destination's one.

Instead of calling std::swap(), we now call swapInlineBuffers() which
was already used for non-POD types. swapInlineBuffers() will do just
what we want in the &quot;move&quot; case because swapBound is going to be 0.
As a result, we will only move the content of the source buffer into
the destination one. Also swapInlineBuffers() is aware of the source
vector's size so it will only move what's strictly needed.

This seems to be a 2% progression on Dromaeo DOM attributes test.

* wtf/Vector.h:
(WTF::VectorBuffer::swapInlineBuffer):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfVectorh">trunk/Source/WTF/wtf/Vector.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (201313 => 201314)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-05-24 01:54:51 UTC (rev 201313)
+++ trunk/Source/WTF/ChangeLog        2016-05-24 02:10:16 UTC (rev 201314)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2016-05-23  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Speed up move of vectors of POD types that have an inline buffer
+        https://bugs.webkit.org/show_bug.cgi?id=158003
+
+        Reviewed by Benjamin Poulain.
+
+        When moving a vector of POD types that have an inline buffer, we would
+        call std::swap() on the inline buffers. This unnecessarily slow because:
+        1. It does not consider the vector size, and therefore may end up doing
+           more work than necessary when the inline buffer is not full.
+        2. In the &quot;move&quot; case, the destination buffer is completely empty so
+           we don't really want a swap. We merely want the move the content of
+           the source's inline buffer into the destination's one.
+
+        Instead of calling std::swap(), we now call swapInlineBuffers() which
+        was already used for non-POD types. swapInlineBuffers() will do just
+        what we want in the &quot;move&quot; case because swapBound is going to be 0.
+        As a result, we will only move the content of the source buffer into
+        the destination one. Also swapInlineBuffers() is aware of the source
+        vector's size so it will only move what's strictly needed.
+
+        This seems to be a 2% progression on Dromaeo DOM attributes test.
+
+        * wtf/Vector.h:
+        (WTF::VectorBuffer::swapInlineBuffer):
+
</ins><span class="cx"> 2016-05-22  Dan Bernstein  &lt;mitz@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Added NSEventMaskMouseMoved to AppKitCompatibilityDeclarations.h.
</span></span></pre></div>
<a id="trunkSourceWTFwtfVectorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Vector.h (201313 => 201314)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Vector.h        2016-05-24 01:54:51 UTC (rev 201313)
+++ trunk/Source/WTF/wtf/Vector.h        2016-05-24 02:10:16 UTC (rev 201314)
</span><span class="lines">@@ -538,11 +538,7 @@
</span><span class="cx">     {
</span><span class="cx">         // FIXME: We could make swap part of VectorTypeOperations
</span><span class="cx">         // https://bugs.webkit.org/show_bug.cgi?id=128863
</span><del>-        
-        if (std::is_pod&lt;T&gt;::value)
-            std::swap(m_inlineBuffer, other.m_inlineBuffer);
-        else
-            swapInlineBuffers(inlineBuffer(), other.inlineBuffer(), mySize, otherSize);
</del><ins>+        swapInlineBuffers(inlineBuffer(), other.inlineBuffer(), mySize, otherSize);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     static void swapInlineBuffers(T* left, T* right, size_t leftSize, size_t rightSize)
</span></span></pre>
</div>
</div>

</body>
</html>