Changeset 117962 in webkit
- Timestamp:
- May 22, 2012 6:25:54 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r117959 r117962 1 2012-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 1 15 2012-05-22 Christophe Dumez <christophe.dumez@intel.com> 2 16 -
trunk/LayoutTests/inspector/profiler/heap-snapshot.html
r117953 r117962 99 99 { 100 100 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]; 103 103 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"); 105 105 next(); 106 106 }, … … 110 110 var snapshot = new WebInspector.HeapSnapshot(InspectorTest.createHeapSnapshotMock()); 111 111 var result = snapshot._buildPostOrderIndex(); 112 var dominatorsTree = snapshot._buildDominatorTree(result.postOrderIndex2Node Index, 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]; 114 114 for (var i = 0; i < expected.length; ++i) 115 115 InspectorTest.assertEquals(expected[i], dominatorsTree[i], "Dominators Tree"); -
trunk/Source/WebCore/ChangeLog
r117961 r117962 1 2012-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 1 21 2012-05-22 Yury Semikhatsky <yurys@chromium.org> 2 22 -
trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js
r117953 r117962 459 459 get dominatorIndex() 460 460 { 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; 462 463 }, 463 464 … … 721 722 this._calculateObjectToWindowDistance(); 722 723 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); 724 726 this._calculateRetainedSizes(); 725 727 this._buildDominatedNodes(); … … 1088 1090 1089 1091 var nodesToVisit = new Uint32Array(nodeCount); 1090 var postOrderIndex2Node Index= new Uint32Array(nodeCount);1092 var postOrderIndex2NodeOrdinal = new Uint32Array(nodeCount); 1091 1093 var nodeOrdinal2PostOrderIndex = new Uint32Array(nodeCount); 1092 1094 var painted = new Uint8Array(nodeCount); … … 1126 1128 } else { 1127 1129 nodeOrdinal2PostOrderIndex[nodeOrdinal] = postOrderIndex; 1128 postOrderIndex2Node Index[postOrderIndex++] = nodeIndex;1130 postOrderIndex2NodeOrdinal[postOrderIndex++] = nodeOrdinal; 1129 1131 --nodesToVisitLength; 1130 1132 } 1131 1133 } 1132 return {postOrderIndex2Node Index: postOrderIndex2NodeIndex, nodeOrdinal2PostOrderIndex: nodeOrdinal2PostOrderIndex};1134 return {postOrderIndex2NodeOrdinal: postOrderIndex2NodeOrdinal, nodeOrdinal2PostOrderIndex: nodeOrdinal2PostOrderIndex}; 1133 1135 }, 1134 1136 … … 1137 1139 // Softw. Pract. Exper. 4 (2001), pp. 1-10. 1138 1140 /** 1139 * @param {Array.<number>} postOrderIndex2Node Index1141 * @param {Array.<number>} postOrderIndex2NodeOrdinal 1140 1142 * @param {Array.<number>} nodeOrdinal2PostOrderIndex 1141 1143 */ 1142 _buildDominatorTree: function(postOrderIndex2Node Index, nodeOrdinal2PostOrderIndex)1144 _buildDominatorTree: function(postOrderIndex2NodeOrdinal, nodeOrdinal2PostOrderIndex) 1143 1145 { 1144 1146 var nodeFieldCount = this._nodeFieldCount; … … 1159 1161 var flag = this._nodeFlags.pageObject; 1160 1162 1161 var nodesCount = postOrderIndex2Node Index.length;1163 var nodesCount = postOrderIndex2NodeOrdinal.length; 1162 1164 var rootPostOrderedIndex = nodesCount - 1; 1163 1165 var noEntry = nodesCount; … … 1194 1196 if (dominators[postOrderIndex] === rootPostOrderedIndex) 1195 1197 continue; 1196 var nodeOrdinal = postOrderIndex2Node Index[postOrderIndex] / nodeFieldCount;1198 var nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex]; 1197 1199 var nodeFlag = !!(flags[nodeOrdinal] & flag); 1198 1200 var newDominatorIndex = noEntry; … … 1232 1234 dominators[postOrderIndex] = newDominatorIndex; 1233 1235 changed = true; 1234 node Index = postOrderIndex2NodeIndex[postOrderIndex];1235 node Ordinal = nodeIndex /nodeFieldCount;1236 nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex]; 1237 nodeIndex = nodeOrdinal * nodeFieldCount; 1236 1238 beginEdgeToNodeFieldIndex = nodes[nodeIndex + firstEdgeIndexOffset] + edgeToNodeOffset; 1237 1239 endEdgeToNodeFieldIndex = nodeOrdinal < nodesCount - 1 … … 1250 1252 var dominatorsTree = new Uint32Array(nodesCount); 1251 1253 for (var postOrderIndex = 0, l = dominators.length; postOrderIndex < l; ++postOrderIndex) { 1252 var nodeOrdinal = postOrderIndex2Node Index[postOrderIndex] / nodeFieldCount;1253 dominatorsTree[nodeOrdinal] = postOrderIndex2Node Index[dominators[postOrderIndex]];1254 var nodeOrdinal = postOrderIndex2NodeOrdinal[postOrderIndex]; 1255 dominatorsTree[nodeOrdinal] = postOrderIndex2NodeOrdinal[dominators[postOrderIndex]]; 1254 1256 } 1255 1257 return dominatorsTree; … … 1275 1277 retainedSizes[currentNodeOrdinal] += nodeSelfSize; 1276 1278 do { 1277 currentNodeOrdinal = dominatorsTree[currentNodeOrdinal] / nodeFieldCount;1279 currentNodeOrdinal = dominatorsTree[currentNodeOrdinal]; 1278 1280 retainedSizes[currentNodeOrdinal] += nodeSelfSize; 1279 1281 } while (currentNodeOrdinal !== rootNodeOrdinal); … … 1298 1300 var dominatorsTree = this._dominatorsTree; 1299 1301 for (var nodeOrdinal = 1, l = this.nodeCount; nodeOrdinal < l; ++nodeOrdinal) 1300 ++indexArray[dominatorsTree[nodeOrdinal] / this._nodeFieldCount];1302 ++indexArray[dominatorsTree[nodeOrdinal]]; 1301 1303 // Put in the first slot of each dominatedNodes slice the count of entries 1302 1304 // that will be filled. … … 1311 1313 // index 0) as it is the only node that dominates itself. 1312 1314 for (var nodeOrdinal = 1, l = this.nodeCount; nodeOrdinal < l; ++nodeOrdinal) { 1313 var dominatorOrdinal = dominatorsTree[nodeOrdinal] / nodeFieldCount;1315 var dominatorOrdinal = dominatorsTree[nodeOrdinal]; 1314 1316 var dominatedRefIndex = indexArray[dominatorOrdinal]; 1315 1317 dominatedRefIndex += (--dominatedNodes[dominatedRefIndex]);
Note: See TracChangeset
for help on using the changeset viewer.