Changeset 121022 in webkit
- Timestamp:
- Jun 22, 2012 7:08:05 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/PerformanceTests/ChangeLog
r120998 r121022 1 2012-06-22 Ilya Tikhonovsky <loislo@chromium.org> 2 3 Web Inspector: partially instrument DOM Tree native memory. 4 https://bugs.webkit.org/show_bug.cgi?id=89568 5 6 This patch adds MemoryInstrumentation class that counts all visited 7 objects and calls reportMemoryUsage. 8 9 Reviewed by Yury Semikhatsky. 10 11 * inspector/native-memory-snapshot.html: 12 1 13 2012-06-21 Kentaro Hara <haraken@chromium.org> 2 14 -
trunk/PerformanceTests/inspector/native-memory-snapshot.html
r120618 r121022 1 1 <html> 2 2 <head> 3 <style type="text/css"> 4 span { 5 color:red; 6 width: 100px; 7 height: 20px; 8 } 9 div { 10 color:blue; 11 width: 50px; 12 height: 10px; 13 } 14 </style> 3 15 <script src="../../LayoutTests/http/tests/inspector/inspector-test.js"></script> 4 16 <script src="performance-test.js"></script> … … 40 52 var root = document.getElementById("testTreeRoot"); 41 53 42 for (var i = 0; i < elementsCount; ++i) 43 root.appendChild(document.createElement("span")); 54 for (var i = 0; i < elementsCount; ++i) { 55 var span = document.createElement("span"); 56 span.id = "span_" + i; 57 span.style.width = "10px"; 58 root.appendChild(span); 59 } 44 60 45 61 for (var i = 0; i < elementsCount; ++i) -
trunk/Source/WebCore/ChangeLog
r121021 r121022 1 2012-06-22 Ilya Tikhonovsky <loislo@chromium.org> 2 3 Web Inspector: partially instrument DOM Tree native memory. 4 https://bugs.webkit.org/show_bug.cgi?id=89568 5 6 This patch adds MemoryInstrumentation class that counts all visited 7 objects and calls reportMemoryUsage for the instrumented classes. 8 9 Reviewed by Yury Semikhatsky. 10 11 * GNUmakefile.list.am: 12 * Target.pri: 13 * WebCore.gypi: 14 * WebCore.vcproj/WebCore.vcproj: 15 * WebCore.xcodeproj/project.pbxproj: 16 * bindings/js/ScriptWrappable.h: 17 (WebCore::ScriptWrappable::reportMemoryUsage): 18 (ScriptWrappable): 19 * bindings/v8/ScriptWrappable.h: 20 (WebCore::ScriptWrappable::reportMemoryUsage): 21 (ScriptWrappable): 22 * css/StylePropertySet.h: 23 (WebCore::StylePropertySet::reportMemoryUsage): 24 (StylePropertySet): 25 * dom/ContainerNode.h: 26 (WebCore::ContainerNode::reportMemoryUsage): 27 (ContainerNode): 28 * dom/Element.h: 29 (WebCore::Element::reportMemoryUsage): 30 (Element): 31 * dom/ElementAttributeData.h: 32 (WebCore::ElementAttributeData::reportMemoryUsage): 33 (ElementAttributeData): 34 * dom/MemoryInstrumentation.h: Added. 35 (WebCore): 36 (MemoryInstrumentation): 37 (WebCore::MemoryInstrumentation::~MemoryInstrumentation): 38 (WebCore::MemoryInstrumentation::reportObject): 39 (WebCore::MemoryInstrumentation::reportPointer): 40 (MemoryObjectInfo): 41 (WebCore::MemoryObjectInfo::MemoryObjectInfo): 42 (WebCore::MemoryObjectInfo::reportInstrumentedPointer): 43 (WebCore::MemoryObjectInfo::reportPointer): 44 (WebCore::MemoryObjectInfo::reportInstrumentedObject): 45 (WebCore::MemoryObjectInfo::reportObject): 46 (WebCore::MemoryObjectInfo::reportObjectInfo): 47 (WebCore::MemoryObjectInfo::objectType): 48 (WebCore::MemoryObjectInfo::objectSize): 49 (WebCore::MemoryInstrumentation::reportInstrumentedPointer): 50 (WebCore::MemoryInstrumentation::reportInstrumentedObject): 51 * dom/Node.cpp: 52 (WebCore::Node::reportMemoryUsage): 53 (WebCore): 54 * dom/Node.h: 55 (Node): 56 * dom/QualifiedName.h: 57 (WebCore::QualifiedName::QualifiedNameImpl::reportMemoryUsage): 58 (WebCore::QualifiedName::reportMemoryUsage): 59 * inspector/InspectorMemoryAgent.cpp: 60 (MemoryBlockName): 61 (WebCore): 62 (WebCore::addMemoryBlockFor): 63 (WebCore::domTreeInfo): 64 (WebCore::memoryCacheInfo): 65 (WebCore::InspectorMemoryAgent::getProcessMemoryDistribution): 66 * platform/TreeShared.h: 67 (WebCore::TreeShared::reportMemoryUsage): 68 (TreeShared): 69 1 70 2012-06-22 Peter Rybin <peter.rybin@gmail.com> 2 71 -
trunk/Source/WebCore/GNUmakefile.list.am
r121016 r121022 1908 1908 Source/WebCore/dom/KeyboardEvent.cpp \ 1909 1909 Source/WebCore/dom/KeyboardEvent.h \ 1910 Source/WebCore/dom/MemoryInstrumentation.h \ 1910 1911 Source/WebCore/dom/MessageChannel.cpp \ 1911 1912 Source/WebCore/dom/MessageChannel.h \ -
trunk/Source/WebCore/Target.pri
r121016 r121022 1746 1746 dom/FragmentScriptingPermission.h \ 1747 1747 dom/KeyboardEvent.h \ 1748 dom/MemoryInstrumentation.h \ 1748 1749 dom/MessageChannel.h \ 1749 1750 dom/MessageEvent.h \ -
trunk/Source/WebCore/WebCore.gypi
r121016 r121022 5343 5343 'dom/IconURL.h', 5344 5344 'dom/KeyboardEvent.cpp', 5345 'dom/MemoryInstrumentation.h', 5345 5346 'dom/MessageChannel.cpp', 5346 5347 'dom/MessageChannel.h', -
trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj
r121016 r121022 51192 51192 </File> 51193 51193 <File 51194 RelativePath="..\dom\MemoryInstrumentation.h" 51195 > 51196 </File> 51197 <File 51194 51198 RelativePath="..\dom\MessageChannel.cpp" 51195 51199 > -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r121016 r121022 1429 1429 4F1534E011B533020021FD86 /* EditingBehaviorTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F1534DF11B533020021FD86 /* EditingBehaviorTypes.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1430 1430 4F2D205412EAE7B3005C2874 /* InspectorAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F2D205212EAE7B3005C2874 /* InspectorAgent.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1431 4F32BB1B14FA85E800F6C1A3 /* MemoryInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F32BB1A14FA85AA00F6C1A3 /* MemoryInstrumentation.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1431 1432 4F2D205512EAE7B3005C2874 /* InspectorAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F2D205312EAE7B3005C2874 /* InspectorAgent.cpp */; }; 1432 1433 4F3289B511A42AAB005ABE7E /* InspectorValues.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F3289B311A42AAB005ABE7E /* InspectorValues.cpp */; }; … … 8502 8503 4F1534DF11B533020021FD86 /* EditingBehaviorTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditingBehaviorTypes.h; sourceTree = "<group>"; }; 8503 8504 4F2D205212EAE7B3005C2874 /* InspectorAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorAgent.h; sourceTree = "<group>"; }; 8505 4F32BB1A14FA85AA00F6C1A3 /* MemoryInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryInstrumentation.h; sourceTree = "<group>"; }; 8504 8506 4F2D205312EAE7B3005C2874 /* InspectorAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorAgent.cpp; sourceTree = "<group>"; }; 8505 8507 4F3289B311A42AAB005ABE7E /* InspectorValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorValues.cpp; sourceTree = "<group>"; }; … … 21415 21417 BC9A6145146859D9006057FD /* make_event_factory.pl */, 21416 21418 BC9A6146146859D9006057FD /* make_names.pl */, 21419 4F32BB1A14FA85AA00F6C1A3 /* MemoryInstrumentation.h */, 21417 21420 E1ADECCD0E76AD8B004A1A5E /* MessageChannel.cpp */, 21418 21421 E1ADECCC0E76AD8B004A1A5E /* MessageChannel.h */, … … 25143 25146 CE7B2DB51586ABAD0098B3FA /* TextAlternativeWithRange.h in Headers */, 25144 25147 50987C27157D676D00BDA835 /* CustomFilterGlobalContext.h in Headers */, 25148 4F32BB1B14FA85E800F6C1A3 /* MemoryInstrumentation.h in Headers */, 25145 25149 ); 25146 25150 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/WebCore/bindings/js/ScriptWrappable.h
r118483 r121022 55 55 } 56 56 57 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 58 { 59 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 60 memoryObjectInfo->reportObject(m_wrapper); 61 } 62 57 63 private: 58 64 JSC::Weak<JSDOMWrapper> m_wrapper; -
trunk/Source/WebCore/bindings/v8/ScriptWrappable.h
r95901 r121022 53 53 void clearWrapper() { m_wrapper = 0; } 54 54 55 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 56 { 57 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 58 memoryObjectInfo->reportPointer(m_wrapper, MemoryInstrumentation::DOM); 59 } 60 55 61 private: 56 62 v8::Persistent<v8::Object>* m_wrapper; -
trunk/Source/WebCore/css/StylePropertySet.h
r120696 r121022 26 26 #include "CSSProperty.h" 27 27 #include "CSSPropertyNames.h" 28 #include "MemoryInstrumentation.h" 28 29 #include <wtf/ListHashSet.h> 29 30 #include <wtf/Vector.h> … … 116 117 #endif 117 118 119 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 120 { 121 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::CSS); 122 if (m_isMutable) 123 memoryObjectInfo->reportPointer(m_mutablePropertyVector, MemoryInstrumentation::CSS); 124 } 125 118 126 private: 119 127 StylePropertySet(CSSParserMode); -
trunk/Source/WebCore/dom/ContainerNode.h
r118199 r121022 100 100 Node* traverseNextNode(const Node* stayWithin) const; 101 101 102 virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 103 { 104 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 105 Node::reportMemoryUsage(memoryObjectInfo); 106 memoryObjectInfo->reportInstrumentedPointer(m_firstChild); 107 memoryObjectInfo->reportInstrumentedPointer(m_lastChild); 108 } 109 102 110 protected: 103 111 ContainerNode(Document*, ConstructionType = CreateContainer); -
trunk/Source/WebCore/dom/Element.h
r120486 r121022 422 422 void setSavedLayerScrollOffset(const IntSize&); 423 423 424 virtual void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 425 { 426 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 427 ContainerNode::reportMemoryUsage(memoryObjectInfo); 428 memoryObjectInfo->reportInstrumentedObject(m_tagName); 429 memoryObjectInfo->reportInstrumentedPointer(m_attributeData.get()); 430 } 431 424 432 protected: 425 433 Element(const QualifiedName& tagName, Document* document, ConstructionType type) -
trunk/Source/WebCore/dom/ElementAttributeData.h
r119426 r121022 28 28 29 29 #include "Attribute.h" 30 #include "MemoryInstrumentation.h" 30 31 #include "SpaceSplitString.h" 31 32 #include "StylePropertySet.h" … … 99 100 PassRefPtr<Attr> attrIfExists(Element*, const QualifiedName&); 100 101 PassRefPtr<Attr> ensureAttr(Element*, const QualifiedName&); 102 103 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 104 { 105 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 106 memoryObjectInfo->reportInstrumentedPointer(m_inlineStyleDecl.get()); 107 memoryObjectInfo->reportInstrumentedPointer(m_attributeStyle.get()); 108 memoryObjectInfo->reportObject(m_classNames); 109 memoryObjectInfo->reportObject(m_idForStyleResolution); 110 memoryObjectInfo->reportObject(m_attributes); 111 } 101 112 102 113 private: -
trunk/Source/WebCore/dom/Node.cpp
r120979 r121022 2786 2786 } 2787 2787 2788 void Node::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 2789 { 2790 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 2791 TreeShared<Node, ContainerNode>::reportMemoryUsage(memoryObjectInfo); 2792 ScriptWrappable::reportMemoryUsage(memoryObjectInfo); 2793 memoryObjectInfo->reportPointer(m_document, MemoryInstrumentation::DOM); 2794 memoryObjectInfo->reportInstrumentedPointer(m_next); 2795 memoryObjectInfo->reportInstrumentedPointer(m_previous); 2796 } 2797 2788 2798 } // namespace WebCore 2789 2799 -
trunk/Source/WebCore/dom/Node.h
r120979 r121022 30 30 #include "KURLHash.h" 31 31 #include "LayoutTypes.h" 32 #include "MemoryInstrumentation.h" 32 33 #include "RenderStyleConstants.h" 33 34 #include "ScriptWrappable.h" … … 649 650 size_t numberOfScopedHTMLStyleChildren() const; 650 651 652 virtual void reportMemoryUsage(MemoryObjectInfo*) const; 653 651 654 private: 652 655 enum NodeFlags { -
trunk/Source/WebCore/dom/QualifiedName.h
r98316 r121022 21 21 #ifndef QualifiedName_h 22 22 #define QualifiedName_h 23 24 #include "MemoryInstrumentation.h" 23 25 24 26 #include <wtf/HashTraits.h> … … 49 51 mutable AtomicString m_localNameUpper; 50 52 53 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 54 { 55 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 56 memoryObjectInfo->reportObject(m_prefix); 57 memoryObjectInfo->reportObject(m_localName); 58 memoryObjectInfo->reportObject(m_namespace); 59 memoryObjectInfo->reportObject(m_localNameUpper); 60 } 51 61 private: 52 62 QualifiedNameImpl(const AtomicString& prefix, const AtomicString& localName, const AtomicString& namespaceURI) … … 93 103 static void init(); 94 104 105 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 106 { 107 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 108 memoryObjectInfo->reportInstrumentedPointer(m_impl); 109 } 95 110 private: 96 111 void init(const AtomicString& prefix, const AtomicString& localName, const AtomicString& namespaceURI); -
trunk/Source/WebCore/inspector/InspectorMemoryAgent.cpp
r121002 r121022 45 45 #include "InstrumentingAgents.h" 46 46 #include "MemoryCache.h" 47 #include "MemoryInstrumentation.h" 47 48 #include "MemoryUsageSupport.h" 48 49 #include "Node.h" … … 78 79 static const char renderTreeUsed[] = "RenderTreeUsed"; 79 80 static const char renderTreeAllocated[] = "RenderTreeAllocated"; 81 82 static const char dom[] = "DOM"; 83 static const char domTreeOther[] = "DOMTreeOther"; 84 static const char domTreeDOM[] = "DOMTreeDOM"; 85 static const char domTreeCSS[] = "DOMTreeCSS"; 80 86 } 81 87 … … 176 182 collectNodeNameInfo(node); 177 183 collectListenersInfo(node); 178 }179 180 void collectCharacterData(Node*)181 {182 184 } 183 185 … … 373 375 } 374 376 375 static void addMemoryBlockFor(TypeBuilder::Array<InspectorMemoryBlock>* array, const MemoryCache::TypeStatistic& statistic, const char* name)377 static void addMemoryBlockFor(TypeBuilder::Array<InspectorMemoryBlock>* array, size_t size, const char* name) 376 378 { 377 379 RefPtr<InspectorMemoryBlock> result = InspectorMemoryBlock::create().setName(name); 378 result->setSize(s tatistic.size);380 result->setSize(size); 379 381 array->addItem(result); 382 } 383 384 namespace { 385 386 class MemoryInstrumentationImpl : public MemoryInstrumentation { 387 public: 388 MemoryInstrumentationImpl() 389 { 390 for (int i = 0; i < LastTypeEntry; ++i) 391 m_totalSizes[i] = 0; 392 } 393 394 PassRefPtr<InspectorMemoryBlock> dumpStatistics() 395 { 396 size_t totalSize = 0; 397 for (int i = Other; i < LastTypeEntry; ++i) 398 totalSize += m_totalSizes[i]; 399 400 RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > domChildren = TypeBuilder::Array<InspectorMemoryBlock>::create(); 401 addMemoryBlockFor(domChildren.get(), m_totalSizes[Other], MemoryBlockName::domTreeOther); 402 addMemoryBlockFor(domChildren.get(), m_totalSizes[DOM], MemoryBlockName::domTreeDOM); 403 addMemoryBlockFor(domChildren.get(), m_totalSizes[CSS], MemoryBlockName::domTreeCSS); 404 405 RefPtr<InspectorMemoryBlock> dom = InspectorMemoryBlock::create().setName(MemoryBlockName::dom); 406 dom->setSize(totalSize); 407 dom->setChildren(domChildren.release()); 408 return dom.release(); 409 } 410 411 private: 412 virtual void countObjectSize(ObjectType objectType, size_t size) 413 { 414 ASSERT(objectType >= 0 && objectType < LastTypeEntry); 415 m_totalSizes[objectType] += size; 416 } 417 418 virtual bool visited(const void* object) 419 { 420 return !m_visitedObjects.add(object).isNewEntry; 421 } 422 size_t m_totalSizes[LastTypeEntry]; 423 typedef HashSet<const void*> VisitedObjects; 424 VisitedObjects m_visitedObjects; 425 }; 426 427 class DOMTreesIterator : public DOMWrapperVisitor { 428 public: 429 explicit DOMTreesIterator(Page* page) : m_page(page) { } 430 431 virtual void visitNode(Node* node) 432 { 433 if (node->document() && node->document()->frame() && m_page != node->document()->frame()->page()) 434 return; 435 436 m_domMemoryUsage.reportInstrumentedPointer(node); 437 } 438 439 virtual void visitJSExternalString(StringImpl*) { } 440 441 PassRefPtr<InspectorMemoryBlock> dumpStatistics() { return m_domMemoryUsage.dumpStatistics(); } 442 443 private: 444 Page* m_page; 445 MemoryInstrumentationImpl m_domMemoryUsage; 446 }; 447 448 } 449 450 static PassRefPtr<InspectorMemoryBlock> domTreeInfo(Page* page) 451 { 452 DOMTreesIterator domTreesIterator(page); 453 ScriptProfiler::visitJSDOMWrappers(&domTreesIterator); 454 455 // Make sure all documents reachable from the main frame are accounted. 456 for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) { 457 if (Document* doc = frame->document()) 458 domTreesIterator.visitNode(doc); 459 } 460 461 return domTreesIterator.dumpStatistics(); 380 462 } 381 463 … … 392 474 393 475 RefPtr<TypeBuilder::Array<InspectorMemoryBlock> > children = TypeBuilder::Array<InspectorMemoryBlock>::create(); 394 addMemoryBlockFor(children.get(), stats.images , MemoryBlockName::cachedImages);395 addMemoryBlockFor(children.get(), stats.cssStyleSheets , MemoryBlockName::cachedCssStyleSheets);396 addMemoryBlockFor(children.get(), stats.scripts , MemoryBlockName::cachedScripts);397 addMemoryBlockFor(children.get(), stats.xslStyleSheets , MemoryBlockName::cachedXslStyleSheets);398 addMemoryBlockFor(children.get(), stats.fonts , MemoryBlockName::cachedFonts);399 memoryCacheStats->setChildren(children );476 addMemoryBlockFor(children.get(), stats.images.size, MemoryBlockName::cachedImages); 477 addMemoryBlockFor(children.get(), stats.cssStyleSheets.size, MemoryBlockName::cachedCssStyleSheets); 478 addMemoryBlockFor(children.get(), stats.scripts.size, MemoryBlockName::cachedScripts); 479 addMemoryBlockFor(children.get(), stats.xslStyleSheets.size, MemoryBlockName::cachedXslStyleSheets); 480 addMemoryBlockFor(children.get(), stats.fonts.size, MemoryBlockName::cachedFonts); 481 memoryCacheStats->setChildren(children.get()); 400 482 return memoryCacheStats.release(); 401 483 } … … 414 496 children->addItem(memoryCacheInfo()); 415 497 children->addItem(renderTreeInfo(m_page)); // TODO: collect for all pages? 498 children->addItem(domTreeInfo(m_page)); // TODO: collect for all pages? 416 499 processMemory->setChildren(children); 417 500 } -
trunk/Source/WebCore/platform/TreeShared.h
r119943 r121022 112 112 #endif 113 113 114 void reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 115 { 116 memoryObjectInfo->reportObjectInfo(this, MemoryInstrumentation::DOM); 117 memoryObjectInfo->reportInstrumentedPointer(m_parent); 118 } 119 114 120 private: 115 121 #ifndef NDEBUG
Note: See TracChangeset
for help on using the changeset viewer.