Changeset 111688 in webkit


Ignore:
Timestamp:
Mar 22, 2012 7:12:31 AM (12 years ago)
Author:
yurys@chromium.org
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 <alexeif@chromium.org> on 2012-03-22
Reviewed by Yury Semikhatsky.

  • inspector/front-end/HeapSnapshot.js:

(WebInspector.HeapSnapshot.prototype._buildRetainers):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r111687 r111688  
     12012-03-22  Alexei Filippov  <alexeif@chromium.org>
     2
     3        Web Inspector: Speed up the build retainers phase.
     4        https://bugs.webkit.org/show_bug.cgi?id=81763
     5
     6        Replacing the edge iterator with a raw loop makes it
     7        faster by more than 10 times.
     8
     9        Reviewed by Yury Semikhatsky.
     10
     11        * inspector/front-end/HeapSnapshot.js:
     12        (WebInspector.HeapSnapshot.prototype._buildRetainers):
     13
    1142012-03-22  No'am Rosenthal  <noam.rosenthal@nokia.com>
    215
  • trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js

    r111553 r111688  
    960960    _buildRetainers: function()
    961961    {
    962         this._buildReverseIndex(
    963             "_retainerIndex",
    964             "_retainers",
    965             (function (node, callback)
    966              {
    967                  for (var edgesIter = node.edges; edgesIter.hasNext(); edgesIter.next())
    968                      callback(this._nodePosition[edgesIter.edge.nodeIndex]);
    969              }).bind(this),
    970             (function (node, indexCallback, dataCallback)
    971              {
    972                  for (var edgesIter = node.edges; edgesIter.hasNext(); edgesIter.next()) {
    973                      var edge = edgesIter.edge;
    974                      var retIndex = this._getRetainerIndex(edge.nodeIndex);
    975                      dataCallback(indexCallback(retIndex), node.nodeIndex + this._firstEdgeOffset + edge.edgeIndex);
    976                  }
    977              }).bind(this));
     962        var nodeIndexes = this.nodeIndexes;
     963        var nodePositions = this._nodePosition;
     964        var nodeCount = this.nodeCount;
     965        var nodes = this._nodes;
     966
     967        // Builds up two arrays:
     968        //  - "backRefsArray" is a continuous array, where each node owns an
     969        //    interval (can be empty) with corresponding back references.
     970        //  - "indexArray" is an array of indexes in the "backRefsArray"
     971        //    with the same positions as in the _nodeIndex.
     972        var indexArray = this._retainerIndex = new Int32Array(nodeCount);
     973        var edgesCountOffset = this._edgesCountOffset;
     974        var firstEdgeOffset = this._firstEdgeOffset;
     975        var edgeFieldsCount = this._edgeFieldsCount;
     976        var edgeToNodeOffset = this._edgeToNodeOffset;
     977        var backRefsCount = 0;
     978        // Count the number of retainers for each node
     979        for (var i = 0; i < nodeCount; ++i) {
     980            var nodeIndex = nodeIndexes[i];
     981            var edgesOffset = nodeIndex + firstEdgeOffset + edgeToNodeOffset;
     982            var edgesCount = nodes[nodeIndex + edgesCountOffset];
     983            backRefsCount += edgesCount;
     984            for (var j = 0; j < edgesCount; ++j) {
     985              var targetNodeIndex = nodes[j * edgeFieldsCount + edgesOffset];
     986              ++indexArray[nodePositions[targetNodeIndex]];
     987            }
     988        }
     989        var backRefsArray = this._retainers = new Int32Array(backRefsCount);
     990        // Put in the first slot of each backRefsArray slice the count of entries
     991        // that will be filled.
     992        var backRefsPosition = 0;
     993        for (i = 0; i < nodeCount; ++i) {
     994            backRefsCount = backRefsArray[backRefsPosition] = indexArray[i];
     995            indexArray[i] = backRefsPosition;
     996            backRefsPosition += backRefsCount;
     997        }
     998        var retainerIndex = this._retainerIndex;
     999        // Fill up the retainers array with indexes of edges.
     1000        for (var i = 0; i < nodeCount; ++i) {
     1001            var nodeIndex = nodeIndexes[i];
     1002            var edgesOffset = nodeIndex + firstEdgeOffset;
     1003            var edgesCount = nodes[nodeIndex + edgesCountOffset];
     1004            for (var j = 0; j < edgesCount; ++j) {
     1005                var edgeIndex = j * edgeFieldsCount + edgesOffset;
     1006                var retNode = nodePositions[nodes[edgeIndex + edgeToNodeOffset]];
     1007                var retIndex = indexArray[retNode];
     1008                var backRefIndex = retIndex + (--backRefsArray[retIndex]);
     1009                backRefsArray[backRefIndex] = edgeIndex;
     1010            }
     1011        }
    9781012    },
    9791013
Note: See TracChangeset for help on using the changeset viewer.