| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 'profiler': null, | 178 'profiler': null, |
| 179 'function-creation': null, | 179 'function-creation': null, |
| 180 'function-move': null, | 180 'function-move': null, |
| 181 'function-delete': null, | 181 'function-delete': null, |
| 182 'heap-sample-item': null, | 182 'heap-sample-item': null, |
| 183 // Obsolete row types. | 183 // Obsolete row types. |
| 184 'code-allocate': null, | 184 'code-allocate': null, |
| 185 'begin-code-region': null, | 185 'begin-code-region': null, |
| 186 'end-code-region': null }); | 186 'end-code-region': null }); |
| 187 | 187 |
| 188 this.timeline_ = ""; |
| 188 this.cppEntriesProvider_ = cppEntriesProvider; | 189 this.cppEntriesProvider_ = cppEntriesProvider; |
| 189 this.callGraphSize_ = callGraphSize; | 190 this.callGraphSize_ = callGraphSize; |
| 190 this.ignoreUnknown_ = ignoreUnknown; | 191 this.ignoreUnknown_ = ignoreUnknown; |
| 191 this.stateFilter_ = stateFilter; | 192 this.stateFilter_ = stateFilter; |
| 192 this.snapshotLogProcessor_ = snapshotLogProcessor; | 193 this.snapshotLogProcessor_ = snapshotLogProcessor; |
| 193 this.deserializedEntriesNames_ = []; | 194 this.deserializedEntriesNames_ = []; |
| 194 var ticks = this.ticks_ = | 195 var ticks = this.ticks_ = |
| 195 { total: 0, unaccounted: 0, excluded: 0, gc: 0 }; | 196 { total: 0, unaccounted: 0, excluded: 0, gc: 0 }; |
| 196 | 197 |
| 197 V8Profile.prototype.handleUnknownCode = function( | 198 V8Profile.prototype.handleUnknownCode = function( |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 this.deserializedEntriesNames_[addr] = | 341 this.deserializedEntriesNames_[addr] = |
| 341 this.snapshotLogProcessor_.getSerializedEntryName(pos); | 342 this.snapshotLogProcessor_.getSerializedEntryName(pos); |
| 342 } | 343 } |
| 343 }; | 344 }; |
| 344 | 345 |
| 345 | 346 |
| 346 TickProcessor.prototype.includeTick = function(vmState) { | 347 TickProcessor.prototype.includeTick = function(vmState) { |
| 347 return this.stateFilter_ == null || this.stateFilter_ == vmState; | 348 return this.stateFilter_ == null || this.stateFilter_ == vmState; |
| 348 }; | 349 }; |
| 349 | 350 |
| 351 TickProcessor.prototype.recordTickTimeline = function(vmState) { |
| 352 if (vmState == TickProcessor.VmStates.JS) this.timeline_ += "J"; |
| 353 else if (vmState == TickProcessor.VmStates.GC) this.timeline_ += "G"; |
| 354 else if (vmState == TickProcessor.VmStates.COMPILER) this.timeline_ += "C"; |
| 355 else if (vmState == TickProcessor.VmStates.PARALLEL_COMPILER_PROLOGUE) this.ti
meline_ += "|"; |
| 356 else if (vmState == TickProcessor.VmStates.OTHER) this.timeline_ += "O"; |
| 357 else if (vmState == TickProcessor.VmStates.EXTERNAL) this.timeline_ += "."; |
| 358 else this.timeline_ += "U"; |
| 359 } |
| 360 |
| 350 TickProcessor.prototype.processTick = function(pc, | 361 TickProcessor.prototype.processTick = function(pc, |
| 351 sp, | 362 sp, |
| 352 is_external_callback, | 363 is_external_callback, |
| 353 tos_or_external_callback, | 364 tos_or_external_callback, |
| 354 vmState, | 365 vmState, |
| 355 stack) { | 366 stack) { |
| 356 this.ticks_.total++; | 367 this.ticks_.total++; |
| 368 this.recordTickTimeline(vmState); |
| 357 if (vmState == TickProcessor.VmStates.GC) this.ticks_.gc++; | 369 if (vmState == TickProcessor.VmStates.GC) this.ticks_.gc++; |
| 358 if (!this.includeTick(vmState)) { | 370 if (!this.includeTick(vmState)) { |
| 359 this.ticks_.excluded++; | 371 this.ticks_.excluded++; |
| 360 return; | 372 return; |
| 361 } | 373 } |
| 362 if (is_external_callback) { | 374 if (is_external_callback) { |
| 363 // Don't use PC when in external callback code, as it can point | 375 // Don't use PC when in external callback code, as it can point |
| 364 // inside callback's code, and we will erroneously report | 376 // inside callback's code, and we will erroneously report |
| 365 // that a callback calls itself. Instead we use tos_or_external_callback, | 377 // that a callback calls itself. Instead we use tos_or_external_callback, |
| 366 // as simply resetting PC will produce unaccounted ticks. | 378 // as simply resetting PC will produce unaccounted ticks. |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 this.printHeavyProfHeader(); | 470 this.printHeavyProfHeader(); |
| 459 var heavyProfile = this.profile_.getBottomUpProfile(); | 471 var heavyProfile = this.profile_.getBottomUpProfile(); |
| 460 var heavyView = this.viewBuilder_.buildView(heavyProfile); | 472 var heavyView = this.viewBuilder_.buildView(heavyProfile); |
| 461 // To show the same percentages as in the flat profile. | 473 // To show the same percentages as in the flat profile. |
| 462 heavyView.head.totalTime = totalTicks; | 474 heavyView.head.totalTime = totalTicks; |
| 463 // Sort by total time, desc, then by name, desc. | 475 // Sort by total time, desc, then by name, desc. |
| 464 heavyView.sort(function(rec1, rec2) { | 476 heavyView.sort(function(rec1, rec2) { |
| 465 return rec2.totalTime - rec1.totalTime || | 477 return rec2.totalTime - rec1.totalTime || |
| 466 (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); }); | 478 (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); }); |
| 467 this.printHeavyProfile(heavyView.head.children); | 479 this.printHeavyProfile(heavyView.head.children); |
| 480 |
| 481 print('Visual Execution Timeline: '); |
| 482 var sliceLength = 80; |
| 483 var sliceStart = 0; |
| 484 while (sliceStart < this.timeline_.length) { |
| 485 print(this.timeline_.slice(sliceStart, sliceStart + sliceLength)); |
| 486 sliceStart += sliceLength; |
| 487 } |
| 468 }; | 488 }; |
| 469 | 489 |
| 470 | 490 |
| 471 function padLeft(s, len) { | 491 function padLeft(s, len) { |
| 472 s = s.toString(); | 492 s = s.toString(); |
| 473 if (s.length < len) { | 493 if (s.length < len) { |
| 474 var padLength = len - s.length; | 494 var padLength = len - s.length; |
| 475 if (!(padLength in padLeft)) { | 495 if (!(padLength in padLeft)) { |
| 476 padLeft[padLength] = new Array(padLength + 1).join(' '); | 496 padLeft[padLength] = new Array(padLength + 1).join(' '); |
| 477 } | 497 } |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) { | 890 if (arg !== synArg && dispatch === this.argsDispatch_[synArg]) { |
| 871 synonims.push(synArg); | 891 synonims.push(synArg); |
| 872 delete this.argsDispatch_[synArg]; | 892 delete this.argsDispatch_[synArg]; |
| 873 } | 893 } |
| 874 } | 894 } |
| 875 print(' ' + padRight(synonims.join(', '), 20) + dispatch[2]); | 895 print(' ' + padRight(synonims.join(', '), 20) + dispatch[2]); |
| 876 } | 896 } |
| 877 quit(2); | 897 quit(2); |
| 878 }; | 898 }; |
| 879 | 899 |
| OLD | NEW |