Improve CSSPrimitiveValue::customCSSText for ARMv7
authorbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Jun 2014 00:22:23 +0000 (00:22 +0000)
committerbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Jun 2014 00:22:23 +0000 (00:22 +0000)
commit41ff64315a6995b55c02b4fd53d995be9c39cb3f
tree3e8ff0bd975904cea5637f5f326a6bb036c96008
parent3c5523cc5d5cc78688502d3946bff0dcc00df206
Improve CSSPrimitiveValue::customCSSText for ARMv7
https://bugs.webkit.org/show_bug.cgi?id=133597

Patch by Benjamin Poulain <bpoulain@apple.com> on 2014-06-09
Reviewed by Andreas Kling.

Source/WebCore:
On imgur, some script is updating some layout on timers and on scroll.

It looks like CSSPrimitiveValue::customCSSText() is a little constrained
by the instruction cache on ARMv7. This patch improve the situation a bit.

First, the creation of the string itself is changed to go from two allocation to one.
Previously, we would allocate a StringBuffer and adopt it. Now we allocate a StringImpl
directly with the inline buffer.

The second issue is that the compiler was generating a real copy constructor for every
assignment of the "text" variable (likely because the variable span is so large).
This was solved by moving the string creating into a separate function (to fix the span)
and being careful with passing PassRef<StringImpl> around.

Then there was the problem that the compiler was a little too aggressive with inlining
which caused each "case" to repeat the same prologue and epilogue before formatValue().
This was solved by adding formatNumberValue() with NEVER_INLINE to have the prologue/epilogue
in a single place.

On older device, that's about 3% improvement on style access. On modern ARM64/x86_64
there is no noticeable difference.

* css/CSSPrimitiveValue.cpp:
(WebCore::CSSPrimitiveValue::formatNumberValue):
(WebCore::CSSPrimitiveValue::formatNumberForcustomCSSText):
(WebCore::CSSPrimitiveValue::customCSSText):
(WebCore::formatNumber): Deleted.
* css/CSSPrimitiveValue.h:

Source/WTF:
* wtf/RefPtr.h:
(WTF::RefPtr<T>::RefPtr):
* wtf/text/WTFString.h:
(WTF::String::String):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@169731 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WTF/ChangeLog
Source/WTF/wtf/RefPtr.h
Source/WTF/wtf/text/WTFString.h
Source/WebCore/ChangeLog
Source/WebCore/css/CSSPrimitiveValue.cpp
Source/WebCore/css/CSSPrimitiveValue.h