[CSS Grid Layout] Performance optimization: avoid computing overflow alignment if...
authorjfernandez@igalia.com <jfernandez@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Jun 2015 14:18:11 +0000 (14:18 +0000)
committerjfernandez@igalia.com <jfernandez@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Jun 2015 14:18:11 +0000 (14:18 +0000)
https://bugs.webkit.org/show_bug.cgi?id=146231

Reviewed by Sergio Villar Senin.

We don't need to apply any overflow handling if alignment value don't have a potential
risk of data loss, as it's the case of 'start' value.

This patch avoid computing the overflow in all the cases, since it adds an unneeded
overhead which affects performance.

New code improves performance around 3%-8%, depending on the grid tests.

No new tests, no new funcitonality.

* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::rowPositionForChild):
(WebCore::RenderGrid::columnPositionForChild):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@185874 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/rendering/RenderGrid.cpp

index 1024510..c019d28 100644 (file)
@@ -1,3 +1,24 @@
+2015-06-23  Javier Fernandez  <jfernandez@igalia.com>
+
+        [CSS Grid Layout] Performance optimization: avoid computing overflow alignment if not needed
+        https://bugs.webkit.org/show_bug.cgi?id=146231
+
+        Reviewed by Sergio Villar Senin.
+
+        We don't need to apply any overflow handling if alignment value don't have a potential
+        risk of data loss, as it's the case of 'start' value.
+
+        This patch avoid computing the overflow in all the cases, since it adds an unneeded
+        overhead which affects performance.
+
+        New code improves performance around 3%-8%, depending on the grid tests.
+
+        No new tests, no new funcitonality.
+
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::rowPositionForChild):
+        (WebCore::RenderGrid::columnPositionForChild):
+
 2015-06-23  Youenn Fablet  <youenn.fablet@crf.canon.fr>
 
         MediaDevices.getUserMedia should migrate from callbacks to DOMPromise
index bc378a5..f2a8f2d 100644 (file)
@@ -1413,17 +1413,18 @@ LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const
 {
     const GridCoordinate& coordinate = cachedGridCoordinate(child);
     LayoutUnit startOfRow = m_rowPositions[coordinate.rows.resolvedInitialPosition.toInt()];
-    LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()];
     LayoutUnit startPosition = startOfRow + marginBeforeForChild(child);
-    LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveAlignmentOverflow(style(), child.style()), endOfRow - startOfRow, child.logicalHeight() + child.marginLogicalHeight());
 
-    switch (columnAxisPositionForChild(child)) {
+    GridAxisPosition axisPosition = columnAxisPositionForChild(child);
+    switch (axisPosition) {
     case GridAxisStart:
         return startPosition;
     case GridAxisEnd:
-        return startPosition + offsetFromStartPosition;
-    case GridAxisCenter:
-        return startPosition + offsetFromStartPosition / 2;
+    case GridAxisCenter: {
+        LayoutUnit endOfRow = m_rowPositions[coordinate.rows.resolvedFinalPosition.next().toInt()];
+        LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveAlignmentOverflow(style(), child.style()), endOfRow - startOfRow, child.logicalHeight() + child.marginLogicalHeight());
+        return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2);
+    }
     }
 
     ASSERT_NOT_REACHED();
@@ -1435,17 +1436,18 @@ LayoutUnit RenderGrid::columnPositionForChild(const RenderBox& child) const
 {
     const GridCoordinate& coordinate = cachedGridCoordinate(child);
     LayoutUnit startOfColumn = m_columnPositions[coordinate.columns.resolvedInitialPosition.toInt()];
-    LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()];
     LayoutUnit startPosition = startOfColumn + marginStartForChild(child);
-    LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveJustificationOverflow(style(), child.style()), endOfColumn - startOfColumn, child.logicalWidth() + child.marginLogicalWidth());
 
-    switch (rowAxisPositionForChild(child)) {
+    GridAxisPosition axisPosition = rowAxisPositionForChild(child);
+    switch (axisPosition) {
     case GridAxisStart:
         return startPosition;
     case GridAxisEnd:
-        return startPosition + offsetFromStartPosition;
-    case GridAxisCenter:
-        return startPosition + offsetFromStartPosition / 2;
+    case GridAxisCenter: {
+        LayoutUnit endOfColumn = m_columnPositions[coordinate.columns.resolvedFinalPosition.next().toInt()];
+        LayoutUnit offsetFromStartPosition = computeOverflowAlignmentOffset(RenderStyle::resolveJustificationOverflow(style(), child.style()), endOfColumn - startOfColumn, child.logicalWidth() + child.marginLogicalWidth());
+        return startPosition + (axisPosition == GridAxisEnd ? offsetFromStartPosition : offsetFromStartPosition / 2);
+    }
     }
 
     ASSERT_NOT_REACHED();