Title: [174971] releases/WebKitGTK/webkit-2.6/Source/WebCore
Revision
174971
Author
carlo...@webkit.org
Date
2014-10-21 09:23:44 -0700 (Tue, 21 Oct 2014)

Log Message

Merge r174703 - Introduce an isCSSAnimated flag on RenderElement for performance
https://bugs.webkit.org/show_bug.cgi?id=137583

Reviewed by Simon Fraser.

I noticed when profiling the ebay.com page load that isRunningAnimationOnRenderer()
and isRunningAcceleratedAnimationOnRenderer() were called frequently, causing
~4.7 millions m_compositeAnimations HashMap lookups.

This patch introduces an isCSSAnimated flag on RenderElement to return early if
there is no animation on the renderer, thus avoiding HashMap lookups. This reduces
the number of HashMap lookups from ~4.7 millions to ~68k. On my machine, I see
the following performance improvements:
- isRunning*AnimationOnRenderer() / computeCompositingRequirements()
  - before: ~45ms  / ~90ms
  - after:  ~4ms / ~30ms

No new tests, no behavior change.

* page/animation/AnimationController.cpp:
(WebCore::AnimationControllerPrivate::ensureCompositeAnimation):
(WebCore::AnimationControllerPrivate::clear):
(WebCore::AnimationControllerPrivate::isRunningAnimationOnRenderer):
(WebCore::AnimationControllerPrivate::isRunningAcceleratedAnimationOnRenderer):
(WebCore::AnimationController::isRunningAnimationOnRenderer):
(WebCore::AnimationController::isRunningAcceleratedAnimationOnRenderer):
* rendering/RenderElement.cpp:
(WebCore::RenderElement::RenderElement):
* rendering/RenderElement.h:
(WebCore::RenderElement::isCSSAnimating):
(WebCore::RenderElement::setIsCSSAnimating):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog (174970 => 174971)


--- releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog	2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/ChangeLog	2014-10-21 16:23:44 UTC (rev 174971)
@@ -1,3 +1,37 @@
+2014-10-14  Chris Dumez  <cdu...@apple.com>
+
+        Introduce an isCSSAnimated flag on RenderElement for performance
+        https://bugs.webkit.org/show_bug.cgi?id=137583
+
+        Reviewed by Simon Fraser.
+
+        I noticed when profiling the ebay.com page load that isRunningAnimationOnRenderer()
+        and isRunningAcceleratedAnimationOnRenderer() were called frequently, causing
+        ~4.7 millions m_compositeAnimations HashMap lookups.
+
+        This patch introduces an isCSSAnimated flag on RenderElement to return early if
+        there is no animation on the renderer, thus avoiding HashMap lookups. This reduces
+        the number of HashMap lookups from ~4.7 millions to ~68k. On my machine, I see
+        the following performance improvements:
+        - isRunning*AnimationOnRenderer() / computeCompositingRequirements()
+          - before: ~45ms  / ~90ms
+          - after:  ~4ms / ~30ms
+
+        No new tests, no behavior change.
+
+        * page/animation/AnimationController.cpp:
+        (WebCore::AnimationControllerPrivate::ensureCompositeAnimation):
+        (WebCore::AnimationControllerPrivate::clear):
+        (WebCore::AnimationControllerPrivate::isRunningAnimationOnRenderer):
+        (WebCore::AnimationControllerPrivate::isRunningAcceleratedAnimationOnRenderer):
+        (WebCore::AnimationController::isRunningAnimationOnRenderer):
+        (WebCore::AnimationController::isRunningAcceleratedAnimationOnRenderer):
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::RenderElement):
+        * rendering/RenderElement.h:
+        (WebCore::RenderElement::isCSSAnimating):
+        (WebCore::RenderElement::setIsCSSAnimating):
+
 2014-10-14  Youenn Fablet  <youe...@gmail.com>
 
         [XHR] Abort method execution when m_loader->cancel() in internalAbort() caused reentry

Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/page/animation/AnimationController.cpp (174970 => 174971)


--- releases/WebKitGTK/webkit-2.6/Source/WebCore/page/animation/AnimationController.cpp	2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/page/animation/AnimationController.cpp	2014-10-21 16:23:44 UTC (rev 174971)
@@ -70,8 +70,10 @@
 CompositeAnimation& AnimationControllerPrivate::ensureCompositeAnimation(RenderElement* renderer)
 {
     auto result = m_compositeAnimations.add(renderer, nullptr);
-    if (result.isNewEntry)
+    if (result.isNewEntry) {
         result.iterator->value = CompositeAnimation::create(this);
+        renderer->setIsCSSAnimating(true);
+    }
     return *result.iterator->value;
 }
 
@@ -82,6 +84,7 @@
     RefPtr<CompositeAnimation> animation = m_compositeAnimations.take(renderer);
     if (!animation)
         return false;
+    renderer->setIsCSSAnimating(false);
     animation->clearRenderer();
     return animation->isSuspended();
 }
@@ -238,14 +241,18 @@
 
 bool AnimationControllerPrivate::isRunningAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
 {
-    const CompositeAnimation* animation = m_compositeAnimations.get(renderer);
-    return animation && animation->isAnimatingProperty(property, false, runningState);
+    ASSERT(renderer->isCSSAnimating());
+    ASSERT(m_compositeAnimations.contains(renderer));
+    const CompositeAnimation& animation = *m_compositeAnimations.get(renderer);
+    return animation.isAnimatingProperty(property, false, runningState);
 }
 
 bool AnimationControllerPrivate::isRunningAcceleratedAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
 {
-    const CompositeAnimation* animation = m_compositeAnimations.get(renderer);
-    return animation && animation->isAnimatingProperty(property, true, runningState);
+    ASSERT(renderer->isCSSAnimating());
+    ASSERT(m_compositeAnimations.contains(renderer));
+    const CompositeAnimation& animation = *m_compositeAnimations.get(renderer);
+    return animation.isAnimatingProperty(property, true, runningState);
 }
 
 void AnimationControllerPrivate::suspendAnimations()
@@ -557,12 +564,12 @@
 
 bool AnimationController::isRunningAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
 {
-    return m_data->isRunningAnimationOnRenderer(renderer, property, runningState);
+    return renderer->isCSSAnimating() && m_data->isRunningAnimationOnRenderer(renderer, property, runningState);
 }
 
 bool AnimationController::isRunningAcceleratedAnimationOnRenderer(RenderElement* renderer, CSSPropertyID property, AnimationBase::RunningState runningState) const
 {
-    return m_data->isRunningAcceleratedAnimationOnRenderer(renderer, property, runningState);
+    return renderer->isCSSAnimating() && m_data->isRunningAcceleratedAnimationOnRenderer(renderer, property, runningState);
 }
 
 bool AnimationController::isSuspended() const

Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.cpp (174970 => 174971)


--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.cpp	2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.cpp	2014-10-21 16:23:44 UTC (rev 174971)
@@ -86,6 +86,7 @@
     , m_renderBoxNeedsLazyRepaint(false)
     , m_hasPausedImageAnimations(false)
     , m_hasCounterNodeMap(false)
+    , m_isCSSAnimating(false)
     , m_firstChild(nullptr)
     , m_lastChild(nullptr)
     , m_style(WTF::move(style))

Modified: releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.h (174970 => 174971)


--- releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.h	2014-10-21 16:06:35 UTC (rev 174970)
+++ releases/WebKitGTK/webkit-2.6/Source/WebCore/rendering/RenderElement.h	2014-10-21 16:23:44 UTC (rev 174971)
@@ -158,6 +158,9 @@
     bool hasCounterNodeMap() const { return m_hasCounterNodeMap; }
     void setHasCounterNodeMap(bool f) { m_hasCounterNodeMap = f; }
 
+    bool isCSSAnimating() const { return m_isCSSAnimating; }
+    void setIsCSSAnimating(bool b) { m_isCSSAnimating = b; }
+
 protected:
     enum BaseTypeFlags {
         RenderLayerModelObjectFlag = 1 << 0,
@@ -224,13 +227,14 @@
     virtual void newImageAnimationFrameAvailable(CachedImage&) final override;
 
     unsigned m_baseTypeFlags : 6;
-    bool m_ancestorLineBoxDirty : 1;
-    bool m_hasInitializedStyle : 1;
+    unsigned m_ancestorLineBoxDirty : 1;
+    unsigned m_hasInitializedStyle : 1;
 
-    bool m_renderInlineAlwaysCreatesLineBoxes : 1;
-    bool m_renderBoxNeedsLazyRepaint : 1;
-    bool m_hasPausedImageAnimations : 1;
-    bool m_hasCounterNodeMap : 1;
+    unsigned m_renderInlineAlwaysCreatesLineBoxes : 1;
+    unsigned m_renderBoxNeedsLazyRepaint : 1;
+    unsigned m_hasPausedImageAnimations : 1;
+    unsigned m_hasCounterNodeMap : 1;
+    unsigned m_isCSSAnimating : 1;
 
     RenderObject* m_firstChild;
     RenderObject* m_lastChild;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to