WebKit spends ~20% of time in HTMLTextAreaElement::defaultValue() when opening a...
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 May 2012 08:50:09 +0000 (08:50 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 May 2012 08:50:09 +0000 (08:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=86813

Reviewed by Eric Seidel.

Replace String and calls to String::operator+= by StringBuilder and calls to append respectively.
While there are other optimizations we can implement such as not replacing all nodes in the shadow DOM,
or not serializing the value when detecting whether the value had changed, they require considerable
amount of refactoring and this change alone seems to buy us a lot so let us defer those 'til later time.

Also avoid the redundant call to setValue in childrenChanged when the value is dirty.
This should halve the time we spend in setting the value.

* html/HTMLTextAreaElement.cpp:
(WebCore::HTMLTextAreaElement::childrenChanged):
(WebCore::HTMLTextAreaElement::defaultValue):

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

Source/WebCore/ChangeLog
Source/WebCore/html/HTMLTextAreaElement.cpp

index 5c20fac..f2af5bd 100644 (file)
@@ -1,3 +1,22 @@
+2012-05-23  Ryosuke Niwa  <rniwa@webkit.org>
+
+        WebKit spends ~20% of time in HTMLTextAreaElement::defaultValue() when opening a review page
+        https://bugs.webkit.org/show_bug.cgi?id=86813
+
+        Reviewed by Eric Seidel.
+
+        Replace String and calls to String::operator+= by StringBuilder and calls to append respectively.
+        While there are other optimizations we can implement such as not replacing all nodes in the shadow DOM,
+        or not serializing the value when detecting whether the value had changed, they require considerable
+        amount of refactoring and this change alone seems to buy us a lot so let us defer those 'til later time.
+
+        Also avoid the redundant call to setValue in childrenChanged when the value is dirty.
+        This should halve the time we spend in setting the value.
+
+        * html/HTMLTextAreaElement.cpp:
+        (WebCore::HTMLTextAreaElement::childrenChanged):
+        (WebCore::HTMLTextAreaElement::defaultValue):
+
 2012-05-23  Alice Boxhall  <aboxhall@chromium.org>
 
         AX: Contenteditable tables should always be exposed as data tables
index 1652c89..f1c3825 100644 (file)
@@ -44,6 +44,7 @@
 #include "TextControlInnerElements.h"
 #include "TextIterator.h"
 #include <wtf/StdLibExtras.h>
+#include <wtf/text/StringBuilder.h>
 
 namespace WebCore {
 
@@ -115,9 +116,10 @@ void HTMLTextAreaElement::childrenChanged(bool changedByParser, Node* beforeChan
 {
     HTMLElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
     setLastChangeWasNotUserEdit();
-    if (!m_isDirty)
+    if (m_isDirty)
+        setInnerTextValue(value());
+    else
         setNonDirtyValue(defaultValue());
-    setInnerTextValue(value());
 }
 
 bool HTMLTextAreaElement::isPresentationAttribute(const QualifiedName& name) const
@@ -372,15 +374,15 @@ void HTMLTextAreaElement::setValueCommon(const String& newValue)
 
 String HTMLTextAreaElement::defaultValue() const
 {
-    String value = "";
+    StringBuilder value;
 
     // Since there may be comments, ignore nodes other than text nodes.
     for (Node* n = firstChild(); n; n = n->nextSibling()) {
         if (n->isTextNode())
-            value += toText(n)->data();
+            value.append(toText(n)->data());
     }
 
-    return value;
+    return value.toString();
 }
 
 void HTMLTextAreaElement::setDefaultValue(const String& defaultValue)