GraphicsContext state stack wasting lots of memory when empty.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Jun 2015 00:46:51 +0000 (00:46 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 10 Jun 2015 00:46:51 +0000 (00:46 +0000)
<https://webkit.org/b/145817>

Reviewed by Geoffrey Garen.

Give the GraphicsContextState stack an inline capacity of 1, and make sure
to free any heap-allocated backing store when the stack goes empty.

The 1 is because HTMLCanvasElement keeps one "save" on the underlying
GraphicsContext at all times, and this prevents those canvases from always
sitting on an empty stack with 16 capacity.

This saves ~520 kB on cnet.com video pages.

* platform/graphics/GraphicsContext.cpp:
(WebCore::GraphicsContext::restore):
* platform/graphics/GraphicsContext.h:

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

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/GraphicsContext.cpp
Source/WebCore/platform/graphics/GraphicsContext.h

index 613f465..9c27420 100644 (file)
@@ -1,3 +1,23 @@
+2015-06-09  Andreas Kling  <akling@apple.com>
+
+        GraphicsContext state stack wasting lots of memory when empty.
+        <https://webkit.org/b/145817>
+
+        Reviewed by Geoffrey Garen.
+
+        Give the GraphicsContextState stack an inline capacity of 1, and make sure
+        to free any heap-allocated backing store when the stack goes empty.
+
+        The 1 is because HTMLCanvasElement keeps one "save" on the underlying
+        GraphicsContext at all times, and this prevents those canvases from always
+        sitting on an empty stack with 16 capacity.
+
+        This saves ~520 kB on cnet.com video pages.
+
+        * platform/graphics/GraphicsContext.cpp:
+        (WebCore::GraphicsContext::restore):
+        * platform/graphics/GraphicsContext.h:
+
 2015-06-09  Said Abou-Hallawa  <sabouhallawa@apple.com>
 
         SVG Fragment is not rendered if it is the css background image of an HTML element
index 1337878..d38c1fa 100644 (file)
@@ -134,6 +134,11 @@ void GraphicsContext::restore()
     m_state = m_stack.last();
     m_stack.removeLast();
 
+    // Make sure we deallocate the state stack buffer when it goes empty.
+    // Canvas elements will immediately save() again, but that goes into inline capacity.
+    if (m_stack.isEmpty())
+        m_stack.clear();
+
     restorePlatformState();
 }
 
index 05246ca..365bcb0 100644 (file)
@@ -559,7 +559,7 @@ namespace WebCore {
         GraphicsContextPlatformPrivate* m_data;
 
         GraphicsContextState m_state;
-        Vector<GraphicsContextState> m_stack;
+        Vector<GraphicsContextState, 1> m_stack;
         bool m_updatingControlTints;
         unsigned m_transparencyCount;
     };