Commit df95517b authored by slewis@apple.com's avatar slewis@apple.com

https://bugs.webkit.org/show_bug.cgi?id=57073

Rework the AtomicHTMLConstructor to reserve space for attributes based on the size of the attribute list.
Saves 1.5 MB on Membuster.

Reviewed by Geoff Garen.

No new tests because there was no change in behavior.  Current tests pass.

* html/parser/HTMLToken.h:
(WebCore::AtomicHTMLToken::AtomicHTMLToken):
(WebCore::AtomicHTMLToken::initializeAttributes):



git-svn-id: svn://svn.chromium.org/blink/trunk@81937 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent fffe2faa
2011-03-24 Stephanie Lewis <slewis@apple.com>
Reviewed by Geoff Garen.
https://bugs.webkit.org/show_bug.cgi?id=57073
Rework the AtomicHTMLConstructor to reserve space for attributes based on the size of the attribute list.
Saves 1.5 MB on Membuster.
No new tests because there was no change in behavior. Current tests pass.
* html/parser/HTMLToken.h:
(WebCore::AtomicHTMLToken::AtomicHTMLToken):
(WebCore::AtomicHTMLToken::initializeAttributes):
2011-03-24 Sheriff Bot <webkit.review.bot@gmail.com> 2011-03-24 Sheriff Bot <webkit.review.bot@gmail.com>
Unreviewed, rolling out r81916 and r81917. Unreviewed, rolling out r81916 and r81917.
...@@ -398,27 +398,7 @@ public: ...@@ -398,27 +398,7 @@ public:
case HTMLToken::EndTag: { case HTMLToken::EndTag: {
m_selfClosing = token.selfClosing(); m_selfClosing = token.selfClosing();
m_name = AtomicString(token.name().data(), token.name().size()); m_name = AtomicString(token.name().data(), token.name().size());
const HTMLToken::AttributeList& attributes = token.attributes(); initializeAttributes(token.attributes());
for (HTMLToken::AttributeList::const_iterator iter = attributes.begin();
iter != attributes.end(); ++iter) {
if (!iter->m_name.isEmpty()) {
String name(iter->m_name.data(), iter->m_name.size());
String value(iter->m_value.data(), iter->m_value.size());
ASSERT(iter->m_nameRange.m_start);
ASSERT(iter->m_nameRange.m_end);
ASSERT(iter->m_valueRange.m_start);
ASSERT(iter->m_valueRange.m_end);
RefPtr<Attribute> mappedAttribute = Attribute::createMapped(name, value);
if (!m_attributes) {
m_attributes = NamedNodeMap::create();
// Reserving capacity here improves the parser
// benchmark. It might be worth experimenting with
// the constant to see where the optimal point is.
m_attributes->reserveInitialCapacity(10);
}
m_attributes->insertAttribute(mappedAttribute.release(), false);
}
}
break; break;
} }
case HTMLToken::Comment: case HTMLToken::Comment:
...@@ -513,6 +493,8 @@ public: ...@@ -513,6 +493,8 @@ public:
private: private:
HTMLToken::Type m_type; HTMLToken::Type m_type;
void initializeAttributes(const HTMLToken::AttributeList& attributes);
bool usesName() const bool usesName() const
{ {
return m_type == HTMLToken::StartTag || m_type == HTMLToken::EndTag || m_type == HTMLToken::DOCTYPE; return m_type == HTMLToken::StartTag || m_type == HTMLToken::EndTag || m_type == HTMLToken::DOCTYPE;
...@@ -548,6 +530,30 @@ private: ...@@ -548,6 +530,30 @@ private:
RefPtr<NamedNodeMap> m_attributes; RefPtr<NamedNodeMap> m_attributes;
}; };
inline void AtomicHTMLToken::initializeAttributes(const HTMLToken::AttributeList& attributes)
{
size_t size = attributes.size();
if (!size)
return;
m_attributes = NamedNodeMap::create();
m_attributes->reserveInitialCapacity(size);
for (size_t i = 0; i < size; ++i) {
const HTMLToken::Attribute& attribute = attributes[i];
if (attribute.m_name.isEmpty())
continue;
ASSERT(attribute.m_nameRange.m_start);
ASSERT(attribute.m_nameRange.m_end);
ASSERT(attribute.m_valueRange.m_start);
ASSERT(attribute.m_valueRange.m_end);
String name(attribute.m_name.data(), attribute.m_name.size());
String value(attribute.m_value.data(), attribute.m_value.size());
m_attributes->insertAttribute(Attribute::createMapped(name, value), false);
}
}
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment