Changeset 112090 in webkit


Ignore:
Timestamp:
Mar 26, 2012 7:32:52 AM (12 years ago)
Author:
yurys@chromium.org
Message:

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

Replacing the edge iterator in retainers building phase
makes it run 10 times faster (400 ms vs. 4 sec).

Patch by Alexei Filippov <alexeif@chromium.org> on 2012-03-26
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

    r112087 r112090  
     12012-03-26  Alexei Filippov  <alexeif@chromium.org>
     2
     3        Web Inspector: Speed up the retainers build phase.
     4        https://bugs.webkit.org/show_bug.cgi?id=81763
     5
     6        Replacing the edge iterator in retainers building phase
     7        makes it run 10 times faster (400 ms vs. 4 sec).
     8
     9        Reviewed by Yury Semikhatsky.
     10
     11        * inspector/front-end/HeapSnapshot.js:
     12        (WebInspector.HeapSnapshot.prototype._buildRetainers):
     13
    1142012-03-22  Alexander Pavlov  <apavlov@chromium.org>
    215
  • trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js

    r112071 r112090  
    10701070    _buildRetainers: function()
    10711071    {
    1072         this._buildReverseIndex(
    1073             "_retainerIndex",
    1074             "_retainers",
    1075             (function (node, callback)
    1076              {
    1077                  for (var edgesIter = node.edges; edgesIter.hasNext(); edgesIter.next())
    1078                      callback(this._nodePosition[edgesIter.edge.nodeIndex]);
    1079              }).bind(this),
    1080             (function (node, indexCallback, dataCallback)
    1081              {
    1082                  for (var edgesIter = node.edges; edgesIter.hasNext(); edgesIter.next()) {
    1083                      var edge = edgesIter.edge;
    1084                      var retIndex = this._getRetainerIndex(edge.nodeIndex);
    1085                      dataCallback(indexCallback(retIndex), node.nodeIndex + this._firstEdgeOffset + edge.edgeIndex);
    1086                  }
    1087              }).bind(this));
     1072        var nodeIndexes = this.nodeIndexes;
     1073        var nodePositions = this._nodePosition;
     1074        var nodeCount = this.nodeCount;
     1075        var nodes = this._nodes;
     1076
     1077        // Builds up two arrays:
     1078        //  - "backRefsArray" is a continuous array, where each node owns an
     1079        //    interval (can be empty) with corresponding back references.
     1080        //  - "indexArray" is an array of indexes in the "backRefsArray"
     1081        //    with the same positions as in the _nodeIndex.
     1082        var indexArray = this._retainerIndex = new Int32Array(nodeCount + 1);
     1083        var edgesCountOffset = this._edgesCountOffset;
     1084        var firstEdgeOffset = this._firstEdgeOffset;
     1085        var edgeFieldsCount = this._edgeFieldsCount;
     1086        var edgeToNodeOffset = this._edgeToNodeOffset;
     1087        var backRefsCount = 0;
     1088        // Count the number of retainers for each node
     1089        for (var i = 0; i < nodeCount; ++i) {
     1090            var nodeIndex = nodeIndexes[i];
     1091            var edgesOffset = nodeIndex + firstEdgeOffset + edgeToNodeOffset;
     1092            var edgesCount = nodes[nodeIndex + edgesCountOffset];
     1093            backRefsCount += edgesCount;
     1094            for (var j = 0; j < edgesCount; ++j) {
     1095              var targetNodeIndex = nodes[j * edgeFieldsCount + edgesOffset];
     1096              ++indexArray[nodePositions[targetNodeIndex]];
     1097            }
     1098        }
     1099        var backRefsArray = this._retainers = new Int32Array(backRefsCount);
     1100        // Put in the first slot of each backRefsArray slice the count of entries
     1101        // that will be filled.
     1102        var backRefsPosition = 0;
     1103        // The one extra slot in the _retainerIndex array is set to the
     1104        // end of _retainers array. It is used in the retainers iterator.
     1105        for (i = 0; i <= nodeCount; ++i) {
     1106            backRefsCount = backRefsArray[backRefsPosition] = indexArray[i];
     1107            indexArray[i] = backRefsPosition;
     1108            backRefsPosition += backRefsCount;
     1109        }
     1110        var retainerIndex = this._retainerIndex;
     1111        // Fill up the retainers array with indexes of edges.
     1112        for (var i = 0; i < nodeCount; ++i) {
     1113            var nodeIndex = nodeIndexes[i];
     1114            var edgesOffset = nodeIndex + firstEdgeOffset;
     1115            var edgesCount = nodes[nodeIndex + edgesCountOffset];
     1116            for (var j = 0; j < edgesCount; ++j) {
     1117                var edgeIndex = j * edgeFieldsCount + edgesOffset;
     1118                var retNode = nodePositions[nodes[edgeIndex + edgeToNodeOffset]];
     1119                var retIndex = indexArray[retNode];
     1120                var backRefIndex = retIndex + (--backRefsArray[retIndex]);
     1121                backRefsArray[backRefIndex] = edgeIndex;
     1122            }
     1123        }
    10881124    },
    10891125
Note: See TracChangeset for help on using the changeset viewer.