Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 | 69 |
| 70 /** | 70 /** |
| 71 * Creates a Profile View object. It allows to perform sorting | 71 * Creates a Profile View object. It allows to perform sorting |
| 72 * and filtering actions on the profile. Profile View mimicks | 72 * and filtering actions on the profile. Profile View mimicks |
| 73 * the Profile object from WebKit's JSC profiler. | 73 * the Profile object from WebKit's JSC profiler. |
| 74 * | 74 * |
| 75 * @param {devtools.profiler.ProfileView.Node} head Head (root) node. | 75 * @param {devtools.profiler.ProfileView.Node} head Head (root) node. |
| 76 * @constructor | 76 * @constructor |
| 77 */ | 77 */ |
| 78 devtools.profiler.ProfileView = function(head) { | 78 devtools.profiler.ProfileView = function(head) { |
| 79 this.head = head; | 79 this.head = head; |
|
Søren Thygesen Gjesse
2009/04/29 21:46:22
Trailing underscores?
Mikhail Naganov
2009/04/30 08:06:02
No. This is for compatibility with WebInspector or
| |
| 80 this.title = ''; | |
| 81 this.uid = ''; | |
| 82 this.heavyProfile = null; | |
| 83 this.treeProfile = null; | |
| 84 this.flatProfile = null; | |
| 80 }; | 85 }; |
| 81 | 86 |
| 82 | 87 |
| 88 /** | |
| 89 * Updates references between profiles. This is needed for WebKit | |
| 90 * ProfileView. | |
| 91 */ | |
| 92 devtools.profiler.ProfileView.prototype.updateProfilesRefs = function() { | |
| 93 var profileNames = ["treeProfile", "heavyProfile", "flatProfile"]; | |
| 94 for (var i = 0; i < profileNames.length; ++i) { | |
| 95 var destProfile = this[profileNames[i]]; | |
| 96 for (var j = 0; j < profileNames.length; ++j) { | |
| 97 destProfile[profileNames[j]] = this[profileNames[j]]; | |
|
Søren Thygesen Gjesse
2009/04/29 21:46:22
This means that each profile references itself as
Mikhail Naganov
2009/04/30 08:06:02
Well, it is needed in the version of WebInspector
| |
| 98 } | |
| 99 } | |
| 100 }; | |
| 101 | |
| 102 | |
| 83 /** | 103 /** |
| 84 * Sorts the profile view using the specified sort function. | 104 * Sorts the profile view using the specified sort function. |
| 85 * | 105 * |
| 86 * @param {function(devtools.profiler.ProfileView.Node, | 106 * @param {function(devtools.profiler.ProfileView.Node, |
| 87 * devtools.profiler.ProfileView.Node):number} sortFunc A sorting | 107 * devtools.profiler.ProfileView.Node):number} sortFunc A sorting |
| 88 * functions. Must comply with Array.sort sorting function requirements. | 108 * functions. Must comply with Array.sort sorting function requirements. |
| 89 */ | 109 */ |
| 90 devtools.profiler.ProfileView.prototype.sort = function(sortFunc) { | 110 devtools.profiler.ProfileView.prototype.sort = function(sortFunc) { |
| 91 this.traverse(function (node) { | 111 this.traverse(function (node) { |
| 92 node.sortChildren(sortFunc); | 112 node.sortChildren(sortFunc); |
| 93 }); | 113 }); |
| 94 }; | 114 }; |
| 95 | 115 |
| 96 | 116 |
| 97 /** | 117 /** |
| 118 * Sorts the profile view by self time, ascending. | |
| 119 */ | |
| 120 devtools.profiler.ProfileView.prototype.sortSelfTimeAscending = function() { | |
| 121 this.sort(function (node1, node2) { | |
| 122 return node1.selfTime - node2.selfTime; }); | |
| 123 }; | |
| 124 | |
| 125 | |
| 126 /** | |
| 127 * Sorts the profile view by self time, descending. | |
| 128 */ | |
| 129 devtools.profiler.ProfileView.prototype.sortSelfTimeDescending = function() { | |
| 130 this.sort(function (node1, node2) { | |
| 131 return node2.selfTime - node1.selfTime; }); | |
| 132 }; | |
| 133 | |
| 134 | |
| 135 /** | |
| 136 * Sorts the profile view by total time, ascending. | |
| 137 */ | |
| 138 devtools.profiler.ProfileView.prototype.sortTotalTimeAscending = function() { | |
| 139 this.sort(function (node1, node2) { | |
| 140 return node1.totalTime - node2.totalTime; }); | |
| 141 }; | |
| 142 | |
| 143 | |
| 144 /** | |
| 145 * Sorts the profile view by total time, descending. | |
| 146 */ | |
| 147 devtools.profiler.ProfileView.prototype.sortTotalTimeDescending = function() { | |
| 148 this.sort(function (node1, node2) { | |
| 149 return node2.totalTime - node1.totalTime; }); | |
| 150 }; | |
| 151 | |
| 152 | |
| 153 /** | |
| 154 * String comparator compatible with Array.sort requirements. | |
| 155 * | |
| 156 * @param {string} s1 First string. | |
| 157 * @param {string} s2 Second string. | |
| 158 */ | |
| 159 devtools.profiler.ProfileView.compareStrings = function(s1, s2) { | |
| 160 return s1 < s2 ? -1 : (s1 > s2 ? 1 : 0); | |
| 161 }; | |
| 162 | |
| 163 | |
| 164 /** | |
| 165 * Sorts the profile view by function name, ascending. | |
| 166 */ | |
| 167 devtools.profiler.ProfileView.prototype.sortFunctionNameAscending = function() { | |
| 168 this.sort(function (node1, node2) { | |
| 169 return devtools.profiler.ProfileView.compareStrings( | |
| 170 node1.functionName, node2.functionName); }); | |
| 171 }; | |
| 172 | |
| 173 | |
| 174 /** | |
| 175 * Sorts the profile view by function name, descending. | |
| 176 */ | |
| 177 devtools.profiler.ProfileView.prototype.sortFunctionNameDescending = function() { | |
| 178 this.sort(function (node1, node2) { | |
| 179 return devtools.profiler.ProfileView.compareStrings( | |
| 180 node2.functionName, node1.functionName); }); | |
| 181 }; | |
| 182 | |
| 183 | |
| 184 /** | |
| 98 * Traverses profile view nodes in preorder. | 185 * Traverses profile view nodes in preorder. |
| 99 * | 186 * |
| 100 * @param {function(devtools.profiler.ProfileView.Node)} f Visitor function. | 187 * @param {function(devtools.profiler.ProfileView.Node)} f Visitor function. |
| 101 */ | 188 */ |
| 102 devtools.profiler.ProfileView.prototype.traverse = function(f) { | 189 devtools.profiler.ProfileView.prototype.traverse = function(f) { |
| 103 var nodesToTraverse = new ConsArray(); | 190 var nodesToTraverse = new ConsArray(); |
| 104 nodesToTraverse.concat([this.head]); | 191 nodesToTraverse.concat([this.head]); |
| 105 while (!nodesToTraverse.atEnd()) { | 192 while (!nodesToTraverse.atEnd()) { |
| 106 var node = nodesToTraverse.next(); | 193 var node = nodesToTraverse.next(); |
| 107 f(node); | 194 f(node); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 118 * @param {number} totalTime Amount of time that application spent in the | 205 * @param {number} totalTime Amount of time that application spent in the |
| 119 * corresponding function and its descendants (not that depending on | 206 * corresponding function and its descendants (not that depending on |
| 120 * profile they can be either callees or callers.) | 207 * profile they can be either callees or callers.) |
| 121 * @param {number} selfTime Amount of time that application spent in the | 208 * @param {number} selfTime Amount of time that application spent in the |
| 122 * corresponding function only. | 209 * corresponding function only. |
| 123 * @param {devtools.profiler.ProfileView.Node} head Profile view head. | 210 * @param {devtools.profiler.ProfileView.Node} head Profile view head. |
| 124 * @constructor | 211 * @constructor |
| 125 */ | 212 */ |
| 126 devtools.profiler.ProfileView.Node = function( | 213 devtools.profiler.ProfileView.Node = function( |
| 127 internalFuncName, totalTime, selfTime, head) { | 214 internalFuncName, totalTime, selfTime, head) { |
| 215 this.callIdentifier = 0; | |
|
Søren Thygesen Gjesse
2009/04/29 21:46:22
Trailing underscores?
Mikhail Naganov
2009/04/30 08:06:02
No again. This is for compatibility with WebInspec
| |
| 128 this.internalFuncName = internalFuncName; | 216 this.internalFuncName = internalFuncName; |
| 217 this.initFuncInfo(); | |
| 129 this.totalTime = totalTime; | 218 this.totalTime = totalTime; |
| 130 this.selfTime = selfTime; | 219 this.selfTime = selfTime; |
| 131 this.head = head; | 220 this.head = head; |
| 132 this.parent = null; | 221 this.parent = null; |
| 133 this.children = []; | 222 this.children = []; |
| 223 this.visible = true; | |
| 134 }; | 224 }; |
| 135 | 225 |
| 136 | 226 |
| 227 /** | |
| 228 * RegEx for stripping V8's prefixes of compiled functions. | |
| 229 */ | |
| 230 devtools.profiler.ProfileView.Node.FUNC_NAME_STRIP_RE = | |
| 231 /^(?:LazyCompile|Function): (.*)$/; | |
|
Søren Thygesen Gjesse
2009/04/29 21:46:22
Maybe we should go and change the logged strings i
Mikhail Naganov
2009/04/30 08:06:02
I'm currently thinking on how to better transfer p
| |
| 232 | |
| 233 | |
| 234 /** | |
| 235 * RegEx for extracting script source URL and line number. | |
| 236 */ | |
| 237 devtools.profiler.ProfileView.Node.FUNC_NAME_PARSE_RE = /^([^ ]+) (.*):(\d+)$/; | |
| 238 | |
| 239 | |
| 240 /** | |
| 241 * RegEx for removing protocol name from URL. | |
| 242 */ | |
| 243 devtools.profiler.ProfileView.Node.URL_PARSE_RE = /^(?:http:\/)?.*\/([^/]+)$/; | |
| 244 | |
| 245 | |
| 246 /** | |
| 247 * Inits 'functionName', 'url', and 'lineNumber' fields using 'internalFuncName' | |
| 248 * field. | |
| 249 */ | |
| 250 devtools.profiler.ProfileView.Node.prototype.initFuncInfo = function() { | |
| 251 var nodeAlias = devtools.profiler.ProfileView.Node; | |
| 252 this.functionName = this.internalFuncName; | |
| 253 | |
| 254 var strippedName = nodeAlias.FUNC_NAME_STRIP_RE.exec(this.functionName); | |
| 255 if (strippedName) { | |
| 256 this.functionName = strippedName[1]; | |
| 257 } | |
| 258 | |
| 259 var parsedName = nodeAlias.FUNC_NAME_PARSE_RE.exec(this.functionName); | |
| 260 if (parsedName) { | |
| 261 this.url = parsedName[2]; | |
| 262 var parsedUrl = nodeAlias.URL_PARSE_RE.exec(this.url); | |
| 263 if (parsedUrl) { | |
| 264 this.url = parsedUrl[1]; | |
| 265 } | |
| 266 this.functionName = parsedName[1]; | |
| 267 this.lineNumber = parsedName[3]; | |
| 268 } else { | |
| 269 this.url = ''; | |
| 270 this.lineNumber = 0; | |
| 271 } | |
| 272 }; | |
| 273 | |
| 274 | |
| 137 /** | 275 /** |
| 138 * Returns a share of the function's total time in application's total time. | 276 * Returns a share of the function's total time in application's total time. |
| 139 */ | 277 */ |
| 140 devtools.profiler.ProfileView.Node.prototype.__defineGetter__( | 278 devtools.profiler.ProfileView.Node.prototype.__defineGetter__( |
| 141 'totalPercent', | 279 'totalPercent', |
| 142 function() { return this.totalTime / | 280 function() { return this.totalTime / |
| 143 (this.head ? this.head.totalTime : this.totalTime) * 100.0; }); | 281 (this.head ? this.head.totalTime : this.totalTime) * 100.0; }); |
| 144 | 282 |
| 145 | 283 |
| 146 /** | 284 /** |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 176 * Sorts all the node's children recursively. | 314 * Sorts all the node's children recursively. |
| 177 * | 315 * |
| 178 * @param {function(devtools.profiler.ProfileView.Node, | 316 * @param {function(devtools.profiler.ProfileView.Node, |
| 179 * devtools.profiler.ProfileView.Node):number} sortFunc A sorting | 317 * devtools.profiler.ProfileView.Node):number} sortFunc A sorting |
| 180 * functions. Must comply with Array.sort sorting function requirements. | 318 * functions. Must comply with Array.sort sorting function requirements. |
| 181 */ | 319 */ |
| 182 devtools.profiler.ProfileView.Node.prototype.sortChildren = function( | 320 devtools.profiler.ProfileView.Node.prototype.sortChildren = function( |
| 183 sortFunc) { | 321 sortFunc) { |
| 184 this.children.sort(sortFunc); | 322 this.children.sort(sortFunc); |
| 185 }; | 323 }; |
| OLD | NEW |