Title: [125221] trunk/Source/WebCore
Revision
125221
Author
[email protected]
Date
2012-08-09 16:49:49 -0700 (Thu, 09 Aug 2012)

Log Message

Append the unit in place when generating the text value of a CSSPrimitiveValue
https://bugs.webkit.org/show_bug.cgi?id=93572

Patch by Benjamin Poulain <[email protected]> on 2012-08-09
Reviewed by Andreas Kling.

Previously, the units were added to the formatted number by the operator+. This would create
a new WTF::String for the unit, then use String::append() to add it to the number.

This was ineffective because it required one malloc for the unit, followed by a realloc + copying
the bytes.

This patch adds handling for the unit directly in formatNumber() so that we only do one malloc
and append the units in place.

Avoiding the intermediate string is both more efficient (9% faster as seen from _javascript_)
and generate more compact code (~8kb less code on x86_64).

* css/CSSPrimitiveValue.cpp:
(WebCore::formatNumber):
(WebCore::CSSPrimitiveValue::customCssText):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (125220 => 125221)


--- trunk/Source/WebCore/ChangeLog	2012-08-09 23:34:44 UTC (rev 125220)
+++ trunk/Source/WebCore/ChangeLog	2012-08-09 23:49:49 UTC (rev 125221)
@@ -1,3 +1,26 @@
+2012-08-09  Benjamin Poulain  <[email protected]>
+
+        Append the unit in place when generating the text value of a CSSPrimitiveValue
+        https://bugs.webkit.org/show_bug.cgi?id=93572
+
+        Reviewed by Andreas Kling.
+
+        Previously, the units were added to the formatted number by the operator+. This would create
+        a new WTF::String for the unit, then use String::append() to add it to the number.
+
+        This was ineffective because it required one malloc for the unit, followed by a realloc + copying
+        the bytes.
+
+        This patch adds handling for the unit directly in formatNumber() so that we only do one malloc
+        and append the units in place.
+
+        Avoiding the intermediate string is both more efficient (9% faster as seen from _javascript_)
+        and generate more compact code (~8kb less code on x86_64).
+
+        * css/CSSPrimitiveValue.cpp:
+        (WebCore::formatNumber):
+        (WebCore::CSSPrimitiveValue::customCssText):
+
 2012-08-09  Elliott Sprehn  <[email protected]>
 
         Reimplement RenderQuote placement algorithm

Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.cpp (125220 => 125221)


--- trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2012-08-09 23:34:44 UTC (rev 125220)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2012-08-09 23:49:49 UTC (rev 125221)
@@ -828,17 +828,26 @@
     return m_value.pair;
 }
 
-static String formatNumber(double number)
+static String formatNumber(double number, const char* suffix, unsigned suffixLength)
 {
     DecimalNumber decimal(number);
 
-    StringBuffer<UChar> buffer(decimal.bufferLengthForStringDecimal());
+    StringBuffer<UChar> buffer(decimal.bufferLengthForStringDecimal() + suffixLength);
     unsigned length = decimal.toStringDecimal(buffer.characters(), buffer.length());
-    ASSERT_UNUSED(length, length == buffer.length());
+    ASSERT(length + suffixLength == buffer.length());
 
+    for (unsigned i = 0; i < suffixLength; ++i)
+        buffer[length + i] = suffix[i];
+
     return String::adopt(buffer);
 }
 
+template <unsigned characterCount>
+ALWAYS_INLINE static String formatNumber(double number, const char (&characters)[characterCount])
+{
+    return formatNumber(number, characters, characterCount - 1);
+}
+
 String CSSPrimitiveValue::customCssText() const
 {
     // FIXME: return the original value instead of a generated one (e.g. color
@@ -856,72 +865,72 @@
             break;
         case CSS_NUMBER:
         case CSS_PARSER_INTEGER:
-            text = formatNumber(m_value.num);
+            text = formatNumber(m_value.num, "");
             break;
         case CSS_PERCENTAGE:
-            text = formatNumber(m_value.num) + "%";
+            text = formatNumber(m_value.num, "%");
             break;
         case CSS_EMS:
-            text = formatNumber(m_value.num) + "em";
+            text = formatNumber(m_value.num, "em");
             break;
         case CSS_EXS:
-            text = formatNumber(m_value.num) + "ex";
+            text = formatNumber(m_value.num, "ex");
             break;
         case CSS_REMS:
-            text = formatNumber(m_value.num) + "rem";
+            text = formatNumber(m_value.num, "rem");
             break;
         case CSS_PX:
-            text = formatNumber(m_value.num) + "px";
+            text = formatNumber(m_value.num, "px");
             break;
         case CSS_CM:
-            text = formatNumber(m_value.num) + "cm";
+            text = formatNumber(m_value.num, "cm");
             break;
 #if ENABLE(CSS_IMAGE_RESOLUTION)
         case CSS_DPPX:
-            text = formatNumber(m_value.num) + "dppx";
+            text = formatNumber(m_value.num, "dppx");
             break;
         case CSS_DPI:
-            text = formatNumber(m_value.num) + "dpi";
+            text = formatNumber(m_value.num, "dpi");
             break;
         case CSS_DPCM:
-            text = formatNumber(m_value.num) + "dpcm";
+            text = formatNumber(m_value.num, "dpcm");
             break;
 #endif
         case CSS_MM:
-            text = formatNumber(m_value.num) + "mm";
+            text = formatNumber(m_value.num, "mm");
             break;
         case CSS_IN:
-            text = formatNumber(m_value.num) + "in";
+            text = formatNumber(m_value.num, "in");
             break;
         case CSS_PT:
-            text = formatNumber(m_value.num) + "pt";
+            text = formatNumber(m_value.num, "pt");
             break;
         case CSS_PC:
-            text = formatNumber(m_value.num) + "pc";
+            text = formatNumber(m_value.num, "pc");
             break;
         case CSS_DEG:
-            text = formatNumber(m_value.num) + "deg";
+            text = formatNumber(m_value.num, "deg");
             break;
         case CSS_RAD:
-            text = formatNumber(m_value.num) + "rad";
+            text = formatNumber(m_value.num, "rad");
             break;
         case CSS_GRAD:
-            text = formatNumber(m_value.num) + "grad";
+            text = formatNumber(m_value.num, "grad");
             break;
         case CSS_MS:
-            text = formatNumber(m_value.num) + "ms";
+            text = formatNumber(m_value.num, "ms");
             break;
         case CSS_S:
-            text = formatNumber(m_value.num) + "s";
+            text = formatNumber(m_value.num, "s");
             break;
         case CSS_HZ:
-            text = formatNumber(m_value.num) + "hz";
+            text = formatNumber(m_value.num, "hz");
             break;
         case CSS_KHZ:
-            text = formatNumber(m_value.num) + "khz";
+            text = formatNumber(m_value.num, "khz");
             break;
         case CSS_TURN:
-            text = formatNumber(m_value.num) + "turn";
+            text = formatNumber(m_value.num, "turn");
             break;
         case CSS_DIMENSION:
             // FIXME
@@ -1113,13 +1122,13 @@
             text = m_value.shape->cssText();
             break;
         case CSS_VW:
-            text = formatNumber(m_value.num) + "vw";
+            text = formatNumber(m_value.num, "vw");
             break;
         case CSS_VH:
-            text = formatNumber(m_value.num) + "vh";
+            text = formatNumber(m_value.num, "vh");
             break;
         case CSS_VMIN:
-            text = formatNumber(m_value.num) + "vmin";
+            text = formatNumber(m_value.num, "vmin");
             break;
 #if ENABLE(CSS_VARIABLES)
         case CSS_VARIABLE_NAME:
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to