Changeset 117962 in webkit


Ignore:
Timestamp:
May 22, 2012 6:25:54 AM (12 years ago)
Author:
loislo@chromium.org
Message:

Web Inspector: HeapSnapshot: speed-up calculateRetainedSize functon.
https://bugs.webkit.org/show_bug.cgi?id=87124

I found that in all dominators related functions we use nodeOrdinals.
At the moment we divide nodeIndex to nodeFieldCount and this operation too expensive for these simple algorithms.

Reviewed by Yury Semikhatsky.

Covered by existing tests.

Source/WebCore:

  • inspector/front-end/HeapSnapshot.js:

(WebInspector.HeapSnapshotNode.prototype.get dominatorIndex):
(WebInspector.HeapSnapshot.prototype._init):
(WebInspector.HeapSnapshot.prototype._buildPostOrderIndex):
(WebInspector.HeapSnapshot.prototype._buildDominatorTree):
(WebInspector.HeapSnapshot.prototype._calculateRetainedSizes):
(WebInspector.HeapSnapshot.prototype._buildDominatedNodes):

LayoutTests:

  • inspector/profiler/heap-snapshot.html:
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r117959 r117962  
     12012-05-22  Ilya Tikhonovsky  <loislo@chromium.org>
     2
     3        Web Inspector: HeapSnapshot: speed-up calculateRetainedSize functon.
     4        https://bugs.webkit.org/show_bug.cgi?id=87124
     5
     6        I found that in all dominators related functions we use nodeOrdinals.
     7        At the moment we divide nodeIndex to nodeFieldCount and this operation too expensive for these simple algorithms.
     8
     9        Reviewed by Yury Semikhatsky.
     10
     11        Covered by existing tests.
     12
     13        * inspector/profiler/heap-snapshot.html:
     14
    1152012-05-22  Christophe Dumez  <christophe.dumez@intel.com>
    216
  • trunk/LayoutTests/inspector/profiler/heap-snapshot.html

    r117953 r117962  
    9999        {
    100100            var snapshot = new WebInspector.HeapSnapshot(InspectorTest.createHeapSnapshotMock());
    101             var postOrderIndex = snapshot._buildPostOrderIndex().postOrderIndex2NodeIndex;
    102             var expected = [28,35,21,14,7,0];
     101            var postOrderIndex2NodeOrdinal = snapshot._buildPostOrderIndex().postOrderIndex2NodeOrdinal;
     102            var expected = [4,5,3,2,1,0];
    103103            for (var i = 0; i < expected.length; ++i)
    104                 InspectorTest.assertEquals(expected[i], postOrderIndex[i], "Post ordered indexes");
     104                InspectorTest.assertEquals(expected[i], postOrderIndex2NodeOrdinal[i], "Post ordered indexes");
    105105            next();
    106106        },
     
    110110            var snapshot = new WebInspector.HeapSnapshot(InspectorTest.createHeapSnapshotMock());
    111111            var result = snapshot._buildPostOrderIndex();
    112             var dominatorsTree = snapshot._buildDominatorTree(result.postOrderIndex2NodeIndex, result.nodeOrdinal2PostOrderIndex);
    113             var expected = [0, 0, 0, 0, 14, 21];
     112            var dominatorsTree = snapshot._buildDominatorTree(result.postOrderIndex2NodeOrdinal, result.nodeOrdinal2PostOrderIndex);
     113            var expected = [0, 0, 0, 0, 2, 3];
    114114            for (var i = 0; i < expected.length; ++i)
    115115                InspectorTest.assertEquals(expected[i], dominatorsTree[i], "Dominators Tree");
  • trunk/Source/WebCore/ChangeLog

    r117961 r117962  
     12012-05-22  Ilya Tikhonovsky  <loislo@chromium.org>
     2
     3        Web Inspector: HeapSnapshot: speed-up calculateRetainedSize functon.
     4        https://bugs.webkit.org/show_bug.cgi?id=87124
     5
     6        I found that in all dominators related functions we use nodeOrdinals.
     7        At the moment we divide nodeIndex to nodeFieldCount and this operation too expensive for these simple algorithms.
     8
     9        Reviewed by Yury Semikhatsky.
     10
     11        Covered by existing tests.
     12
     13        * inspector/front-end/HeapSnapshot.js:
     14        (WebInspector.HeapSnapshotNode.prototype.get dominatorIndex):
     15        (WebInspector.HeapSnapshot.prototype._init):
     16        (WebInspector.HeapSnapshot.prototype._buildPostOrderIndex):
     17        (WebInspector.HeapSnapshot.prototype._buildDominatorTree):
     18        (WebInspector.HeapSnapshot.prototype._calculateRetainedSizes):
     19        (WebInspector.HeapSnapshot.prototype._buildDominatedNodes):
     20
    1212012-05-22  Yury Semikhatsky  <yurys@chromium.org>
    222
  • trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js

    r117953 r117962  
    459459    get dominatorIndex()
    460460    {
    461         return this._snapshot._dominatorsTree[this.nodeIndex / this._snapshot._nodeFieldCount];
     461        var nodeFieldCount = this._snapshot._nodeFieldCount;
     462        return this._snapshot._dominatorsTree[this.nodeIndex / this._snapshot._nodeFieldCount] * nodeFieldCount;
    462463    },
    463464
     
    721722        this._calculateObjectToWindowDistance();
    722723        var result = this._buildPostOrderIndex();
    723         this._dominatorsTree = this._buildDominatorTree(result.postOrderIndex2NodeIndex, result.nodeOrdinal2PostOrderIndex);
     724        // Actually it is array that maps node ordinal number to dominator node ordinal number.
     725        this._dominatorsTree = this._buildDominatorTree(result.postOrderIndex2NodeOrdinal, result.nodeOrdinal2PostOrderIndex);
    724726        this._calculateRetainedSizes();
    725727        this._buildDominatedNodes();
     
    10881090
    10891091        var nodesToVisit = new Uint32Array(nodeCount);
    1090         var postOrderIndex2NodeIndex = new Uint32Array(nodeCount);
     1092        var postOrderIndex2NodeOrdinal = new Uint32Array(nodeCount);
    10911093        var nodeOrdinal2PostOrderIndex = new Uint32Array(nodeCount);
    10921094        var painted = new Uint8Array(nodeCount);
     
    11261128            } else {
    11271129                nodeOrdinal2PostOrderIndex[nodeOrdinal] = postOrderIndex;
    1128                 postOrderIndex2NodeIndex[postOrderIndex++] = nodeIndex;
     1130                postOrderIndex2NodeOrdinal[postOrderIndex++] = nodeOrdinal;
    11291131                --nodesToVisitLength;
    11301132            }
    11311133        }
    1132         return {postOrderIndex2NodeIndex: postOrderIndex2NodeIndex, nodeOrdinal2PostOrderIndex: nodeOrdinal2PostOrderIndex};
     1134        return {postOrderIndex2NodeOrdinal: postOrderIndex2NodeOrdinal, nodeOrdinal2PostOrderIndex: nodeOrdinal2PostOrderIndex};
    11331135    },
    11341136
     
    11371139    // Softw. Pract. Exper. 4 (2001), pp. 1-10.
    11381140    /**
    1139      * @param {Array.<number>} postOrderIndex2NodeIndex
     1141     * @param {Array.<number>} postOrderIndex2NodeOrdinal
    11401142     * @param {Array.<number>} nodeOrdinal2PostOrderIndex
    11411143     */
    1142     _buildDominatorTree: function(postOrderIndex2NodeIndex, nodeOrdinal2PostOrderIndex)
     1144    _buildDominatorTree: function(postOrderIndex2NodeOrdinal, nodeOrdinal2PostOrderIndex)
    11431145    {
    11441146        var nodeFieldCount = this._nodeFieldCount;
     
    11591161        var flag = this._nodeFlags.pageObject;
    11601162
    1161         var nodesCount = postOrderIndex2NodeIndex.length;
     1163        var nodesCount = postOrderIndex2NodeOrdinal.length;
    11621164        var rootPostOrderedIndex = nodesCount - 1;
    11631165        var noEntry = nodesCount;
     
    11941196                if (dominators[postOrderIndex] === rootPostOrderedIndex)
    11951197                    continue;
    1196                 var nodeOrdinal = postOrderIndex2NodeIndex[postOrderIndex] / nodeFieldCount;
     1198                var nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex];
    11971199                var nodeFlag = !!(flags[nodeOrdinal] & flag);
    11981200                var newDominatorIndex = noEntry;
     
    12321234                    dominators[postOrderIndex] = newDominatorIndex;
    12331235                    changed = true;
    1234                     nodeIndex = postOrderIndex2NodeIndex[postOrderIndex];
    1235                     nodeOrdinal = nodeIndex / nodeFieldCount;
     1236                    nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex];
     1237                    nodeIndex = nodeOrdinal * nodeFieldCount;
    12361238                    beginEdgeToNodeFieldIndex = nodes[nodeIndex + firstEdgeIndexOffset] + edgeToNodeOffset;
    12371239                    endEdgeToNodeFieldIndex = nodeOrdinal < nodesCount - 1
     
    12501252        var dominatorsTree = new Uint32Array(nodesCount);
    12511253        for (var postOrderIndex = 0, l = dominators.length; postOrderIndex < l; ++postOrderIndex) {
    1252             var nodeOrdinal = postOrderIndex2NodeIndex[postOrderIndex] / nodeFieldCount;
    1253             dominatorsTree[nodeOrdinal] = postOrderIndex2NodeIndex[dominators[postOrderIndex]];
     1254            var nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex];
     1255            dominatorsTree[nodeOrdinal] = postOrderIndex2NodeOrdinal[dominators[postOrderIndex]];
    12541256        }
    12551257        return dominatorsTree;
     
    12751277            retainedSizes[currentNodeOrdinal] += nodeSelfSize;
    12761278            do {
    1277                 currentNodeOrdinal = dominatorsTree[currentNodeOrdinal] / nodeFieldCount;
     1279                currentNodeOrdinal = dominatorsTree[currentNodeOrdinal];
    12781280                retainedSizes[currentNodeOrdinal] += nodeSelfSize;
    12791281            } while (currentNodeOrdinal !== rootNodeOrdinal);
     
    12981300        var dominatorsTree = this._dominatorsTree;
    12991301        for (var nodeOrdinal = 1, l = this.nodeCount; nodeOrdinal < l; ++nodeOrdinal)
    1300             ++indexArray[dominatorsTree[nodeOrdinal] / this._nodeFieldCount];
     1302            ++indexArray[dominatorsTree[nodeOrdinal]];
    13011303        // Put in the first slot of each dominatedNodes slice the count of entries
    13021304        // that will be filled.
     
    13111313        // index 0) as it is the only node that dominates itself.
    13121314        for (var nodeOrdinal = 1, l = this.nodeCount; nodeOrdinal < l; ++nodeOrdinal) {
    1313             var dominatorOrdinal = dominatorsTree[nodeOrdinal] / nodeFieldCount;
     1315            var dominatorOrdinal = dominatorsTree[nodeOrdinal];
    13141316            var dominatedRefIndex = indexArray[dominatorOrdinal];
    13151317            dominatedRefIndex += (--dominatedNodes[dominatedRefIndex]);
Note: See TracChangeset for help on using the changeset viewer.