Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
519847b489 | ||
|
|
6d4f3499da | ||
|
|
ad49dacb29 | ||
|
|
6562fec7a7 | ||
|
|
23d4042e04 | ||
|
|
9961ed8295 | ||
|
|
e35335fe3c | ||
|
|
86f4ba636d | ||
|
|
0fe0c454d3 | ||
|
|
4b292b2acf | ||
|
|
d78d20e005 |
+30
-1
@@ -1,5 +1,34 @@
|
||||
## Unreleased
|
||||
|
||||
## [1.3.2] - 2018-12-03
|
||||
|
||||
* Fixed import of multithreaded Chrome profiles [#19] (by @jlfwong)
|
||||
|
||||
### Fixed
|
||||
|
||||
## [1.3.1] - 2018-11-08
|
||||
|
||||
### Fixed
|
||||
|
||||
* Fixed a file import performance regression by using TextDecoder [#188] (by @jlfwong)
|
||||
|
||||
## [1.3.0] - 2018-10-29
|
||||
|
||||
### Added
|
||||
|
||||
* Support import from Haskell GHC JSON format support [#183] (by @trishume)
|
||||
|
||||
### Fixed
|
||||
|
||||
* Make the wasd keymappings work on azerty keyboards [#184] (by @vrischmann)
|
||||
* Fix import of binary formats via profileURL [#179] (by @f-hj)
|
||||
|
||||
## [1.2.0] - 2018-10-08
|
||||
|
||||
### Added
|
||||
|
||||
* Add import of v8 heap allocation profile [#170] (by @vmarchaud)
|
||||
|
||||
## [1.1.0] - 2018-09-26
|
||||
|
||||
### Added
|
||||
@@ -24,7 +53,7 @@
|
||||
|
||||
* Allow optional CR before LF when probing collapsed stacks files [#154]
|
||||
* Fix import for Firefox 63 [#156]
|
||||
* Change time formatting for minutes from 1.50min to 1:30 [#153]
|
||||
* Change time formatting for minutes from 1.50min to 1:30 [#153] (by @Alex-Diez)
|
||||
|
||||
## [1.0.1] - 2018-08-23
|
||||
|
||||
|
||||
@@ -40,9 +40,12 @@ speedscope is designed to ingest profiles from a variety of different profilers
|
||||
- Ruby
|
||||
- [Importing from stackprof](https://github.com/jlfwong/speedscope/wiki/Importing-from-stackprof-(ruby))
|
||||
- [Importing from rbspy](https://github.com/jlfwong/speedscope/wiki/Importing-from-rbspy-(ruby))
|
||||
- Go
|
||||
- [Importing from pprof](https://github.com/jlfwong/speedscope/wiki/Importing-from-pprof-(go))
|
||||
- Native code
|
||||
- [Importing from Instruments.app](https://github.com/jlfwong/speedscope/wiki/Importing-from-Instruments.app) (macOS)
|
||||
- [Importing from `perf`](https://github.com/jlfwong/speedscope/wiki/Importing-from-perf-(linux)) (linux)
|
||||
- [Importing from GHC (Haskell)](https://github.com/jlfwong/speedscope/wiki/Importing-from-Haskell)
|
||||
- [Importing from custom sources](https://github.com/jlfwong/speedscope/wiki/Importing-from-custom-sources)
|
||||
|
||||
Contributions to add support for additional formats are welcome! See issues with the ["import source" tag](https://github.com/jlfwong/speedscope/issues?q=is%3Aissue+is%3Aopen+label%3A%22import+source%22).
|
||||
|
||||
+5
-21
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "1.1.0",
|
||||
"version": "1.3.2",
|
||||
"description": "",
|
||||
"repository": "jlfwong/speedscope",
|
||||
"main": "index.js",
|
||||
@@ -17,15 +17,8 @@
|
||||
"test": "tsc --noEmit && npm run lint && npm run coverage",
|
||||
"serve": "parcel assets/index.html --open --no-autoinstall"
|
||||
},
|
||||
"files": [
|
||||
"bin/cli.js",
|
||||
"dist/release/**",
|
||||
"!*.map"
|
||||
],
|
||||
"browserslist": [
|
||||
"last 2 Chrome versions",
|
||||
"last 2 Firefox versions"
|
||||
],
|
||||
"files": ["bin/cli.js", "dist/release/**", "!*.map"],
|
||||
"browserslist": ["last 2 Chrome versions", "last 2 Firefox versions"],
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
@@ -58,17 +51,8 @@
|
||||
"^.+\\.tsx?$": "ts-jest"
|
||||
},
|
||||
"testRegex": "\\.test\\.tsx?$",
|
||||
"collectCoverageFrom": [
|
||||
"**/*.{ts,tsx}",
|
||||
"!**/*.d.{ts,tsx}"
|
||||
],
|
||||
"moduleFileExtensions": [
|
||||
"ts",
|
||||
"tsx",
|
||||
"js",
|
||||
"jsx",
|
||||
"json"
|
||||
]
|
||||
"collectCoverageFrom": ["**/*.{ts,tsx}", "!**/*.d.{ts,tsx}"],
|
||||
"moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json"]
|
||||
},
|
||||
"dependencies": {
|
||||
"opn": "5.3.0"
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,28 @@
|
||||
<script>
|
||||
function banana() {
|
||||
let prod = 1
|
||||
for (let i = 1; i < 1000; i++) {
|
||||
prod *= i
|
||||
}
|
||||
return prod
|
||||
}
|
||||
|
||||
function apple() {
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
banana()
|
||||
}
|
||||
}
|
||||
|
||||
let bounces = 0
|
||||
|
||||
const worker = new Worker('./worker.js')
|
||||
|
||||
worker.onmessage = function() {
|
||||
apple()
|
||||
if (bounces++ < 10) {
|
||||
worker.postMessage('ping')
|
||||
}
|
||||
}
|
||||
|
||||
worker.postMessage('ping')
|
||||
</script>
|
||||
@@ -0,0 +1,18 @@
|
||||
function gamma() {
|
||||
let prod = 1
|
||||
for (let i = 1; i < 1000; i++) {
|
||||
prod *= i
|
||||
}
|
||||
return prod
|
||||
}
|
||||
|
||||
function alpha() {
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
|
||||
onmessage = function(e) {
|
||||
alpha()
|
||||
postMessage('pong')
|
||||
}
|
||||
@@ -515,6 +515,845 @@ exports[`importFromChromeTimeline Chrome 69: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromChromeTimeline Chrome 69: profileGroup.name 1`] = `"simple.json"`;
|
||||
|
||||
exports[`importFromChromeTimeline Workers Chrome 70 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": 0,
|
||||
"file": "extensions::SafeBuiltins",
|
||||
"key": "(anonymous):extensions::SafeBuiltins:0:0",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 37463,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::SafeBuiltins",
|
||||
"key": "(anonymous):extensions::SafeBuiltins:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 37463,
|
||||
},
|
||||
Frame {
|
||||
"col": 20,
|
||||
"file": "extensions::SafeBuiltins",
|
||||
"key": "saveBuiltin:extensions::SafeBuiltins:24:20",
|
||||
"line": 24,
|
||||
"name": "saveBuiltin",
|
||||
"selfWeight": 233,
|
||||
"totalWeight": 9858,
|
||||
},
|
||||
Frame {
|
||||
"col": 21,
|
||||
"file": "extensions::SafeBuiltins",
|
||||
"key": "makeCallable:extensions::SafeBuiltins:6:21",
|
||||
"line": 6,
|
||||
"name": "makeCallable",
|
||||
"selfWeight": 122,
|
||||
"totalWeight": 7007,
|
||||
},
|
||||
Frame {
|
||||
"col": 32,
|
||||
"file": "extensions::SafeBuiltins",
|
||||
"key": "(anonymous):extensions::SafeBuiltins:7:32",
|
||||
"line": 7,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 234,
|
||||
"totalWeight": 234,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "(program):undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "(program)",
|
||||
"selfWeight": 48725,
|
||||
"totalWeight": 48827,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "(garbage collector):undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "(garbage collector)",
|
||||
"selfWeight": 3380,
|
||||
"totalWeight": 3380,
|
||||
},
|
||||
Frame {
|
||||
"col": 0,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "(anonymous):chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:0:0",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 1550,
|
||||
"totalWeight": 15220,
|
||||
},
|
||||
Frame {
|
||||
"col": 466,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "La:chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:34:466",
|
||||
"line": 34,
|
||||
"name": "La",
|
||||
"selfWeight": 407,
|
||||
"totalWeight": 11272,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "get webstore:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "get webstore",
|
||||
"selfWeight": 287,
|
||||
"totalWeight": 15564,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::runtime",
|
||||
"key": "(anonymous):extensions::runtime:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 2319,
|
||||
"totalWeight": 15277,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "privates:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "privates",
|
||||
"selfWeight": 1751,
|
||||
"totalWeight": 6636,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::binding",
|
||||
"key": "(anonymous):extensions::binding:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 791,
|
||||
"totalWeight": 4994,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::event_bindings",
|
||||
"key": "(anonymous):extensions::event_bindings:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 822,
|
||||
"totalWeight": 4068,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::sendRequest",
|
||||
"key": "(anonymous):extensions::sendRequest:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 761,
|
||||
"totalWeight": 2844,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::schemaUtils",
|
||||
"key": "(anonymous):extensions::schemaUtils:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 847,
|
||||
"totalWeight": 1814,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::json_schema",
|
||||
"key": "(anonymous):extensions::json_schema:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 834,
|
||||
"totalWeight": 834,
|
||||
},
|
||||
Frame {
|
||||
"col": 15,
|
||||
"file": "extensions::utils",
|
||||
"key": "expose:extensions::utils:97:15",
|
||||
"line": 97,
|
||||
"name": "expose",
|
||||
"selfWeight": 147,
|
||||
"totalWeight": 293,
|
||||
},
|
||||
Frame {
|
||||
"col": 35,
|
||||
"file": "extensions::SafeBuiltins",
|
||||
"key": "target.(anonymous function):extensions::SafeBuiltins:9:35",
|
||||
"line": 9,
|
||||
"name": "target.(anonymous function)",
|
||||
"selfWeight": 727,
|
||||
"totalWeight": 7136,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "Apply:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "Apply",
|
||||
"selfWeight": 2187,
|
||||
"totalWeight": 6547,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::messaging",
|
||||
"key": "(anonymous):extensions::messaging:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 151,
|
||||
"totalWeight": 428,
|
||||
},
|
||||
Frame {
|
||||
"col": 20,
|
||||
"file": "extensions::binding",
|
||||
"key": "generate:extensions::binding:198:20",
|
||||
"line": 198,
|
||||
"name": "generate",
|
||||
"selfWeight": 149,
|
||||
"totalWeight": 7002,
|
||||
},
|
||||
Frame {
|
||||
"col": 36,
|
||||
"file": "extensions::binding",
|
||||
"key": "shouldCheckUnprivileged:extensions::binding:208:36",
|
||||
"line": 208,
|
||||
"name": "shouldCheckUnprivileged",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 146,
|
||||
},
|
||||
Frame {
|
||||
"col": 43,
|
||||
"file": "extensions::binding",
|
||||
"key": "(anonymous):extensions::binding:252:43",
|
||||
"line": 252,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3651,
|
||||
},
|
||||
Frame {
|
||||
"col": 49,
|
||||
"file": "extensions::json_schema",
|
||||
"key": "JSONSchemaValidator.addTypes:extensions::json_schema:173:49",
|
||||
"line": 173,
|
||||
"name": "JSONSchemaValidator.addTypes",
|
||||
"selfWeight": 149,
|
||||
"totalWeight": 149,
|
||||
},
|
||||
Frame {
|
||||
"col": 45,
|
||||
"file": "extensions::binding",
|
||||
"key": "(anonymous):extensions::binding:270:45",
|
||||
"line": 270,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 546,
|
||||
"totalWeight": 3349,
|
||||
},
|
||||
Frame {
|
||||
"col": 47,
|
||||
"file": "extensions::binding",
|
||||
"key": "(anonymous):extensions::binding:322:47",
|
||||
"line": 322,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 159,
|
||||
"totalWeight": 586,
|
||||
},
|
||||
Frame {
|
||||
"col": 44,
|
||||
"file": "extensions::binding",
|
||||
"key": "(anonymous):extensions::binding:396:44",
|
||||
"line": 396,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 142,
|
||||
"totalWeight": 802,
|
||||
},
|
||||
Frame {
|
||||
"col": 16,
|
||||
"file": "extensions::event_bindings",
|
||||
"key": "Event:extensions::event_bindings:512:16",
|
||||
"line": 512,
|
||||
"name": "Event",
|
||||
"selfWeight": 139,
|
||||
"totalWeight": 527,
|
||||
},
|
||||
Frame {
|
||||
"col": 51,
|
||||
"file": "extensions::utils",
|
||||
"key": "privates.constructPrivate:extensions::utils:101:51",
|
||||
"line": 101,
|
||||
"name": "privates.constructPrivate",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 388,
|
||||
},
|
||||
Frame {
|
||||
"col": 20,
|
||||
"file": "extensions::event_bindings",
|
||||
"key": "EventImpl:extensions::event_bindings:212:20",
|
||||
"line": 212,
|
||||
"name": "EventImpl",
|
||||
"selfWeight": 251,
|
||||
"totalWeight": 251,
|
||||
},
|
||||
Frame {
|
||||
"col": 26,
|
||||
"file": "extensions::binding",
|
||||
"key": "addProperties:extensions::binding:424:26",
|
||||
"line": 424,
|
||||
"name": "addProperties",
|
||||
"selfWeight": 149,
|
||||
"totalWeight": 710,
|
||||
},
|
||||
Frame {
|
||||
"col": 16,
|
||||
"file": "extensions::utils",
|
||||
"key": "forEach:extensions::utils:26:16",
|
||||
"line": 26,
|
||||
"name": "forEach",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 561,
|
||||
},
|
||||
Frame {
|
||||
"col": 21,
|
||||
"file": "extensions::binding",
|
||||
"key": "runHooks_:extensions::binding:179:21",
|
||||
"line": 179,
|
||||
"name": "runHooks_",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 273,
|
||||
},
|
||||
Frame {
|
||||
"col": 46,
|
||||
"file": "extensions::binding",
|
||||
"key": "(anonymous):extensions::binding:180:46",
|
||||
"line": 180,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 141,
|
||||
"totalWeight": 273,
|
||||
},
|
||||
Frame {
|
||||
"col": 35,
|
||||
"file": "extensions::runtime",
|
||||
"key": "(anonymous):extensions::runtime:16:35",
|
||||
"line": 16,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 132,
|
||||
"totalWeight": 132,
|
||||
},
|
||||
Frame {
|
||||
"col": 260,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "l:chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:37:260",
|
||||
"line": 37,
|
||||
"name": "l",
|
||||
"selfWeight": 127,
|
||||
"totalWeight": 127,
|
||||
},
|
||||
Frame {
|
||||
"col": 43,
|
||||
"file": "extensions::utils",
|
||||
"key": "publicClassPrototype.(anonymous function):extensions::utils:135:43",
|
||||
"line": 135,
|
||||
"name": "publicClassPrototype.(anonymous function)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 276,
|
||||
},
|
||||
Frame {
|
||||
"col": 44,
|
||||
"file": "extensions::event_bindings",
|
||||
"key": "EventImpl.addListener:extensions::event_bindings:272:44",
|
||||
"line": 272,
|
||||
"name": "EventImpl.addListener",
|
||||
"selfWeight": 135,
|
||||
"totalWeight": 135,
|
||||
},
|
||||
Frame {
|
||||
"col": 161,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "bb:chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:57:161",
|
||||
"line": 57,
|
||||
"name": "bb",
|
||||
"selfWeight": 146,
|
||||
"totalWeight": 146,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "(anonymous):chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:64:9",
|
||||
"line": 64,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 141,
|
||||
"totalWeight": 1071,
|
||||
},
|
||||
Frame {
|
||||
"col": 46,
|
||||
"file": "extensions::SafeBuiltins",
|
||||
"key": "(anonymous):extensions::SafeBuiltins:65:46",
|
||||
"line": 65,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 116,
|
||||
"totalWeight": 27605,
|
||||
},
|
||||
Frame {
|
||||
"col": 0,
|
||||
"file": "chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js",
|
||||
"key": "(anonymous):chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js:0:0",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 542,
|
||||
"totalWeight": 6218,
|
||||
},
|
||||
Frame {
|
||||
"col": 25,
|
||||
"file": "chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js",
|
||||
"key": "insertTextScript:chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js:30:25",
|
||||
"line": 30,
|
||||
"name": "insertTextScript",
|
||||
"selfWeight": 392,
|
||||
"totalWeight": 977,
|
||||
},
|
||||
Frame {
|
||||
"col": 25,
|
||||
"file": "chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js",
|
||||
"key": "insertHeaderNode:chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js:57:25",
|
||||
"line": 57,
|
||||
"name": "insertHeaderNode",
|
||||
"selfWeight": 292,
|
||||
"totalWeight": 585,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "appendChild:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "appendChild",
|
||||
"selfWeight": 145,
|
||||
"totalWeight": 293,
|
||||
},
|
||||
Frame {
|
||||
"col": 0,
|
||||
"file": undefined,
|
||||
"key": "(anonymous):undefined:0:0",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 148,
|
||||
},
|
||||
Frame {
|
||||
"col": 13,
|
||||
"file": undefined,
|
||||
"key": "(anonymous):undefined:6:13",
|
||||
"line": 6,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 148,
|
||||
"totalWeight": 148,
|
||||
},
|
||||
Frame {
|
||||
"col": 25,
|
||||
"file": "chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js",
|
||||
"key": "listenForMessage:chrome-extension://denbgaamihkadbghdceggmchnflmhpmk/contentScript.js:24:25",
|
||||
"line": 24,
|
||||
"name": "listenForMessage",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4699,
|
||||
},
|
||||
Frame {
|
||||
"col": 9,
|
||||
"file": "extensions::uncaught_exception_handler",
|
||||
"key": "(anonymous):extensions::uncaught_exception_handler:0:9",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 121,
|
||||
"totalWeight": 121,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "(anonymous):undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 135,
|
||||
"totalWeight": 135,
|
||||
},
|
||||
Frame {
|
||||
"col": 8,
|
||||
"file": "http://127.0.0.1:8081/worker.html",
|
||||
"key": "(anonymous):http://127.0.0.1:8081/worker.html:0:8",
|
||||
"line": 0,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 939,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "Worker:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "Worker",
|
||||
"selfWeight": 416,
|
||||
"totalWeight": 939,
|
||||
},
|
||||
Frame {
|
||||
"col": 11,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "cb:chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:49:11",
|
||||
"line": 49,
|
||||
"name": "cb",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 359,
|
||||
},
|
||||
Frame {
|
||||
"col": 314,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "$a:chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:46:314",
|
||||
"line": 46,
|
||||
"name": "$a",
|
||||
"selfWeight": 278,
|
||||
"totalWeight": 359,
|
||||
},
|
||||
Frame {
|
||||
"col": 51,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "(anonymous):chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:50:51",
|
||||
"line": 50,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 683,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "setTimeout:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "setTimeout",
|
||||
"selfWeight": 63,
|
||||
"totalWeight": 704,
|
||||
},
|
||||
Frame {
|
||||
"col": 144,
|
||||
"file": "chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js",
|
||||
"key": "(anonymous):chrome-extension://aomjjhallfgjeglblehebfpbcfeobpgk/injected.min.js:50:144",
|
||||
"line": 50,
|
||||
"name": "(anonymous)",
|
||||
"selfWeight": 117,
|
||||
"totalWeight": 678,
|
||||
},
|
||||
Frame {
|
||||
"col": 29,
|
||||
"file": "http://127.0.0.1:8081/worker.html",
|
||||
"key": "worker.onmessage:http://127.0.0.1:8081/worker.html:19:29",
|
||||
"line": 19,
|
||||
"name": "worker.onmessage",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 21103,
|
||||
},
|
||||
Frame {
|
||||
"col": 16,
|
||||
"file": "http://127.0.0.1:8081/worker.html",
|
||||
"key": "apple:http://127.0.0.1:8081/worker.html:9:16",
|
||||
"line": 9,
|
||||
"name": "apple",
|
||||
"selfWeight": 660,
|
||||
"totalWeight": 20852,
|
||||
},
|
||||
Frame {
|
||||
"col": 17,
|
||||
"file": "http://127.0.0.1:8081/worker.html",
|
||||
"key": "banana:http://127.0.0.1:8081/worker.html:1:17",
|
||||
"line": 1,
|
||||
"name": "banana",
|
||||
"selfWeight": 18755,
|
||||
"totalWeight": 20192,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "postMessage:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "postMessage",
|
||||
"selfWeight": 251,
|
||||
"totalWeight": 251,
|
||||
},
|
||||
],
|
||||
"name": "worker.json - CrRendererMain",
|
||||
"stacks": Array [
|
||||
" 15.06ms",
|
||||
"(anonymous);(anonymous);saveBuiltin;makeCallable;(anonymous) 102.00µs",
|
||||
"(anonymous);(anonymous);saveBuiltin 92.00µs",
|
||||
"(anonymous);(anonymous);saveBuiltin;(program) 2.62ms",
|
||||
" 312.00µs",
|
||||
"(program) 295.00µs",
|
||||
" 105.00µs",
|
||||
"(program) 306.00µs",
|
||||
" 111.00µs",
|
||||
"(program) 109.00µs",
|
||||
" 197.00µs",
|
||||
"(program) 110.00µs",
|
||||
"(program);(garbage collector) 102.00µs",
|
||||
"(program) 1.25ms",
|
||||
"(anonymous);(anonymous);saveBuiltin 141.00µs",
|
||||
"(anonymous);(anonymous);saveBuiltin;makeCallable 122.00µs",
|
||||
"(anonymous);(anonymous);saveBuiltin;makeCallable;(program) 6.65ms",
|
||||
"(anonymous) 598.00µs",
|
||||
"(anonymous);(garbage collector) 778.00µs",
|
||||
"(anonymous) 660.00µs",
|
||||
"(anonymous);La 407.00µs",
|
||||
"(anonymous);La;get webstore 139.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous) 1.15ms",
|
||||
"(anonymous);La;get webstore;(anonymous);privates 132.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous) 791.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates 135.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous) 669.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous) 375.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates 134.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous) 256.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates 135.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous) 847.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates 133.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous) 580.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous) 153.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);expose;target.(anonymous function);Apply 146.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous) 744.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous) 151.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates;(anonymous);expose 147.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates 141.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous) 146.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);privates 139.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous) 142.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;privates 120.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;shouldCheckUnprivileged;target.(anonymous function);Apply 146.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply 259.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);JSONSchemaValidator.addTypes 149.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply 153.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply 251.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous);target.(anonymous function) 292.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous) 295.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply 152.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous) 159.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);privates 135.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);privates 133.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);Event 139.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);Event;privates.constructPrivate;target.(anonymous function);Apply 137.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);Event;privates.constructPrivate;target.(anonymous function);Apply;EventImpl 125.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous) 142.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;addProperties 149.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;addProperties;forEach;target.(anonymous function);Apply 126.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate 149.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;runHooks_;target.(anonymous function);Apply;(anonymous) 141.00µs",
|
||||
"(anonymous);La;get webstore;(anonymous);generate;runHooks_;target.(anonymous function);Apply;(anonymous);(anonymous) 132.00µs",
|
||||
"(anonymous) 160.00µs",
|
||||
"(anonymous);l 127.00µs",
|
||||
"(anonymous) 132.00µs",
|
||||
"(anonymous);publicClassPrototype.(anonymous function);target.(anonymous function);Apply 141.00µs",
|
||||
"(anonymous);publicClassPrototype.(anonymous function);target.(anonymous function);Apply;EventImpl.addListener 135.00µs",
|
||||
"(anonymous);bb 146.00µs",
|
||||
"(anonymous);(anonymous) 141.00µs",
|
||||
"(anonymous);(anonymous);(program) 930.00µs",
|
||||
"(anonymous);(anonymous);saveBuiltin;makeCallable;(anonymous) 132.00µs",
|
||||
"(anonymous);(anonymous);(anonymous) 116.00µs",
|
||||
"(anonymous);(anonymous);(anonymous);(program) 27.49ms",
|
||||
"(anonymous) 542.00µs",
|
||||
"(anonymous);insertTextScript 392.00µs",
|
||||
"(anonymous);insertTextScript;insertHeaderNode 292.00µs",
|
||||
"(anonymous);insertTextScript;insertHeaderNode;appendChild;(anonymous);(anonymous) 148.00µs",
|
||||
"(anonymous);insertTextScript;insertHeaderNode;appendChild 145.00µs",
|
||||
"(anonymous);listenForMessage;get webstore 148.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous) 121.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous) 130.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous);privates;(anonymous) 254.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);privates;(anonymous);privates;(anonymous);(anonymous) 135.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);privates 122.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);privates;(anonymous);target.(anonymous function);Apply 130.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous) 141.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function) 154.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous) 123.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous);target.(anonymous function) 137.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply 257.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(garbage collector) 1.58ms",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous) 128.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply;(anonymous);target.(anonymous function);Apply 289.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);privates 292.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;target.(anonymous function);Apply;(anonymous);Event;privates.constructPrivate;target.(anonymous function);Apply;EventImpl 126.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;addProperties;forEach;target.(anonymous function) 144.00µs",
|
||||
"(anonymous);listenForMessage;get webstore;(anonymous);generate;addProperties;forEach;target.(anonymous function);(program) 291.00µs",
|
||||
"(anonymous);Worker 416.00µs",
|
||||
"(anonymous);Worker;(program) 523.00µs",
|
||||
"cb;$a 278.00µs",
|
||||
"cb;$a;(program) 81.00µs",
|
||||
"(anonymous);setTimeout 42.00µs",
|
||||
"(anonymous);setTimeout;(program) 641.00µs",
|
||||
"(anonymous);setTimeout 21.00µs",
|
||||
"(anonymous) 117.00µs",
|
||||
"(anonymous);(program) 540.00µs",
|
||||
" 511.00µs",
|
||||
"(program) 125.00µs",
|
||||
" 136.00µs",
|
||||
"(program) 1.06ms",
|
||||
" 133.00µs",
|
||||
"(program) 1.46ms",
|
||||
" 261.00µs",
|
||||
"(program) 147.00µs",
|
||||
" 4.74ms",
|
||||
"(program) 145.00µs",
|
||||
" 525.00µs",
|
||||
"(program) 221.00µs",
|
||||
" 325.00µs",
|
||||
"(program) 399.00µs",
|
||||
" 146.00µs",
|
||||
"(program) 391.00µs",
|
||||
" 4.01ms",
|
||||
"(program) 131.00µs",
|
||||
" 1.10ms",
|
||||
"(program) 146.00µs",
|
||||
" 2.91ms",
|
||||
"(program) 280.00µs",
|
||||
"worker.onmessage;apple;banana 420.00µs",
|
||||
"worker.onmessage;apple 128.00µs",
|
||||
"worker.onmessage;apple;banana 1.27ms",
|
||||
"worker.onmessage;apple 146.00µs",
|
||||
"worker.onmessage;apple;banana 1.06ms",
|
||||
"worker.onmessage;apple 130.00µs",
|
||||
"worker.onmessage;apple;banana 129.00µs",
|
||||
"worker.onmessage;postMessage 143.00µs",
|
||||
" 1.80ms",
|
||||
"worker.onmessage;apple;banana 1.53ms",
|
||||
"worker.onmessage;postMessage 108.00µs",
|
||||
" 1.63ms",
|
||||
"(program) 141.00µs",
|
||||
"worker.onmessage;apple;banana 1.86ms",
|
||||
" 1.75ms",
|
||||
"worker.onmessage;apple;banana 1.67ms",
|
||||
" 1.84ms",
|
||||
"worker.onmessage;apple;banana 1.62ms",
|
||||
"worker.onmessage;apple;banana;(program) 146.00µs",
|
||||
" 1.67ms",
|
||||
"worker.onmessage;apple;banana 1.45ms",
|
||||
"worker.onmessage;apple;banana;(garbage collector) 923.00µs",
|
||||
"worker.onmessage;apple;banana 136.00µs",
|
||||
"worker.onmessage;apple;banana;(program) 132.00µs",
|
||||
" 1.81ms",
|
||||
"(program) 136.00µs",
|
||||
"worker.onmessage;apple;banana 1.69ms",
|
||||
" 1.75ms",
|
||||
"(program) 131.00µs",
|
||||
"worker.onmessage;apple;banana 282.00µs",
|
||||
"worker.onmessage;apple 128.00µs",
|
||||
"worker.onmessage;apple;banana 1.10ms",
|
||||
"worker.onmessage;apple;banana;(program) 136.00µs",
|
||||
" 1.57ms",
|
||||
"worker.onmessage;apple;banana 665.00µs",
|
||||
"worker.onmessage;apple 128.00µs",
|
||||
"worker.onmessage;apple;banana 779.00µs",
|
||||
" 1.56ms",
|
||||
"(program) 131.00µs",
|
||||
"worker.onmessage;apple;banana 1.56ms",
|
||||
" 1.57ms",
|
||||
"(program) 149.00µs",
|
||||
"worker.onmessage;apple;banana 1.54ms",
|
||||
"worker.onmessage;apple;banana;(program) 100.00µs",
|
||||
" 52.45ms",
|
||||
"(program) 125.00µs",
|
||||
" 88.71ms",
|
||||
"(program) 1.06ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromChromeTimeline Workers Chrome 70 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": 20,
|
||||
"file": "http://127.0.0.1:8081/worker.js",
|
||||
"key": "onmessage:http://127.0.0.1:8081/worker.js:14:20",
|
||||
"line": 14,
|
||||
"name": "onmessage",
|
||||
"selfWeight": 402,
|
||||
"totalWeight": 187278,
|
||||
},
|
||||
Frame {
|
||||
"col": 14,
|
||||
"file": "http://127.0.0.1:8081/worker.js",
|
||||
"key": "alpha:http://127.0.0.1:8081/worker.js:8:14",
|
||||
"line": 8,
|
||||
"name": "alpha",
|
||||
"selfWeight": 7945,
|
||||
"totalWeight": 177837,
|
||||
},
|
||||
Frame {
|
||||
"col": 14,
|
||||
"file": "http://127.0.0.1:8081/worker.js",
|
||||
"key": "gamma:http://127.0.0.1:8081/worker.js:0:14",
|
||||
"line": 0,
|
||||
"name": "gamma",
|
||||
"selfWeight": 13631,
|
||||
"totalWeight": 21888,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "(program):undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "(program)",
|
||||
"selfWeight": 164753,
|
||||
"totalWeight": 164753,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "postMessage:undefined:undefined:undefined",
|
||||
"line": undefined,
|
||||
"name": "postMessage",
|
||||
"selfWeight": 547,
|
||||
"totalWeight": 5452,
|
||||
},
|
||||
],
|
||||
"name": "worker.json - DedicatedWorker thread",
|
||||
"stacks": Array [
|
||||
" 4.33ms",
|
||||
"onmessage;alpha;gamma 604.00µs",
|
||||
"onmessage;alpha 1.38ms",
|
||||
"onmessage;alpha;gamma 3.31ms",
|
||||
"onmessage 270.00µs",
|
||||
"onmessage;(program) 3.59ms",
|
||||
"onmessage;alpha;gamma 127.00µs",
|
||||
"onmessage;alpha 128.00µs",
|
||||
"onmessage;alpha;gamma 1.48ms",
|
||||
"onmessage;alpha;gamma;(program) 1.68ms",
|
||||
"onmessage;alpha;gamma 1.65ms",
|
||||
"onmessage;alpha;gamma;(program) 2.00ms",
|
||||
"onmessage;alpha;gamma 1.62ms",
|
||||
"onmessage;postMessage 146.00µs",
|
||||
"onmessage;postMessage;(program) 1.65ms",
|
||||
"onmessage;alpha;gamma 1.70ms",
|
||||
"onmessage;postMessage 256.00µs",
|
||||
"onmessage;postMessage;(program) 1.63ms",
|
||||
"onmessage;alpha;gamma 670.00µs",
|
||||
"onmessage;alpha 134.00µs",
|
||||
"onmessage;alpha;gamma 899.00µs",
|
||||
"onmessage;alpha;gamma;(program) 2.72ms",
|
||||
"onmessage 132.00µs",
|
||||
"onmessage;alpha;gamma 1.57ms",
|
||||
"onmessage;alpha;gamma;(program) 1.85ms",
|
||||
"onmessage;alpha 1.75ms",
|
||||
"onmessage;alpha;(program) 1.76ms",
|
||||
"onmessage;alpha 1.44ms",
|
||||
"onmessage;postMessage 145.00µs",
|
||||
"onmessage;postMessage;(program) 1.63ms",
|
||||
"onmessage;alpha 1.57ms",
|
||||
"onmessage;alpha;(program) 1.60ms",
|
||||
"onmessage;alpha 1.55ms",
|
||||
"onmessage;alpha;(program) 144.64ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromChromeTimeline Workers Chrome 70: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromChromeTimeline Workers Chrome 70: profileGroup.name 1`] = `"worker.json"`;
|
||||
|
||||
exports[`importFromChromeTimeline: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromChromeTimeline: profileGroup.name 1`] = `"simple-timeline.json"`;
|
||||
|
||||
@@ -0,0 +1,864 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importFromHaskell 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 144,
|
||||
"line": undefined,
|
||||
"name": "MAIN.MAIN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 798,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 56,
|
||||
"line": undefined,
|
||||
"name": "GHC.Conc.Signal.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 73,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 75,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.Iconv.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 84,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Handle.FD.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 119,
|
||||
"line": undefined,
|
||||
"name": "Text.Printf.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 26,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta1_r6nI",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(21,1)-(38,42)",
|
||||
"key": 19,
|
||||
"line": undefined,
|
||||
"name": "Main.main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 733,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(56,1)-(57,42)",
|
||||
"key": 4,
|
||||
"line": undefined,
|
||||
"name": "Main.check",
|
||||
"selfWeight": 320,
|
||||
"totalWeight": 320,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:31:9-29",
|
||||
"key": 16,
|
||||
"line": undefined,
|
||||
"name": "Main.main.long",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 28,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta_r6nG",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 35,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:io1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 27,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl2_r6nH",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(61,1)-(63,26)",
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "Main.make",
|
||||
"selfWeight": 406,
|
||||
"totalWeight": 409,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:19-26",
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "Main.make.d2",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:9-16",
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "Main.make.i2",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 24,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl4_r6nL",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 22,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl8_r6nP",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 21,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 29,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main11",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:27:9-35",
|
||||
"key": 15,
|
||||
"line": undefined,
|
||||
"name": "Main.main.c",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 8,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 30,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main12",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 23,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main5",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 31,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main7",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 25,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main9",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-12",
|
||||
"key": 33,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_maxN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-35",
|
||||
"key": 13,
|
||||
"line": undefined,
|
||||
"name": "Main.main.maxN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9",
|
||||
"key": 34,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9-14",
|
||||
"key": 12,
|
||||
"line": undefined,
|
||||
"name": "Main.main.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-16",
|
||||
"key": 32,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_stretchN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-27",
|
||||
"key": 14,
|
||||
"line": undefined,
|
||||
"name": "Main.main.stretchN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-4",
|
||||
"key": 36,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-8",
|
||||
"key": 9,
|
||||
"line": undefined,
|
||||
"name": "Main.minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 146,
|
||||
"line": undefined,
|
||||
"name": "GC.GC",
|
||||
"selfWeight": 46,
|
||||
"totalWeight": 46,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 147,
|
||||
"line": undefined,
|
||||
"name": "PROFILING.OVERHEAD_of",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 145,
|
||||
"line": undefined,
|
||||
"name": "SYSTEM.SYSTEM",
|
||||
"selfWeight": 19,
|
||||
"totalWeight": 19,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:35:26-54",
|
||||
"key": 18,
|
||||
"line": undefined,
|
||||
"name": "Main.main.\\\\",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:19:1-56",
|
||||
"key": 8,
|
||||
"line": undefined,
|
||||
"name": "Main.io",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:34:9-28",
|
||||
"key": 17,
|
||||
"line": undefined,
|
||||
"name": "Main.main.vs",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 721,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(42,1)-(45,38)",
|
||||
"key": 11,
|
||||
"line": undefined,
|
||||
"name": "Main.depth",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 721,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(49,1)-(52,31)",
|
||||
"key": 7,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 721,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:51:9-31",
|
||||
"key": 6,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.a",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 369,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:52:9-31",
|
||||
"key": 5,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.b",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 352,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:45:9-38",
|
||||
"key": 10,
|
||||
"line": undefined,
|
||||
"name": "Main.depth.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
],
|
||||
"name": "binary-trees time",
|
||||
"stacks": Array [
|
||||
"MAIN.MAIN;Main.CAF:eta1_r6nI;Main.main;Main.check 1.00ms",
|
||||
"MAIN.MAIN;Main.CAF:lvl2_r6nH;Main.main;Main.main.long;Main.make 3.00ms",
|
||||
"MAIN.MAIN;Main.CAF:main11;Main.main;Main.main.c;Main.check 4.00ms",
|
||||
"MAIN.MAIN;Main.CAF:main12;Main.main;Main.main.c;Main.make 4.00ms",
|
||||
"MAIN.MAIN;GC.GC 46.00ms",
|
||||
"MAIN.MAIN;SYSTEM.SYSTEM 19.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.check 153.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make;Main.make.d2 2.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make;Main.make.i2 1.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make 210.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a 3.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.check 162.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.make 189.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b 1.00ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromHaskell 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 144,
|
||||
"line": undefined,
|
||||
"name": "MAIN.MAIN",
|
||||
"selfWeight": 648,
|
||||
"totalWeight": 1921672664,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 56,
|
||||
"line": undefined,
|
||||
"name": "GHC.Conc.Signal.CAF",
|
||||
"selfWeight": 640,
|
||||
"totalWeight": 640,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 73,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.CAF",
|
||||
"selfWeight": 2768,
|
||||
"totalWeight": 2768,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 75,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.Iconv.CAF",
|
||||
"selfWeight": 200,
|
||||
"totalWeight": 200,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 84,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Handle.FD.CAF",
|
||||
"selfWeight": 34704,
|
||||
"totalWeight": 34704,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 119,
|
||||
"line": undefined,
|
||||
"name": "Text.Printf.CAF",
|
||||
"selfWeight": 528,
|
||||
"totalWeight": 528,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 26,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta1_r6nI",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2097152,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(21,1)-(38,42)",
|
||||
"key": 19,
|
||||
"line": undefined,
|
||||
"name": "Main.main",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 1921591544,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(56,1)-(57,42)",
|
||||
"key": 4,
|
||||
"line": undefined,
|
||||
"name": "Main.check",
|
||||
"selfWeight": 406149056,
|
||||
"totalWeight": 406149056,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:31:9-29",
|
||||
"key": 16,
|
||||
"line": undefined,
|
||||
"name": "Main.main.long",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 7864112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 28,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta_r6nG",
|
||||
"selfWeight": 1096,
|
||||
"totalWeight": 1096,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 35,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:io1",
|
||||
"selfWeight": 1888,
|
||||
"totalWeight": 1888,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 27,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl2_r6nH",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 7864112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(61,1)-(63,26)",
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "Main.make",
|
||||
"selfWeight": 1512575520,
|
||||
"totalWeight": 1512575520,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:19-26",
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "Main.make.d2",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:9-16",
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "Main.make.i2",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 24,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl4_r6nL",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 22,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl8_r6nP",
|
||||
"selfWeight": 520,
|
||||
"totalWeight": 520,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 21,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main1",
|
||||
"selfWeight": 16,
|
||||
"totalWeight": 16,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 29,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main11",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4194304,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:27:9-35",
|
||||
"key": 15,
|
||||
"line": undefined,
|
||||
"name": "Main.main.c",
|
||||
"selfWeight": 64,
|
||||
"totalWeight": 19922736,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 30,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main12",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 15728432,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 23,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main5",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 31,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main7",
|
||||
"selfWeight": 880,
|
||||
"totalWeight": 880,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 25,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main9",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-12",
|
||||
"key": 33,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_maxN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-35",
|
||||
"key": 13,
|
||||
"line": undefined,
|
||||
"name": "Main.main.maxN",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9",
|
||||
"key": 34,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9-14",
|
||||
"key": 12,
|
||||
"line": undefined,
|
||||
"name": "Main.main.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-16",
|
||||
"key": 32,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_stretchN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-27",
|
||||
"key": 14,
|
||||
"line": undefined,
|
||||
"name": "Main.main.stretchN",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-4",
|
||||
"key": 36,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-8",
|
||||
"key": 9,
|
||||
"line": undefined,
|
||||
"name": "Main.minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 146,
|
||||
"line": undefined,
|
||||
"name": "GC.GC",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 147,
|
||||
"line": undefined,
|
||||
"name": "PROFILING.OVERHEAD_of",
|
||||
"selfWeight": 2496,
|
||||
"totalWeight": 2496,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 145,
|
||||
"line": undefined,
|
||||
"name": "SYSTEM.SYSTEM",
|
||||
"selfWeight": 34736,
|
||||
"totalWeight": 34736,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:35:26-54",
|
||||
"key": 18,
|
||||
"line": undefined,
|
||||
"name": "Main.main.\\\\",
|
||||
"selfWeight": 2224,
|
||||
"totalWeight": 46672,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:19:1-56",
|
||||
"key": 8,
|
||||
"line": undefined,
|
||||
"name": "Main.io",
|
||||
"selfWeight": 67912,
|
||||
"totalWeight": 67912,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:34:9-28",
|
||||
"key": 17,
|
||||
"line": undefined,
|
||||
"name": "Main.main.vs",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1891637344,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(42,1)-(45,38)",
|
||||
"key": 11,
|
||||
"line": undefined,
|
||||
"name": "Main.depth",
|
||||
"selfWeight": 1120,
|
||||
"totalWeight": 1891637344,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(49,1)-(52,31)",
|
||||
"key": 7,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1891636224,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:51:9-31",
|
||||
"key": 6,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.a",
|
||||
"selfWeight": 1397760,
|
||||
"totalWeight": 945818112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:52:9-31",
|
||||
"key": 5,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.b",
|
||||
"selfWeight": 1397760,
|
||||
"totalWeight": 945818112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:45:9-38",
|
||||
"key": 10,
|
||||
"line": undefined,
|
||||
"name": "Main.depth.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
],
|
||||
"name": "binary-trees allocation",
|
||||
"stacks": Array [
|
||||
"MAIN.MAIN;GHC.Conc.Signal.CAF 640 B",
|
||||
"MAIN.MAIN;GHC.IO.Encoding.CAF 2.70 KB",
|
||||
"MAIN.MAIN;GHC.IO.Encoding.Iconv.CAF 200 B",
|
||||
"MAIN.MAIN;GHC.IO.Handle.FD.CAF 33.89 KB",
|
||||
"MAIN.MAIN;Text.Printf.CAF 528 B",
|
||||
"MAIN.MAIN;Main.CAF:eta1_r6nI;Main.main;Main.check 2.00 MB",
|
||||
"MAIN.MAIN;Main.CAF:eta1_r6nI;Main.main 32 B",
|
||||
"MAIN.MAIN;Main.CAF:eta_r6nG 1.07 KB",
|
||||
"MAIN.MAIN;Main.CAF:io1 1.84 KB",
|
||||
"MAIN.MAIN;Main.CAF:lvl2_r6nH;Main.main;Main.main.long;Main.make 7.50 MB",
|
||||
"MAIN.MAIN;Main.CAF:lvl2_r6nH;Main.main;Main.main.long 32 B",
|
||||
"MAIN.MAIN;Main.CAF:lvl8_r6nP 520 B",
|
||||
"MAIN.MAIN;Main.CAF:main1 16 B",
|
||||
"MAIN.MAIN;Main.CAF:main11;Main.main;Main.main.c;Main.check 4.00 MB",
|
||||
"MAIN.MAIN;Main.CAF:main11;Main.main;Main.main.c 32 B",
|
||||
"MAIN.MAIN;Main.CAF:main12;Main.main;Main.main.c;Main.make 15.00 MB",
|
||||
"MAIN.MAIN;Main.CAF:main12;Main.main;Main.main.c 32 B",
|
||||
"MAIN.MAIN;Main.CAF:main7 880 B",
|
||||
"MAIN.MAIN;Main.CAF:main_maxN;Main.main;Main.main.maxN 32 B",
|
||||
"MAIN.MAIN;Main.CAF:main_stretchN;Main.main;Main.main.stretchN 32 B",
|
||||
"MAIN.MAIN;PROFILING.OVERHEAD_of 2.44 KB",
|
||||
"MAIN.MAIN;SYSTEM.SYSTEM 33.92 KB",
|
||||
"MAIN.MAIN;Main.main;Main.main.\\\\;Main.io 43.41 KB",
|
||||
"MAIN.MAIN;Main.main;Main.main.\\\\ 2.17 KB",
|
||||
"MAIN.MAIN;Main.main;Main.io 22.91 KB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.check 190.67 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make 710.00 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a 1.33 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.check 190.67 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.make 710.00 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b 1.33 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth 1.09 KB",
|
||||
"MAIN.MAIN 648 B",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromHaskell: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromHaskell: profileGroup.name 1`] = `"binary-trees"`;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -11,3 +11,7 @@ test('importFromChromeTimeline', async () => {
|
||||
test('importFromChromeTimeline Chrome 69', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/69/simple.json')
|
||||
})
|
||||
|
||||
test('importFromChromeTimeline Workers Chrome 70', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/70/worker.json')
|
||||
})
|
||||
|
||||
+61
-13
@@ -1,5 +1,5 @@
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder} from '../lib/profile'
|
||||
import {getOrInsert, lastOf, sortBy} from '../lib/utils'
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder, ProfileGroup} from '../lib/profile'
|
||||
import {getOrInsert, lastOf, sortBy, itForEach} from '../lib/utils'
|
||||
import {TimeFormatter} from '../lib/value-formatters'
|
||||
|
||||
// See: https://github.com/v8/v8/blob/master/src/inspector/js_protocol.json
|
||||
@@ -15,6 +15,7 @@ interface TimelineEvent {
|
||||
tdur: number
|
||||
tts: number
|
||||
args: {[key: string]: any}
|
||||
id?: string
|
||||
}
|
||||
|
||||
interface PositionTickInfo {
|
||||
@@ -61,33 +62,54 @@ export function isChromeTimeline(rawProfile: any): boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
export function importFromChromeTimeline(events: TimelineEvent[]): Profile {
|
||||
export function importFromChromeTimeline(events: TimelineEvent[], fileName: string): ProfileGroup {
|
||||
// It seems like sometimes Chrome timeline files contain multiple CpuProfiles?
|
||||
// For now, choose the first one in the list.
|
||||
|
||||
let cpuProfile: CPUProfile | null = null
|
||||
const cpuProfileByID = new Map<string, CPUProfile>()
|
||||
|
||||
// Maps profile IDs (like "0x3") to pid/tid pairs formatted as `${pid}:${tid}`
|
||||
const pidTidById = new Map<string, string>()
|
||||
|
||||
// Maps pid/tid pairs to thread names
|
||||
const threadNameByPidTid = new Map<string, string>()
|
||||
|
||||
// The events aren't necessarily recorded in chronological order. Sort them so
|
||||
// that they are.
|
||||
sortBy(events, e => e.ts)
|
||||
|
||||
const DEFAULT_ID = '(default id)'
|
||||
|
||||
for (let event of events) {
|
||||
if (event.name == 'CpuProfile') {
|
||||
cpuProfile = event.args.data.cpuProfile as CPUProfile
|
||||
if (event.name === 'CpuProfile') {
|
||||
cpuProfileByID.set(event.id || DEFAULT_ID, event.args.data.cpuProfile as CPUProfile)
|
||||
|
||||
if (event.id) {
|
||||
pidTidById.set(event.id, `${event.pid}:${event.tid}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (event.name == 'Profile') {
|
||||
cpuProfile = {
|
||||
if (event.name === 'Profile') {
|
||||
cpuProfileByID.set(event.id || DEFAULT_ID, {
|
||||
startTime: 0,
|
||||
endTime: 0,
|
||||
nodes: [],
|
||||
samples: [],
|
||||
timeDeltas: [],
|
||||
...event.args.data,
|
||||
})
|
||||
|
||||
if (event.id) {
|
||||
pidTidById.set(event.id, `${event.pid}:${event.tid}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (event.name == 'ProfileChunk') {
|
||||
if (event.name === 'thread_name') {
|
||||
threadNameByPidTid.set(`${event.pid}:${event.tid}`, event.args.name)
|
||||
}
|
||||
|
||||
if (event.name === 'ProfileChunk') {
|
||||
const cpuProfile = cpuProfileByID.get(event.id || DEFAULT_ID)
|
||||
if (cpuProfile) {
|
||||
const chunk = event.args.data
|
||||
if (chunk.cpuProfile) {
|
||||
@@ -108,13 +130,38 @@ export function importFromChromeTimeline(events: TimelineEvent[]): Profile {
|
||||
cpuProfile.endTime = chunk.endTime
|
||||
}
|
||||
} else {
|
||||
console.log('Ignoring ProfileChunk when no Profile is active')
|
||||
console.warn(
|
||||
`Ignoring ProfileChunk for undeclared Profile with id ${event.id || DEFAULT_ID}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cpuProfile) {
|
||||
return importFromChromeCPUProfile(cpuProfile as CPUProfile)
|
||||
if (cpuProfileByID.size > 0) {
|
||||
const profiles: Profile[] = []
|
||||
let indexToView = 0
|
||||
|
||||
itForEach(cpuProfileByID.keys(), profileId => {
|
||||
let threadName: string | null = null
|
||||
let pidTid = pidTidById.get(profileId)
|
||||
if (pidTid) {
|
||||
threadName = threadNameByPidTid.get(pidTid) || null
|
||||
if (threadName) {
|
||||
}
|
||||
}
|
||||
const profile = importFromChromeCPUProfile(cpuProfileByID.get(profileId)!)
|
||||
if (threadName && cpuProfileByID.size > 1) {
|
||||
profile.setName(`${fileName} - ${threadName}`)
|
||||
if (threadName === 'CrRendererMain') {
|
||||
indexToView = profiles.length
|
||||
}
|
||||
} else {
|
||||
profile.setName(`${fileName}`)
|
||||
}
|
||||
profiles.push(profile)
|
||||
})
|
||||
|
||||
return {name: fileName, indexToView, profiles}
|
||||
} else {
|
||||
throw new Error('Could not find CPU profile in Timeline')
|
||||
}
|
||||
@@ -198,7 +245,8 @@ export function importFromChromeCPUProfile(chromeProfile: CPUProfile): Profile {
|
||||
} else {
|
||||
let timeDelta = chromeProfile.timeDeltas[i + 1]
|
||||
if (timeDelta < 0) {
|
||||
console.warn('Substituting zero for unexpected time delta:', timeDelta, 'at index', i)
|
||||
// This is super noisy, but can be helpful when debugging strange data
|
||||
// console.warn('Substituting zero for unexpected time delta:', timeDelta, 'at index', i)
|
||||
timeDelta = 0
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromHaskell', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/haskell/simple.prof')
|
||||
})
|
||||
@@ -0,0 +1,98 @@
|
||||
import {ProfileGroup, FrameInfo, CallTreeProfileBuilder} from '../lib/profile'
|
||||
import {TimeFormatter, ByteFormatter} from '../lib/value-formatters'
|
||||
|
||||
// See https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html#json-profile-format
|
||||
// for information on the GHC profiler JSON output format.
|
||||
|
||||
interface CostCentre {
|
||||
id: number
|
||||
label: string
|
||||
module: string
|
||||
src_loc: string
|
||||
is_caf: boolean
|
||||
}
|
||||
|
||||
interface ProfileTree {
|
||||
id: number
|
||||
entries: number
|
||||
alloc: number
|
||||
ticks: number
|
||||
children: ProfileTree[]
|
||||
}
|
||||
|
||||
interface HaskellProfile {
|
||||
program: string
|
||||
arguments: string[]
|
||||
rts_arguments: string[]
|
||||
end_time: string
|
||||
initial_capabilities: number
|
||||
total_time: number
|
||||
total_ticks: number
|
||||
tick_interval: number
|
||||
total_alloc: number
|
||||
cost_centres: CostCentre[]
|
||||
profile: ProfileTree
|
||||
}
|
||||
|
||||
// The profiler already collapses recursion before output so using the JS stack here should be fine
|
||||
function addToProfile(
|
||||
tree: ProfileTree,
|
||||
startVal: number,
|
||||
profile: CallTreeProfileBuilder,
|
||||
infos: Map<number, FrameInfo>,
|
||||
attribute: (tree: ProfileTree) => number,
|
||||
): number {
|
||||
// If the expression never did anything we don't care about it
|
||||
if (tree.ticks === 0 && tree.entries === 0 && tree.alloc === 0 && tree.children.length === 0)
|
||||
return startVal
|
||||
|
||||
let curVal = startVal
|
||||
let frameInfo = infos.get(tree.id)!
|
||||
|
||||
profile.enterFrame(frameInfo, curVal)
|
||||
|
||||
for (let child of tree.children) {
|
||||
curVal = addToProfile(child, curVal, profile, infos, attribute)
|
||||
}
|
||||
|
||||
curVal += attribute(tree)
|
||||
|
||||
profile.leaveFrame(frameInfo, curVal)
|
||||
|
||||
return curVal
|
||||
}
|
||||
|
||||
export function importFromHaskell(haskellProfile: HaskellProfile): ProfileGroup {
|
||||
const idToFrameInfo = new Map<number, FrameInfo>()
|
||||
for (let centre of haskellProfile.cost_centres) {
|
||||
const frameInfo: FrameInfo = {
|
||||
key: centre.id,
|
||||
name: `${centre.module}.${centre.label}`,
|
||||
}
|
||||
|
||||
// Ignore things like <entire-module> and <no location info>
|
||||
if (!centre.src_loc.startsWith('<')) {
|
||||
// This also contains line and column information, but sometimes it contains ranges,
|
||||
// and in varying formats, so it's a better experience just to leave it as is
|
||||
frameInfo.file = centre.src_loc
|
||||
}
|
||||
|
||||
idToFrameInfo.set(centre.id, frameInfo)
|
||||
}
|
||||
|
||||
const timeProfile = new CallTreeProfileBuilder(haskellProfile.total_ticks)
|
||||
addToProfile(haskellProfile.profile, 0, timeProfile, idToFrameInfo, tree => tree.ticks)
|
||||
timeProfile.setValueFormatter(new TimeFormatter('milliseconds'))
|
||||
timeProfile.setName(`${haskellProfile.program} time`)
|
||||
|
||||
const allocProfile = new CallTreeProfileBuilder(haskellProfile.total_ticks)
|
||||
addToProfile(haskellProfile.profile, 0, allocProfile, idToFrameInfo, tree => tree.alloc)
|
||||
allocProfile.setValueFormatter(new ByteFormatter())
|
||||
allocProfile.setName(`${haskellProfile.program} allocation`)
|
||||
|
||||
return {
|
||||
name: haskellProfile.program,
|
||||
indexToView: 0,
|
||||
profiles: [timeProfile.build(), allocProfile.build()],
|
||||
}
|
||||
}
|
||||
+13
-2
@@ -9,9 +9,11 @@ import {importFromFirefox} from './firefox'
|
||||
import {importSpeedscopeProfiles} from '../lib/file-format'
|
||||
import {importFromV8ProfLog} from './v8proflog'
|
||||
import {importFromLinuxPerf} from './linux-tools-perf'
|
||||
import {importFromHaskell} from './haskell'
|
||||
import {ProfileDataSource, TextProfileDataSource, MaybeCompressedDataReader} from './utils'
|
||||
import {importAsPprofProfile} from './pprof'
|
||||
import {decodeBase64} from '../lib/utils'
|
||||
import {importFromChromeHeapProfile} from './v8heapalloc'
|
||||
|
||||
export async function importProfileGroupFromText(
|
||||
fileName: string,
|
||||
@@ -87,7 +89,7 @@ async function _importProfileGroup(dataSource: ProfileDataSource): Promise<Profi
|
||||
return toGroup(importFromChromeCPUProfile(JSON.parse(contents)))
|
||||
} else if (fileName.endsWith('.chrome.json') || /Profile-\d{8}T\d{6}/.exec(fileName)) {
|
||||
console.log('Importing as Chrome Timeline')
|
||||
return toGroup(importFromChromeTimeline(JSON.parse(contents)))
|
||||
return importFromChromeTimeline(JSON.parse(contents), fileName)
|
||||
} else if (fileName.endsWith('.stackprof.json')) {
|
||||
console.log('Importing as stackprof profile')
|
||||
return toGroup(importFromStackprof(JSON.parse(contents)))
|
||||
@@ -103,6 +105,9 @@ async function _importProfileGroup(dataSource: ProfileDataSource): Promise<Profi
|
||||
} else if (fileName.endsWith('.v8log.json')) {
|
||||
console.log('Importing as --prof-process v8 log')
|
||||
return toGroup(importFromV8ProfLog(JSON.parse(contents)))
|
||||
} else if (fileName.endsWith('.heapprofile')) {
|
||||
console.log('Importing as Chrome Heap Profile')
|
||||
return toGroup(importFromChromeHeapProfile(JSON.parse(contents)))
|
||||
}
|
||||
|
||||
// Second pass: Try to guess what file format it is based on structure
|
||||
@@ -119,7 +124,7 @@ async function _importProfileGroup(dataSource: ProfileDataSource): Promise<Profi
|
||||
return toGroup(importFromFirefox(parsed))
|
||||
} else if (isChromeTimeline(parsed)) {
|
||||
console.log('Importing as Chrome CPU Profile')
|
||||
return toGroup(importFromChromeTimeline(parsed))
|
||||
return importFromChromeTimeline(parsed, fileName)
|
||||
} else if ('nodes' in parsed && 'samples' in parsed && 'timeDeltas' in parsed) {
|
||||
console.log('Importing as Chrome Timeline')
|
||||
return toGroup(importFromChromeCPUProfile(parsed))
|
||||
@@ -129,6 +134,12 @@ async function _importProfileGroup(dataSource: ProfileDataSource): Promise<Profi
|
||||
} else if ('code' in parsed && 'functions' in parsed && 'ticks' in parsed) {
|
||||
console.log('Importing as --prof-process v8 log')
|
||||
return toGroup(importFromV8ProfLog(parsed))
|
||||
} else if ('head' in parsed && 'selfSize' in parsed['head']) {
|
||||
console.log('Importing as Chrome Heap Profile')
|
||||
return toGroup(importFromChromeHeapProfile(JSON.parse(contents)))
|
||||
} else if ('rts_arguments' in parsed && 'initial_capabilities' in parsed) {
|
||||
console.log('Importing as Haskell GHC JSON Profile')
|
||||
return importFromHaskell(parsed)
|
||||
}
|
||||
} else {
|
||||
// Format is not JSON
|
||||
|
||||
+11
-6
@@ -53,13 +53,18 @@ export class MaybeCompressedDataReader implements ProfileDataSource {
|
||||
const buffer = await this.readAsArrayBuffer()
|
||||
let ret: string = ''
|
||||
|
||||
// JavaScript strings are UTF-16 encoded, but we're reading data
|
||||
// from disk that we're going to asusme is UTF-8 encoded.
|
||||
const array = new Uint8Array(buffer)
|
||||
for (let i = 0; i < array.length; i++) {
|
||||
ret += String.fromCharCode(array[i])
|
||||
if (typeof TextDecoder !== 'undefined') {
|
||||
const decoder = new TextDecoder()
|
||||
return decoder.decode(buffer)
|
||||
} else {
|
||||
// JavaScript strings are UTF-16 encoded, but we're reading data
|
||||
// from disk that we're going to asusme is UTF-8 encoded.
|
||||
const array = new Uint8Array(buffer)
|
||||
for (let i = 0; i < array.length; i++) {
|
||||
ret += String.fromCharCode(array[i])
|
||||
}
|
||||
return ret
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
static fromFile(file: File): MaybeCompressedDataReader {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importV8HeapAlloc from Chrome', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/69/Heap-20181005T144546.heapprofile')
|
||||
})
|
||||
|
||||
test('importV8HeapAlloc from NodeJS', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/node/10.11.0/Heap-20181003T105432.heapprofile')
|
||||
})
|
||||
@@ -0,0 +1,109 @@
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../lib/profile'
|
||||
import {getOrInsert} from '../lib/utils'
|
||||
import {ByteFormatter} from '../lib/value-formatters'
|
||||
|
||||
/**
|
||||
* The V8 Heap Allocation profile is a way to represent heap allocation for each
|
||||
* javascript function. The format is a simple tree where the weight of each node
|
||||
* represent the memory allocated by the function and all its callee.
|
||||
* You can find more information on how to get a profile there :
|
||||
* https://developers.google.com/web/tools/chrome-devtools/memory-problems/#allocation-profile
|
||||
* You need to scroll down to "Investigate memory allocation by function"
|
||||
*
|
||||
* Note that Node.JS can retrieve this kind of profile via the Inspector protocol.
|
||||
*/
|
||||
|
||||
interface HeapProfileCallFrame {
|
||||
columnNumber: number
|
||||
functionName: string
|
||||
lineNumber: number
|
||||
scriptId: string
|
||||
url: string
|
||||
}
|
||||
|
||||
interface HeapProfileNode {
|
||||
callFrame: HeapProfileCallFrame
|
||||
selfSize: number
|
||||
children: HeapProfileNode[]
|
||||
id: number
|
||||
parent?: number
|
||||
totalSize: number
|
||||
}
|
||||
|
||||
interface HeapProfile {
|
||||
head: HeapProfileNode
|
||||
}
|
||||
|
||||
const callFrameToFrameInfo = new Map<HeapProfileCallFrame, FrameInfo>()
|
||||
function frameInfoForCallFrame(callFrame: HeapProfileCallFrame) {
|
||||
return getOrInsert(callFrameToFrameInfo, callFrame, callFrame => {
|
||||
const name = callFrame.functionName || '(anonymous)'
|
||||
const file = callFrame.url
|
||||
const line = callFrame.lineNumber
|
||||
const col = callFrame.columnNumber
|
||||
return {
|
||||
key: `${name}:${file}:${line}:${col}`,
|
||||
name,
|
||||
file,
|
||||
line,
|
||||
col,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export function importFromChromeHeapProfile(chromeProfile: HeapProfile): Profile {
|
||||
const nodeById = new Map<number, HeapProfileNode>()
|
||||
let currentId = 0
|
||||
const computeId = (node: HeapProfileNode, parent?: HeapProfileNode) => {
|
||||
node.id = currentId++
|
||||
nodeById.set(node.id, node)
|
||||
if (parent) {
|
||||
node.parent = parent.id
|
||||
}
|
||||
|
||||
node.children.forEach(children => computeId(children, node))
|
||||
}
|
||||
computeId(chromeProfile.head)
|
||||
|
||||
// Compute the total size
|
||||
const computeTotalSize = (node: HeapProfileNode): number => {
|
||||
if (node.children.length === 0) return node.selfSize || 0
|
||||
const totalChild = node.children.reduce((total: number, children) => {
|
||||
total += computeTotalSize(children)
|
||||
return total
|
||||
}, node.selfSize)
|
||||
node.totalSize = totalChild
|
||||
return totalChild
|
||||
}
|
||||
const total = computeTotalSize(chromeProfile.head)
|
||||
|
||||
// Compute all stacks by taking each last node and going upward
|
||||
const stacks: HeapProfileNode[][] = []
|
||||
for (let currentNode of nodeById.values()) {
|
||||
let stack: HeapProfileNode[] = []
|
||||
stack.push(currentNode)
|
||||
// While we found a parent
|
||||
while (true) {
|
||||
if (currentNode.parent === undefined) break
|
||||
const parent = nodeById.get(currentNode.parent)
|
||||
if (parent === undefined) break
|
||||
// Push the parent at the beginning of the stack
|
||||
stack.unshift(parent)
|
||||
currentNode = parent
|
||||
}
|
||||
stacks.push(stack)
|
||||
}
|
||||
|
||||
const profile = new StackListProfileBuilder(total)
|
||||
|
||||
for (let stack of stacks) {
|
||||
const lastFrame = stack[stack.length - 1]
|
||||
profile.appendSampleWithWeight(
|
||||
stack.map(frame => frameInfoForCallFrame(frame.callFrame)),
|
||||
lastFrame.selfSize,
|
||||
)
|
||||
}
|
||||
|
||||
profile.setValueFormatter(new ByteFormatter())
|
||||
return profile.build()
|
||||
}
|
||||
@@ -33,6 +33,13 @@ async function importProfilesFromBase64(
|
||||
return (await importModule).importProfileGroupFromBase64(fileName, contents)
|
||||
}
|
||||
|
||||
async function importProfilesFromArrayBuffer(
|
||||
fileName: string,
|
||||
contents: ArrayBuffer,
|
||||
): Promise<ProfileGroup | null> {
|
||||
return (await importModule).importProfilesFromArrayBuffer(fileName, contents)
|
||||
}
|
||||
|
||||
async function importProfilesFromFile(file: File): Promise<ProfileGroup | null> {
|
||||
return (await importModule).importProfilesFromFile(file)
|
||||
}
|
||||
@@ -512,7 +519,7 @@ export class Application extends StatelessComponent<ApplicationProps> {
|
||||
if (filename.includes('/')) {
|
||||
filename = filename.slice(filename.lastIndexOf('/') + 1)
|
||||
}
|
||||
return await importProfilesFromText(filename, await response.text())
|
||||
return await importProfilesFromArrayBuffer(filename, await response.arrayBuffer())
|
||||
})
|
||||
} else if (this.props.hashParams.localProfilePath) {
|
||||
// There isn't good cross-browser support for XHR of local files, even from
|
||||
|
||||
@@ -660,15 +660,20 @@ export class FlamechartPanZoomView extends Component<FlamechartPanZoomViewProps,
|
||||
|
||||
if (ev.ctrlKey || ev.shiftKey || ev.metaKey) return
|
||||
|
||||
// NOTE: We intentionally use ev.code rather than ev.key for
|
||||
// WASD in order to have the keys retain the same layout even
|
||||
// if the keyboard layout is not QWERTY.
|
||||
//
|
||||
// See: https://github.com/jlfwong/speedscope/pull/184
|
||||
if (ev.key === '0') {
|
||||
this.zoom(new Vec2(width / 2, height / 2), 1e9)
|
||||
} else if (ev.key === 'ArrowRight' || ev.key === 'd') {
|
||||
} else if (ev.key === 'ArrowRight' || ev.code === 'KeyD') {
|
||||
this.pan(new Vec2(100, 0))
|
||||
} else if (ev.key === 'ArrowLeft' || ev.key === 'a') {
|
||||
} else if (ev.key === 'ArrowLeft' || ev.code === 'KeyA') {
|
||||
this.pan(new Vec2(-100, 0))
|
||||
} else if (ev.key === 'ArrowUp' || ev.key === 'w') {
|
||||
} else if (ev.key === 'ArrowUp' || ev.code === 'KeyW') {
|
||||
this.pan(new Vec2(0, -100))
|
||||
} else if (ev.key === 'ArrowDown' || ev.key === 's') {
|
||||
} else if (ev.key === 'ArrowDown' || ev.code === 'KeyS') {
|
||||
this.pan(new Vec2(0, 100))
|
||||
} else if (ev.key === 'Escape') {
|
||||
this.props.onNodeSelect(null)
|
||||
|
||||
Reference in New Issue
Block a user