Title: [151755] trunk/Source/WTF
Revision
151755
Author
[email protected]
Date
2013-06-19 15:27:47 -0700 (Wed, 19 Jun 2013)

Log Message

Remove the SegmentedVector inline segment to shrink CodeBlock by 6X
https://bugs.webkit.org/show_bug.cgi?id=117808

Reviewed by Geoffrey Garen.

SegmentedVector allocation isn't super hot, but we do tend to have many
live SegmentedVectors at runtime, particularly in CodeBlocks, so the
right tradeoff is to allocate segments out-of-line as needed.

This reduces startup memory usage @ google.com by about 6MB.

No regression on SunSpider.

* wtf/SegmentedVector.h:
(WTF::SegmentedVector::SegmentedVector):
(WTF::SegmentedVector::at):
(WTF::SegmentedVector::append):
(WTF::SegmentedVector::removeLast):
(WTF::SegmentedVector::clear):
(WTF::SegmentedVector::deleteAllSegments): No more inline segment.

(WTF::SegmentedVector::ensureSegmentsFor): This code used to assume
that there was always a 0 segment, so the math would underflow if there
were no 0 segment. I udpated the math to account for having no segments.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (151754 => 151755)


--- trunk/Source/WTF/ChangeLog	2013-06-19 22:07:23 UTC (rev 151754)
+++ trunk/Source/WTF/ChangeLog	2013-06-19 22:27:47 UTC (rev 151755)
@@ -1,3 +1,30 @@
+2013-06-19  Geoffrey Garen  <[email protected]>
+
+        Remove the SegmentedVector inline segment to shrink CodeBlock by 6X
+        https://bugs.webkit.org/show_bug.cgi?id=117808
+
+        Reviewed by Geoffrey Garen.
+
+        SegmentedVector allocation isn't super hot, but we do tend to have many
+        live SegmentedVectors at runtime, particularly in CodeBlocks, so the
+        right tradeoff is to allocate segments out-of-line as needed.
+
+        This reduces startup memory usage @ google.com by about 6MB.
+
+        No regression on SunSpider.
+
+        * wtf/SegmentedVector.h:
+        (WTF::SegmentedVector::SegmentedVector):
+        (WTF::SegmentedVector::at):
+        (WTF::SegmentedVector::append):
+        (WTF::SegmentedVector::removeLast):
+        (WTF::SegmentedVector::clear):
+        (WTF::SegmentedVector::deleteAllSegments): No more inline segment.
+
+        (WTF::SegmentedVector::ensureSegmentsFor): This code used to assume
+        that there was always a 0 segment, so the math would underflow if there
+        were no 0 segment. I udpated the math to account for having no segments.
+
 2013-06-19  David Kilzer  <[email protected]>
 
         BUILD FIX (r151663): Fix build for iOS WebKit

Modified: trunk/Source/WTF/wtf/SegmentedVector.h (151754 => 151755)


--- trunk/Source/WTF/wtf/SegmentedVector.h	2013-06-19 22:07:23 UTC (rev 151754)
+++ trunk/Source/WTF/wtf/SegmentedVector.h	2013-06-19 22:27:47 UTC (rev 151755)
@@ -113,7 +113,6 @@
         SegmentedVector()
             : m_size(0)
         {
-            m_segments.append(&m_inlineSegment);
         }
 
         ~SegmentedVector()
@@ -126,8 +125,6 @@
 
         T& at(size_t index)
         {
-            if (index < SegmentSize)
-                return m_inlineSegment[index];
             return segmentFor(index)->at(subscriptFor(index));
         }
 
@@ -155,11 +152,6 @@
         {
             ++m_size;
 
-            if (m_size <= SegmentSize) {
-                m_inlineSegment.uncheckedAppend(value);
-                return;
-            }
-
             if (!segmentExistsFor(m_size - 1))
                 m_segments.append(new Segment);
             segmentFor(m_size - 1)->uncheckedAppend(value);
@@ -173,10 +165,7 @@
 
         void removeLast()
         {
-            if (m_size <= SegmentSize)
-                m_inlineSegment.removeLast();
-            else
-                segmentFor(m_size - 1)->removeLast();
+            segmentFor(m_size - 1)->removeLast();
             --m_size;
         }
 
@@ -190,8 +179,7 @@
         void clear()
         {
             deleteAllSegments();
-            m_segments.resize(1);
-            m_inlineSegment.clear();
+            m_segments.clear();
             m_size = 0;
         }
 
@@ -215,9 +203,7 @@
 
         void deleteAllSegments()
         {
-            // Skip the first segment, because it's our inline segment, which was
-            // not created by new.
-            for (size_t i = 1; i < m_segments.size(); i++)
+            for (size_t i = 0; i < m_segments.size(); i++)
                 delete m_segments[i];
         }
 
@@ -238,18 +224,12 @@
 
         void ensureSegmentsFor(size_t size)
         {
-            size_t segmentCount = m_size / SegmentSize;
-            if (m_size % SegmentSize)
-                ++segmentCount;
-            segmentCount = std::max<size_t>(segmentCount, 1); // We always have at least our inline segment.
+            size_t segmentCount = (m_size + SegmentSize - 1) / SegmentSize;
+            size_t neededSegmentCount = (size + SegmentSize - 1) / SegmentSize;
 
-            size_t neededSegmentCount = size / SegmentSize;
-            if (size % SegmentSize)
-                ++neededSegmentCount;
-
             // Fill up to N - 1 segments.
             size_t end = neededSegmentCount - 1;
-            for (size_t i = segmentCount - 1; i < end; ++i)
+            for (size_t i = segmentCount ? segmentCount - 1 : 0; i < end; ++i)
                 ensureSegment(i, SegmentSize);
 
             // Grow segment N to accomodate the remainder.
@@ -265,8 +245,7 @@
         }
 
         size_t m_size;
-        Segment m_inlineSegment;
-        Vector<Segment*, InlineCapacity> m_segments;
+        Vector<Segment*> m_segments;
     };
 
 } // namespace WTF
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to