Title: [111688] trunk/Source/WebCore
Revision
111688
Author
[email protected]
Date
2012-03-22 07:12:31 -0700 (Thu, 22 Mar 2012)

Log Message

Web Inspector: Speed up the build retainers phase.
https://bugs.webkit.org/show_bug.cgi?id=81763

Replacing the edge iterator with a raw loop makes it
faster by more than 10 times.

Patch by Alexei Filippov <[email protected]> on 2012-03-22
Reviewed by Yury Semikhatsky.

* inspector/front-end/HeapSnapshot.js:
(WebInspector.HeapSnapshot.prototype._buildRetainers):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (111687 => 111688)


--- trunk/Source/WebCore/ChangeLog	2012-03-22 14:07:23 UTC (rev 111687)
+++ trunk/Source/WebCore/ChangeLog	2012-03-22 14:12:31 UTC (rev 111688)
@@ -1,3 +1,16 @@
+2012-03-22  Alexei Filippov  <[email protected]>
+
+        Web Inspector: Speed up the build retainers phase.
+        https://bugs.webkit.org/show_bug.cgi?id=81763
+
+        Replacing the edge iterator with a raw loop makes it
+        faster by more than 10 times.
+
+        Reviewed by Yury Semikhatsky.
+
+        * inspector/front-end/HeapSnapshot.js:
+        (WebInspector.HeapSnapshot.prototype._buildRetainers):
+
 2012-03-22  No'am Rosenthal  <[email protected]>
 
         [Qt][WK2] The background appears to have one extra pixel from the contents

Modified: trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js (111687 => 111688)


--- trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js	2012-03-22 14:07:23 UTC (rev 111687)
+++ trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js	2012-03-22 14:12:31 UTC (rev 111688)
@@ -959,22 +959,56 @@
 
     _buildRetainers: function()
     {
-        this._buildReverseIndex(
-            "_retainerIndex",
-            "_retainers",
-            (function (node, callback)
-             {
-                 for (var edgesIter = node.edges; edgesIter.hasNext(); edgesIter.next())
-                     callback(this._nodePosition[edgesIter.edge.nodeIndex]);
-             }).bind(this),
-            (function (node, indexCallback, dataCallback)
-             {
-                 for (var edgesIter = node.edges; edgesIter.hasNext(); edgesIter.next()) {
-                     var edge = edgesIter.edge;
-                     var retIndex = this._getRetainerIndex(edge.nodeIndex);
-                     dataCallback(indexCallback(retIndex), node.nodeIndex + this._firstEdgeOffset + edge.edgeIndex);
-                 }
-             }).bind(this));
+        var nodeIndexes = this.nodeIndexes;
+        var nodePositions = this._nodePosition;
+        var nodeCount = this.nodeCount;
+        var nodes = this._nodes;
+
+        // Builds up two arrays:
+        //  - "backRefsArray" is a continuous array, where each node owns an
+        //    interval (can be empty) with corresponding back references.
+        //  - "indexArray" is an array of indexes in the "backRefsArray"
+        //    with the same positions as in the _nodeIndex.
+        var indexArray = this._retainerIndex = new Int32Array(nodeCount);
+        var edgesCountOffset = this._edgesCountOffset;
+        var firstEdgeOffset = this._firstEdgeOffset;
+        var edgeFieldsCount = this._edgeFieldsCount;
+        var edgeToNodeOffset = this._edgeToNodeOffset;
+        var backRefsCount = 0;
+        // Count the number of retainers for each node
+        for (var i = 0; i < nodeCount; ++i) {
+            var nodeIndex = nodeIndexes[i];
+            var edgesOffset = nodeIndex + firstEdgeOffset + edgeToNodeOffset;
+            var edgesCount = nodes[nodeIndex + edgesCountOffset];
+            backRefsCount += edgesCount;
+            for (var j = 0; j < edgesCount; ++j) {
+              var targetNodeIndex = nodes[j * edgeFieldsCount + edgesOffset];
+              ++indexArray[nodePositions[targetNodeIndex]];
+            }
+        }
+        var backRefsArray = this._retainers = new Int32Array(backRefsCount);
+        // Put in the first slot of each backRefsArray slice the count of entries
+        // that will be filled.
+        var backRefsPosition = 0;
+        for (i = 0; i < nodeCount; ++i) {
+            backRefsCount = backRefsArray[backRefsPosition] = indexArray[i];
+            indexArray[i] = backRefsPosition;
+            backRefsPosition += backRefsCount;
+        }
+        var retainerIndex = this._retainerIndex;
+        // Fill up the retainers array with indexes of edges.
+        for (var i = 0; i < nodeCount; ++i) {
+            var nodeIndex = nodeIndexes[i];
+            var edgesOffset = nodeIndex + firstEdgeOffset;
+            var edgesCount = nodes[nodeIndex + edgesCountOffset];
+            for (var j = 0; j < edgesCount; ++j) {
+                var edgeIndex = j * edgeFieldsCount + edgesOffset;
+                var retNode = nodePositions[nodes[edgeIndex + edgeToNodeOffset]];
+                var retIndex = indexArray[retNode];
+                var backRefIndex = retIndex + (--backRefsArray[retIndex]);
+                backRefsArray[backRefIndex] = edgeIndex;
+            }
+        }
     },
 
     _calculateObjectToWindowDistance: function()
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to