Changeset 110137 in webkit
- Timestamp:
- Mar 7, 2012 8:02:26 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r110135 r110137 1 2012-03-07 Kentaro Hara <haraken@chromium.org> 2 3 [V8][Performance] Optimize V8 bindings for HTMLElement.classList, 4 Element.dataset and Node.attributes 5 https://bugs.webkit.org/show_bug.cgi?id=80376 6 7 Reviewed by Adam Barth. 8 9 This patch improves the performance of HTMLElement.classList, Element.dataset 10 and Node.attributes by 6.4 times, 7.1 times and 10.9 times, respectively. 11 12 Previously, a 'hiddenReferenceName' string was allocated on v8::Handle and 13 created every time the DOM attribute is accessed, in spite of the fact that 14 the 'hiddenReferenceName' string is static. 15 16 This patch moves the 'hiddenReferenceName' string to v8::Persistent and makes it static. 17 Also, this patch removes 'if (!elementValue.IsEmpty() && elementValue->IsObject())', 18 since if 'element' exists, it is guaranteed that 'elementValue' is not empty 19 and is an Object. 20 21 Performance tests: https://bugs.webkit.org/attachment.cgi?id=130283 22 23 AppleWebKit/JavaScriptCore: 24 div.classList : 382ms 25 div.classList.foo = 123 : 335ms 26 div.dataset : 403ms 27 div.dataset.foo = 123 : 5250ms 28 div.attributes : 183ms 29 30 Chromium/V8 (without this patch): 31 div.classList : 9140ms 32 div.classList.foo = 123 : 9086ms 33 div.dataset : 9930ms 34 div.dataset.foo = 123 : 49698ms 35 div.attributes : 13489ms 36 37 Chromium/V8 (with this patch): 38 div.classList : 1435ms 39 div.classList.foo = 123 : 1470ms 40 div.dataset : 1400ms 41 div.dataset.foo = 123 : 30396ms 42 div.attributes : 1242ms 43 44 No tests. No change in behavior. 45 46 * bindings/v8/custom/V8DOMStringMapCustom.cpp: Modified as described above. 47 (WebCore::toV8): 48 * bindings/v8/custom/V8DOMTokenListCustom.cpp: Ditto. 49 (WebCore::toV8): 50 * bindings/v8/custom/V8NamedNodeMapCustom.cpp: Ditto. 51 (WebCore::toV8): 52 53 * bindings/v8/V8HiddenPropertyName.cpp: Defined a hidden property name string statically 54 to optimize the macro. 55 (WebCore): 56 (WebCore::V8HiddenPropertyName::hiddenReferenceName): 57 * bindings/v8/V8HiddenPropertyName.h: Modified to switch two prefixes "WebCore::HiddenProperty::" 58 and "WebCore::HiddenReference::", depending on whether a given name represents a hidden property 59 or a hidden reference. 60 (WebCore): 61 (V8HiddenPropertyName): 62 1 63 2012-03-07 Kent Tamura <tkent@chromium.org> 2 64 -
trunk/Source/WebCore/bindings/v8/V8HiddenPropertyName.cpp
r110019 r110137 34 34 #include "V8Binding.h" 35 35 #include <string.h> 36 #include <wtf/StdLibExtras.h> 36 37 #include <wtf/Vector.h> 37 38 … … 41 42 #define V8_AS_STRING_IMPL(x) #x 42 43 43 #define V8_DEFINE_PROPERTY(name) \ 44 #define V8_HIDDEN_PROPERTY_PREFIX "WebCore::HiddenProperty::" 45 46 #define V8_DEFINE_HIDDEN_PROPERTY(name) \ 44 47 v8::Handle<v8::String> V8HiddenPropertyName::name() \ 45 48 { \ 46 49 V8HiddenPropertyName* hiddenPropertyName = V8BindingPerIsolateData::current()->hiddenPropertyName(); \ 47 50 if (hiddenPropertyName->m_##name.IsEmpty()) { \ 48 hiddenPropertyName->m_##name = createString( "WebCore::HiddenProperty::"V8_AS_STRING(name)); \51 hiddenPropertyName->m_##name = createString(V8_HIDDEN_PROPERTY_PREFIX V8_AS_STRING(name)); \ 49 52 } \ 50 53 return hiddenPropertyName->m_##name; \ 51 54 } 52 55 53 V8_HIDDEN_PROPERTIES(V8_DEFINE_PROPERTY); 54 55 static const char hiddenReferenceNamePrefix[] = "WebCore::HiddenReference::"; 56 V8_HIDDEN_PROPERTIES(V8_DEFINE_HIDDEN_PROPERTY); 56 57 57 58 v8::Handle<v8::String> V8HiddenPropertyName::hiddenReferenceName(const char* name) 58 59 { 59 60 Vector<char, 64> prefixedName; 60 prefixedName.append( hiddenReferenceNamePrefix, sizeof(hiddenReferenceNamePrefix) - 1);61 prefixedName.append(V8_HIDDEN_PROPERTY_PREFIX, sizeof(V8_HIDDEN_PROPERTY_PREFIX) - 1); 61 62 ASSERT(name && strlen(name)); 62 63 prefixedName.append(name, strlen(name)); -
trunk/Source/WebCore/bindings/v8/V8HiddenPropertyName.h
r110019 r110137 45 45 V(toStringString) \ 46 46 V(event) \ 47 V(state) 48 47 V(state) \ 48 V(domStringMap) \ 49 V(domTokenList) \ 50 V(ownerNode) 49 51 50 52 class V8HiddenPropertyName { -
trunk/Source/WebCore/bindings/v8/custom/V8DOMStringMapCustom.cpp
r110019 r110137 95 95 v8::Handle<v8::Value> elementValue = toV8(element); 96 96 if (!elementValue.IsEmpty() && elementValue->IsObject()) 97 V8DOMWrapper::setNamedHiddenReference(elementValue.As<v8::Object>(), "domStringMap", wrapper);97 elementValue.As<v8::Object>()->SetHiddenValue(V8HiddenPropertyName::domStringMap(), wrapper); 98 98 } 99 99 return wrapper; -
trunk/Source/WebCore/bindings/v8/custom/V8DOMTokenListCustom.cpp
r110019 r110137 49 49 v8::Handle<v8::Value> elementValue = toV8(element); 50 50 if (!elementValue.IsEmpty() && elementValue->IsObject()) 51 V8DOMWrapper::setNamedHiddenReference(elementValue.As<v8::Object>(), "domTokenList", wrapper);51 elementValue.As<v8::Object>()->SetHiddenValue(V8HiddenPropertyName::domTokenList(), wrapper); 52 52 } 53 53 return wrapper; -
trunk/Source/WebCore/bindings/v8/custom/V8NamedNodeMapCustom.cpp
r110019 r110137 80 80 Element* element = impl->element(); 81 81 if (!wrapper.IsEmpty() && element) 82 V8DOMWrapper::setNamedHiddenReference(wrapper, "ownerNode", toV8(element));82 wrapper->SetHiddenValue(V8HiddenPropertyName::ownerNode(), toV8(element)); 83 83 return wrapper; 84 84 }
Note: See TracChangeset
for help on using the changeset viewer.