Source/WebCore/ChangeLog

 12012-06-23 Ryosuke Niwa <rniwa@webkit.org>
 2
 3 REGRESSION(r120979): getElementsByTagName is 12% slower
 4 https://bugs.webkit.org/show_bug.cgi?id=89783
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 The problem is that hashing std::pair<unsigned short, AtomicString> is very slow compared to just hashing AtomicString,
 9 which internally holds a hash already. Fixed the regression by replacing the default hash function by the one that
 10 computes AtomicString's hash + list type. This is okay because we only have 7 node list types at the moment.
 11
 12 * dom/NodeRareData.h:
 13 (NodeListsNodeData):
 14 (WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::hash):
 15 (NodeListCacheMapEntryHash):
 16 (WebCore::NodeListsNodeData::NodeListCacheMapEntryHash::equal):
 17 (WebCore::NodeListsNodeData::namedNodeListKey):
 18
1192012-06-22 Benjamin Poulain <bpoulain@apple.com>
220
321 Text with text-overflow:ellipsis and text-align:right is left aligned
121087

Source/WebCore/dom/NodeRareData.h

@@class TreeScope;
4949class NodeListsNodeData {
5050 WTF_MAKE_NONCOPYABLE(NodeListsNodeData); WTF_MAKE_FAST_ALLOCATED;
5151public:
52  typedef HashMap<std::pair<unsigned short, AtomicString>, DynamicSubtreeNodeList*> NodeListAtomicNameCacheMap;
53  typedef HashMap<std::pair<unsigned short, String>, DynamicSubtreeNodeList*> NodeListNameCacheMap;
 52 template <typename StringType>
 53 struct NodeListCacheMapEntryHash {
 54 static unsigned hash(const std::pair<StringType, unsigned char>& entry)
 55 {
 56 return WTF::DefaultHash<StringType>::Hash::hash(entry.first) + entry.second;
 57 }
 58
 59 static bool equal(const std::pair<StringType, unsigned char>& a, const std::pair<StringType, unsigned char>& b) { return a == b; }
 60
 61 static const bool safeToCompareToEmptyOrDeleted = WTF::DefaultHash<StringType>::Hash::safeToCompareToEmptyOrDeleted;
 62 };
 63
 64 typedef HashMap<std::pair<AtomicString, unsigned char>, DynamicSubtreeNodeList*, NodeListCacheMapEntryHash<AtomicString> > NodeListAtomicNameCacheMap;
 65 typedef HashMap<std::pair<String, unsigned char>, DynamicSubtreeNodeList*, NodeListCacheMapEntryHash<String> > NodeListNameCacheMap;
5466 typedef HashMap<QualifiedName, TagNodeList*> TagNodeListCacheNS;
5567
5668 template<typename T>

@@public:
151163private:
152164 NodeListsNodeData() { }
153165
154  std::pair<unsigned short, AtomicString> namedNodeListKey(DynamicNodeList::NodeListType listType, const AtomicString& name)
 166 std::pair<AtomicString, unsigned short> namedNodeListKey(DynamicNodeList::NodeListType listType, const AtomicString& name)
155167 {
156  return std::pair<unsigned short, AtomicString>(listType, name);
 168 return std::pair<AtomicString, unsigned short>(name, listType);
157169 }
158170
159  std::pair<unsigned short, String> namedNodeListKey(DynamicNodeList::NodeListType listType, const String& name)
 171 std::pair<String, unsigned short> namedNodeListKey(DynamicNodeList::NodeListType listType, const String& name)
160172 {
161  return std::pair<unsigned short, String>(listType, name);
 173 return std::pair<String, unsigned short>(name, listType);
162174 }
163175
164176 NodeListAtomicNameCacheMap m_atomicNameCaches;
121077