Changeset 112090 in webkit
- Timestamp:
- Mar 26, 2012 7:32:52 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r112087 r112090 1 2012-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 1 14 2012-03-22 Alexander Pavlov <apavlov@chromium.org> 2 15 -
trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js
r112071 r112090 1070 1070 _buildRetainers: function() 1071 1071 { 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 } 1088 1124 }, 1089 1125
Note: See TracChangeset
for help on using the changeset viewer.