Title: [151977] branches/safari-537-branch/Source/WTF
Revision
151977
Author
[email protected]
Date
2013-06-25 18:22:03 -0700 (Tue, 25 Jun 2013)

Log Message

Merged r151755.  <rdar://problem/14209227>

Modified Paths

Diff

Modified: branches/safari-537-branch/Source/WTF/ChangeLog (151976 => 151977)


--- branches/safari-537-branch/Source/WTF/ChangeLog	2013-06-26 01:09:26 UTC (rev 151976)
+++ branches/safari-537-branch/Source/WTF/ChangeLog	2013-06-26 01:22:03 UTC (rev 151977)
@@ -1,3 +1,34 @@
+2013-06-25  Lucas Forschler  <[email protected]>
+
+        Merge r151755
+
+    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-21  Lucas Forschler  <[email protected]>
 
         Merge r151787

Modified: branches/safari-537-branch/Source/WTF/wtf/SegmentedVector.h (151976 => 151977)


--- branches/safari-537-branch/Source/WTF/wtf/SegmentedVector.h	2013-06-26 01:09:26 UTC (rev 151976)
+++ branches/safari-537-branch/Source/WTF/wtf/SegmentedVector.h	2013-06-26 01:22:03 UTC (rev 151977)
@@ -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