Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
853164ebbf | ||
|
|
729d7c771b | ||
|
|
9d13d95f8d | ||
|
|
085d6298ec | ||
|
|
aa35b17d20 | ||
|
|
a22ab9301f | ||
|
|
e404053837 | ||
|
|
558e98d24d | ||
|
|
7368e15396 | ||
|
|
1bbe3de944 | ||
|
|
8e09be7f7f | ||
|
|
5ee94ec092 | ||
|
|
4d23f1cdee | ||
|
|
fc9260ba1d | ||
|
|
182563dc7c | ||
|
|
e6d9994801 | ||
|
|
29c55c3921 | ||
|
|
0b1050034f | ||
|
|
a79beaa731 | ||
|
|
bca9c52ac9 | ||
|
|
970f1b2107 | ||
|
|
72c05fe6ba | ||
|
|
ee157c4139 | ||
|
|
94d0879417 | ||
|
|
608006232f | ||
|
|
11a3a67dce |
@@ -1,5 +1,39 @@
|
||||
## [Unreleased]
|
||||
|
||||
## [0.7.0]
|
||||
|
||||
### Added
|
||||
|
||||
* Added support to import from linux `perf script` [#135]
|
||||
|
||||
## [0.6.0]
|
||||
|
||||
### Added
|
||||
|
||||
* Added support for multiple threads/processes [#130]
|
||||
* Import all runs & threads from Instruments .trace files instead of just main thread from selected run [#130]
|
||||
|
||||
### Fixed
|
||||
|
||||
* Ensure the JSON schema has actual contents [#133]
|
||||
|
||||
## [0.5.1] - 2018-08-09
|
||||
|
||||
### Fixed
|
||||
|
||||
* Fixed broken CLI
|
||||
|
||||
## [0.5.0] - 2018-08-09
|
||||
|
||||
### Fixed
|
||||
|
||||
* Fix emscripten remapping when symbols contain dashes, like `527:i32s-div` [#129]
|
||||
* Improved firefox import speed and fixed bugs in it [#128]
|
||||
* Prevent non-contiguous blocks in the time ordered flamechart from appearing as a single node for selection [#123]
|
||||
* Prevent dragging from changing selection [#122]
|
||||
* Clamp zoom to prevent floating point issues [#121]
|
||||
* Preserve view state when switching tabs [#100]
|
||||
|
||||
## [0.4.0] - 2018-07-21
|
||||
|
||||
### Added
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
This document describes processes needed by admins of this repository.
|
||||
|
||||
# Publishing
|
||||
|
||||
Publishing speedscope is a multi-step process:
|
||||
|
||||
1. Test the release
|
||||
2. Prepare the release
|
||||
3. Publish to npm
|
||||
4. Deploy the website
|
||||
|
||||
At time of writing, deployment assumes you're running macOS. It probably
|
||||
works if you're on a linux, and almost definitely does not work on Windows.
|
||||
|
||||
## Test the release
|
||||
|
||||
Speedscope is tested in CI, so all the automated tests should be passing. We'll
|
||||
just be doing a few sanity checks to make sure the build & deployment machinery is working correctly.
|
||||
|
||||
Run `scripts/prepare-test-installation.sh`. This will do a mock publish &
|
||||
installation to ensure that the version we're about to publish is going to
|
||||
work. At the end of this command, it should echo a `cd` command to run in your shell
|
||||
to switch to the installation directory. Something like this:
|
||||
|
||||
```
|
||||
Run the following command to switch into the test directory
|
||||
cd /var/folders/l0/qtd9z14973s2tw81vmzwkyp00000gp/T/speedscope-test-installation.9Ssdd2PZ/package
|
||||
```
|
||||
|
||||
Run this command, to switch to the test directory.
|
||||
|
||||
Inside of here, run `bin/cli.js`. This should open a copy of speedscope in browser.
|
||||
Try importing a profile from disk via the browse button and make sure it works.
|
||||
|
||||
Next, try running `bin/cli.js dist/release/perf-vertx*`. This should immediately open
|
||||
speedscope in browser, and the perf-vertx file should load immediately.
|
||||
|
||||
If everything looks good, proceed to "Prepare the release".
|
||||
|
||||
## Prepare the release
|
||||
|
||||
1. Update the version manually in package.json (we intentionally don't use the `npm version` command)
|
||||
2. Update CHANGELOG.md to indicate the changes that were made as part of this release
|
||||
3. Commit the changes with the version name as the commit message, e.g. `git commit -m 0.6.0`
|
||||
4. `git tag` the release. We use tags like `v0.6.0`, e.g. `git tag v0.6.0`
|
||||
5. `git push`
|
||||
|
||||
## Publish to npm
|
||||
|
||||
Assuming everything went well in the previous two phases, publishing should just be
|
||||
a matter of running `npm publish`.
|
||||
|
||||
### Verifying the publish
|
||||
|
||||
To verify that the publish was successful, run `npm install -g speedscope`.
|
||||
Try `speedscope`, which should open speedscope in browser.
|
||||
Try `speedscope sample/profiles/stackcollapse/simple.txt`, which should immediately load the profile
|
||||
|
||||
## Deploying the website
|
||||
|
||||
https://www.speedscope.app/ is hosted on GitHub pages, and is published via pushing
|
||||
to the `gh-pages` branch. The `gh-pages` branch has totally different contents than
|
||||
other branches of this repository: https://github.com/jlfwong/speedscope/tree/gh-pages.
|
||||
|
||||
It's populated by a deploy script which is invoked by running `npm run deploy` script.
|
||||
This will do a build of the static resources, and boot a local server for you to test
|
||||
the compiled assets. Please do not skip the manual testing in this step.
|
||||
|
||||
If everything looks good, you should be able to hit Ctrl+C, and you should see this prompt:
|
||||
|
||||
```
|
||||
Commit release? [yes/no]:
|
||||
```
|
||||
|
||||
If everything looks good, type `yes` then enter. This will commit to the `gh-pages` branch, and the site should automatically deploy shortly after.
|
||||
|
||||
To check if a deploy has happened, you can check https://www.speedscope.app/release.txt
|
||||
which includes the version, the date, and the commit of the deploy.
|
||||
@@ -57,9 +57,22 @@ into the browser from Chrome.
|
||||
|
||||
If the `raw: true` flag is set when recording a dump, the resulting json dump can be imported into speedscope.
|
||||
|
||||
### `perf` and `DTrace`
|
||||
### Linux `perf`
|
||||
|
||||
If you process the output of `perf` or `DTrace` first with Brendan Gregg's `stackcollapse-*.pl` scripts (https://github.com/brendangregg/FlameGraph#2-fold-stacks), the result can be imported into speedscope.
|
||||
You can import profiles recorded using `perf record` and formatted using `perf script`.
|
||||
|
||||
perf record -a -F 999 -g -p PID > perf.data
|
||||
perf script -i perf.data > profile.linux-perf.txt
|
||||
|
||||
Then drop the resulting `perf.txt` into speedscope, or if you have speedscope installed
|
||||
locally, you can run:
|
||||
|
||||
perf record -a -F 999 -g -p PID > perf.data
|
||||
perf script -i perf.data | speedscope -
|
||||
|
||||
### `DTrace`
|
||||
|
||||
If you process the output of `DTrace` first with Brendan Gregg's `stackcollapse-*.pl` scripts (https://github.com/brendangregg/FlameGraph#2-fold-stacks), the result can be imported into speedscope.
|
||||
|
||||
## Importing via URL
|
||||
|
||||
@@ -118,3 +131,5 @@ Once a profile has loaded, the main view is split into two: the top area is the
|
||||
* `r`: Collapse recursion in the flamegraphs
|
||||
* `Cmd+S`/`Ctrl+S` to save the current profile
|
||||
* `Cmd+O`/`Ctrl+O` to open a new profile
|
||||
* `n`: Go to next profile/thread if one is available
|
||||
* `p`: Go to previous profile/thread if one is available
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.0.1 evented profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 0,
|
||||
"line": undefined,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "b",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "c",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "d",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
"a;b;c 3",
|
||||
"a;b 5",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.1.2 sampled profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 0,
|
||||
"line": undefined,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "b",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "c",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "d",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"stacks": Array [
|
||||
"a;b;c 2.00s",
|
||||
"a;b;d 4.00s",
|
||||
"a;b;c 3.00s",
|
||||
"a;b 5.00s",
|
||||
],
|
||||
}
|
||||
`;
|
||||
@@ -166,8 +166,7 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script src="./speedscope.tsx"></script>
|
||||
<script src="../src/speedscope.tsx"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
+2
-2
@@ -52,7 +52,7 @@ async function main() {
|
||||
}
|
||||
|
||||
if (process.argv.includes('--version') || process.argv.includes('-v')) {
|
||||
console.log('v' + require('./package.json').version)
|
||||
console.log('v' + require('../package.json').version)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ async function main() {
|
||||
throw new Error('At most one argument expected')
|
||||
}
|
||||
|
||||
let urlToOpen = 'file://' + path.resolve(__dirname, './dist/release/index.html')
|
||||
let urlToOpen = 'file://' + path.resolve(__dirname, '../dist/release/index.html')
|
||||
|
||||
if (process.argv.length === 3) {
|
||||
const relPath = process.argv[2]
|
||||
@@ -1,59 +0,0 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importFromFirefox 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "a (file:///Users/jlfwong/code/speedscope/sample/simple.js:1)",
|
||||
"line": 1,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 31.992820999992546,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "b (file:///Users/jlfwong/code/speedscope/sample/simple.js:8)",
|
||||
"line": 8,
|
||||
"name": "b",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 20.971447000018088,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "d (file:///Users/jlfwong/code/speedscope/sample/simple.js:20)",
|
||||
"line": 20,
|
||||
"name": "d",
|
||||
"selfWeight": 31.992820999992546,
|
||||
"totalWeight": 31.992820999992546,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "c (file:///Users/jlfwong/code/speedscope/sample/simple.js:14)",
|
||||
"line": 14,
|
||||
"name": "c",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 11.021373999974458,
|
||||
},
|
||||
],
|
||||
"stacks": Array [
|
||||
"a;b;d 989.53µs",
|
||||
"a;c;d 1.02ms",
|
||||
"a;b;d 982.04µs",
|
||||
"a;c;d 1.02ms",
|
||||
"a;b;d 7.00ms",
|
||||
"a;c;d 2.00ms",
|
||||
"a;b;d 981.44µs",
|
||||
"a;c;d 2.00ms",
|
||||
"a;b;d 2.00ms",
|
||||
"a;c;d 3.02ms",
|
||||
"a;b;d 4.03ms",
|
||||
"a;c;d 1.96ms",
|
||||
"a;b;d 4.99ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
@@ -1,5 +0,0 @@
|
||||
import {checkProfileSnapshot} from '../test-utils'
|
||||
|
||||
test('importFromFirefox', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Firefox/59/simple-firefox.json')
|
||||
})
|
||||
Generated
+37
-10
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "0.3.0",
|
||||
"version": "0.6.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -4555,7 +4555,8 @@
|
||||
},
|
||||
"fsevents": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
|
||||
"integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -4767,7 +4768,8 @@
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.8",
|
||||
"resolved": "",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
|
||||
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -5285,7 +5287,8 @@
|
||||
},
|
||||
"rc": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "",
|
||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz",
|
||||
"integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -5397,7 +5400,8 @@
|
||||
},
|
||||
"sshpk": {
|
||||
"version": "1.13.0",
|
||||
"resolved": "",
|
||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz",
|
||||
"integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -5443,7 +5447,8 @@
|
||||
},
|
||||
"stringstream": {
|
||||
"version": "0.0.5",
|
||||
"resolved": "",
|
||||
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
|
||||
"integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
@@ -5493,7 +5498,8 @@
|
||||
},
|
||||
"tough-cookie": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
|
||||
"integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
@@ -10611,6 +10617,11 @@
|
||||
"integrity": "sha512-m34Ke8U32HyKRVzUOCAcaiIBLR2ye6syiuRclU5DxyixDPDFqdLbIElhERBrF6gDbPKQR+Vpv5bZ9CCbvN6pdQ==",
|
||||
"dev": true
|
||||
},
|
||||
"preact-redux": {
|
||||
"version": "github:jlfwong/preact-redux#a56dcc460f4993c8dd33b7c9caa5e4bde1fa72dd",
|
||||
"from": "github:jlfwong/preact-redux#a56dcc4",
|
||||
"dev": true
|
||||
},
|
||||
"prelude-ls": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
|
||||
@@ -11012,6 +11023,16 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"redux": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/redux/-/redux-4.0.0.tgz",
|
||||
"integrity": "sha512-NnnHF0h0WVE/hXyrB6OlX67LYRuaf/rJcbWvnHHEPCF/Xa/AZpwhs/20WyqzQae5x4SD2F9nPObgBh2rxAgLiA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"loose-envify": "^1.1.0",
|
||||
"symbol-observable": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"regenerate": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
|
||||
@@ -12728,6 +12749,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"symbol-observable": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
|
||||
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
|
||||
"dev": true
|
||||
},
|
||||
"symbol-tree": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
|
||||
@@ -13366,9 +13393,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"typescript-eslint-parser": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/typescript-eslint-parser/-/typescript-eslint-parser-14.0.0.tgz",
|
||||
"integrity": "sha512-xDvhgZX08RRKSyz8oWXI/V9gjXelh4/a9jGFmmHnn/j/GMXKOQ6E6NAGVjQSvGBrjT/TMobKqsrxnBcVr4sfIw==",
|
||||
"version": "17.0.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript-eslint-parser/-/typescript-eslint-parser-17.0.1.tgz",
|
||||
"integrity": "sha512-EPCOjxjnGqu9kQwH3CAwa1Jjty2Dn0FnehksVEmfZxXtkEK2Jerb2lnd/htsj1XooqEkKC5AzCaK+qOxHaBDBQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lodash.unescape": "4.0.1",
|
||||
|
||||
+13
-10
@@ -1,22 +1,23 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "0.4.0",
|
||||
"version": "0.7.0",
|
||||
"description": "",
|
||||
"repository": "jlfwong/speedscope",
|
||||
"main": "index.js",
|
||||
"bin": {
|
||||
"speedscope": "./cli.js"
|
||||
"speedscope": "./bin/cli.js"
|
||||
},
|
||||
"scripts": {
|
||||
"deploy": "./deploy.sh",
|
||||
"prepack": "./build-release.sh",
|
||||
"prettier": "prettier --write './**/*.ts' './**/*.tsx'",
|
||||
"lint": "eslint './**/*.ts' './**/*.tsx'",
|
||||
"jest": "./test-setup.sh && jest",
|
||||
"deploy": "./scripts/deploy.sh",
|
||||
"prepack": "./scripts/build-release.sh",
|
||||
"prettier": "prettier --write 'src/**/*.ts' 'src/**/*.tsx'",
|
||||
"lint": "eslint 'src/**/*.ts' 'src/**/*.tsx'",
|
||||
"jest": "./scripts/test-setup.sh && jest --runInBand",
|
||||
"coverage": "npm run jest -- --coverage && coveralls < coverage/lcov.info",
|
||||
"test": "tsc --noEmit && npm run lint && npm run coverage",
|
||||
"serve": "parcel index.html --open --no-autoinstall"
|
||||
"serve": "parcel assets/index.html --open --no-autoinstall"
|
||||
},
|
||||
"files": ["cli.js", "dist/release/**", "!*.map"],
|
||||
"files": ["bin/cli.js", "dist/release/**", "!*.map"],
|
||||
"browserslist": ["last 2 Chrome versions", "last 2 Firefox versions"],
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
@@ -35,12 +36,14 @@
|
||||
"pako": "1.0.6",
|
||||
"parcel-bundler": "1.9.2",
|
||||
"preact": "8.2.7",
|
||||
"preact-redux": "jlfwong/preact-redux#a56dcc4",
|
||||
"prettier": "1.12.0",
|
||||
"quicktype": "15.0.45",
|
||||
"redux": "^4.0.0",
|
||||
"regl": "1.3.1",
|
||||
"ts-jest": "22.4.6",
|
||||
"typescript": "2.8.1",
|
||||
"typescript-eslint-parser": "14.0.0",
|
||||
"typescript-eslint-parser": "17.0.1",
|
||||
"uglify-es": "3.2.2"
|
||||
},
|
||||
"jest": {
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
import {Component} from 'preact'
|
||||
|
||||
export interface SerializedComponent<S> {
|
||||
state: S
|
||||
serializedSubcomponents: {[key: string]: any}
|
||||
}
|
||||
|
||||
export abstract class ReloadableComponent<P, S> extends Component<P, S> {
|
||||
serialize(): SerializedComponent<S> {
|
||||
const serializedSubcomponents: {[key: string]: any} = Object.create(null)
|
||||
|
||||
const subcomponents = this.subcomponents()
|
||||
for (const key in subcomponents) {
|
||||
const val = subcomponents[key]
|
||||
if (val && val instanceof ReloadableComponent) {
|
||||
serializedSubcomponents[key] = val.serialize()
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
state: this.state,
|
||||
serializedSubcomponents,
|
||||
}
|
||||
}
|
||||
rehydrate(serialized: SerializedComponent<S>) {
|
||||
this.setState(serialized.state, () => {
|
||||
const subcomponents = this.subcomponents()
|
||||
for (const key in subcomponents) {
|
||||
const val = subcomponents[key]
|
||||
const data = serialized.serializedSubcomponents[key]
|
||||
if (data && val && val instanceof ReloadableComponent) {
|
||||
val.rehydrate(data)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
subcomponents(): {[key: string]: any} {
|
||||
return Object.create(null)
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
||||
simple-terminat 10 198792.736893: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
@@ -0,0 +1,881 @@
|
||||
# ========
|
||||
# captured on: Wed Aug 15 16:01:24 2018
|
||||
# hostname : e2b5bab9a538
|
||||
# os release : 4.9.93-linuxkit-aufs
|
||||
# perf version : 4.15.18
|
||||
# arch : x86_64
|
||||
# nrcpus online : 4
|
||||
# nrcpus avail : 4
|
||||
# cpudesc : Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz
|
||||
# cpuid : GenuineIntel,6,70,1
|
||||
# total memory : 2046644 kB
|
||||
# cmdline : /usr/lib/linux-tools-4.15.0-30/perf record -F 999 -g ./simple-terminates
|
||||
# event : name = cpu-clock, , type = 1, size = 112, { sample_period, sample_freq } = 999, sample_type = IP|TID|TIME|CALLCHAIN|PERIOD, disabled = 1, inherit = 1, mmap = 1, comm = 1, freq = 1, enable_on_exec = 1, task = 1, sample_id_all = 1, exclude_guest = 1, mmap2 = 1, comm_exec = 1
|
||||
# CPU_TOPOLOGY info available, use -I to display
|
||||
# pmu mappings: breakpoint = 5, power = 7, software = 1, tracepoint = 2, msr = 6
|
||||
# CACHE info available, use -I to display
|
||||
# missing features: TRACING_DATA NUMA_TOPOLOGY BRANCH_STACK GROUP_DESC AUXTRACE STAT
|
||||
# ========
|
||||
#
|
||||
simple-terminat 9 198789.478194: 1001001 cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.479183: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.480175: 1001001 cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.481194: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.482189: 1001001 cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.482989: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.484239: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.485180: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.486198: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.487190: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.488202: 1001001 cpu-clock:
|
||||
6aa _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.489329: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.490298: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.491297: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.492295: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.493164: 1001001 cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.494212: 1001001 cpu-clock:
|
||||
685 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.495431: 1001001 cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.496316: 1001001 cpu-clock:
|
||||
655 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.497329: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.498322: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.499325: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.500327: 1001001 cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.501320: 1001001 cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.502265: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.503165: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.504336: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.505331: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.506328: 1001001 cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.507324: 1001001 cpu-clock:
|
||||
670 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.508328: 1001001 cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.509334: 1001001 cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.510272: 1001001 cpu-clock:
|
||||
67c _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.511373: 1001001 cpu-clock:
|
||||
64c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.512319: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.513188: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.514391: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.515336: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.516359: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.517344: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.518263: 1001001 cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.519381: 1001001 cpu-clock:
|
||||
6b3 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.520359: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.521293: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.522326: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.523217: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.524395: 1001001 cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.525355: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.526189: 1001001 cpu-clock:
|
||||
6b3 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.527412: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.528331: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.529367: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.530368: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.531369: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.532360: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.533218: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.534427: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.535372: 1001001 cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.536386: 1001001 cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.537337: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.538397: 1001001 cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.539383: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.540390: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.541389: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.542400: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.543268: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.544277: 1001001 cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.545289: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.546425: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.547283: 1001001 cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.548516: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.549479: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.550495: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.551493: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.552486: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.553398: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.554516: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.555493: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.556494: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.557354: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.558422: 1001001 cpu-clock:
|
||||
679 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.559521: 1001001 cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.560351: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.561388: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.562544: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.563411: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.564311: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.565551: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.566493: 1001001 cpu-clock:
|
||||
679 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.567486: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.568508: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.569498: 1001001 cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.570501: 1001001 cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.571502: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.572502: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.573415: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.574532: 1001001 cpu-clock:
|
||||
679 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.575498: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.576507: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.577513: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.578510: 1001001 cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.579516: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.580509: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.581511: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.582519: 1001001 cpu-clock:
|
||||
655 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.583440: 1001001 cpu-clock:
|
||||
6b3 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.584538: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.585513: 1001001 cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.586522: 1001001 cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.587526: 1001001 cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.588513: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.589523: 1001001 cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.590520: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.591524: 1001001 cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.592527: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.593438: 1001001 cpu-clock:
|
||||
679 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.594550: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.595513: 1001001 cpu-clock:
|
||||
6bc _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.596531: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.597523: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.598527: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.599528: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.600528: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.601529: 1001001 cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.602525: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.603449: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.604547: 1001001 cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.605522: 1001001 cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.606529: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.607410: 1001001 cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.608466: 1001001 cpu-clock:
|
||||
618 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.609472: 1001001 cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.610646: 1001001 cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.611607: 1001001 cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.612623: 1001001 cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9 198789.613576: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
@@ -0,0 +1,877 @@
|
||||
simple-terminat 9/9 198791.127353: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.128290: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.129324: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.130316: cpu-clock:
|
||||
6b3 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.131320: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.132319: cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.133315: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.134322: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.135321: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.136320: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.137351: cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.138306: cpu-clock:
|
||||
6b3 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.139325: cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.140311: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.141325: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.142313: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.143342: cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.144354: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.145382: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.146345: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.147357: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.148361: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.149342: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.150356: cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.151341: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.152346: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.153346: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.154346: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.155347: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.156347: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.157355: cpu-clock:
|
||||
679 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.158347: cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.159352: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.160373: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.161353: cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.162359: cpu-clock:
|
||||
6b3 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.163363: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.164353: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.165365: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.166367: cpu-clock:
|
||||
6b3 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.167368: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.168370: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.169356: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.170362: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.171331: cpu-clock:
|
||||
680 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.172382: cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.173360: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.174372: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.175463: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.176511: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.177286: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.178500: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.179495: cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.180496: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.181506: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.182430: cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.183529: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.184491: cpu-clock:
|
||||
6bc _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.185341: cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.186539: cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.187500: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.188512: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.189509: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.190317: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.191545: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.192298: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.193537: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.194522: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.195336: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.196578: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.197454: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.198536: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.199525: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.200521: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.201544: cpu-clock:
|
||||
655 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.202435: cpu-clock:
|
||||
6aa _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.203550: cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.204529: cpu-clock:
|
||||
677 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.205532: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.206533: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.207533: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.208532: cpu-clock:
|
||||
679 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.209542: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.210538: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.211536: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.212400: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.213571: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.214532: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.215548: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.216391: cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.217575: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.218511: cpu-clock:
|
||||
6bf _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.219538: cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.220531: cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.221401: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.222426: cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.223566: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.224531: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.225462: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.226563: cpu-clock:
|
||||
64e _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.227376: cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.228586: cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.229367: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.230467: cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.231584: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.232398: cpu-clock:
|
||||
6aa _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.233591: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.234477: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.235641: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.236770: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.237747: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.238743: cpu-clock:
|
||||
682 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.239739: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.240744: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.241743: cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.242591: cpu-clock:
|
||||
63c _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.243804: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.244620: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.245775: cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.246736: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.247757: cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.248761: cpu-clock:
|
||||
645 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.249760: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.250751: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.251765: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.252616: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.253805: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.254754: cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
6ee main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.255617: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.256794: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.257759: cpu-clock:
|
||||
61e _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.258769: cpu-clock:
|
||||
670 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.259766: cpu-clock:
|
||||
613 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.260771: cpu-clock:
|
||||
6b1 _Z5gammav (/workdir/simple-terminates)
|
||||
6f8 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.261751: cpu-clock:
|
||||
60c _Z5alphav (/workdir/simple-terminates)
|
||||
690 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.262617: cpu-clock:
|
||||
615 _Z5alphav (/workdir/simple-terminates)
|
||||
6e9 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
|
||||
simple-terminat 9/9 198791.263815: cpu-clock:
|
||||
ffffffffad1ee8b5 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad1ee98a [unknown] ([kernel.kallsyms])
|
||||
ffffffffad1f1ca9 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad1aab1d [unknown] ([kernel.kallsyms])
|
||||
ffffffffad1c4c94 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad1c5ab1 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad1ccc4a [unknown] ([kernel.kallsyms])
|
||||
ffffffffad0dc851 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad0e27a4 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad0e2d50 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad0e2dc1 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad0033c0 [unknown] ([kernel.kallsyms])
|
||||
ffffffffad7fa08e [unknown] ([kernel.kallsyms])
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
simple-terminat 10 198792.736893: 1001001 cpu-clock:
|
||||
643 _Z4betav (/workdir/simple-terminates)
|
||||
695 _Z5deltav (/workdir/simple-terminates)
|
||||
6f3 main (/workdir/simple-terminates)
|
||||
21b97 __libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)
|
||||
6ce258d4c544155 [unknown] ([unknown])
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"exporter": "speedscope@0.6.0",
|
||||
"$schema": "https://www.speedscope.app/file-format-schema.json",
|
||||
"name": "Two Samples",
|
||||
"activeProfileIndex": 1,
|
||||
"profiles": [
|
||||
{
|
||||
"type": "sampled",
|
||||
"name": "one",
|
||||
"unit": "seconds",
|
||||
"startValue": 0,
|
||||
"endValue": 14,
|
||||
"samples": [[0, 1, 2], [0, 1, 2], [0, 1, 3], [0, 1, 2], [0, 1]],
|
||||
"weights": [1, 1, 4, 3, 5]
|
||||
},
|
||||
{
|
||||
"type": "sampled",
|
||||
"name": "two",
|
||||
"unit": "seconds",
|
||||
"startValue": 0,
|
||||
"endValue": 14,
|
||||
"samples": [[0, 1, 2], [0, 1, 2], [0, 1, 3], [0, 1, 2], [0, 1]],
|
||||
"weights": [1, 1, 4, 3, 5]
|
||||
}
|
||||
],
|
||||
"shared": {
|
||||
"frames": [{"name": "a"}, {"name": "b"}, {"name": "c"}, {"name": "d"}]
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
simple
|
||||
forks
|
||||
simple-terminates
|
||||
random
|
||||
*.dSYM
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
FROM ubuntu:bionic
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get install -y build-essential
|
||||
RUN apt-get install -y linux-tools-common linux-tools-generic
|
||||
RUN ln -sf /usr/lib/linux-tools/4.15.0-30-generic/perf /usr/bin/perf
|
||||
|
||||
WORKDIR /workdir
|
||||
|
||||
ADD . /workdir
|
||||
|
||||
RUN make clean simple-terminates forks
|
||||
@@ -1,9 +1,25 @@
|
||||
.PHONY: all
|
||||
.PHONY: all clean linux-perf
|
||||
|
||||
all: simple random
|
||||
all: simple simple-terminates random forks
|
||||
|
||||
clean:
|
||||
rm -f simple simple-terminates random forks
|
||||
|
||||
simple: simple.cpp
|
||||
g++ -Wall -g -o $@ $<
|
||||
$(CXX) -Wall -g -o $@ $<
|
||||
|
||||
simple-terminates: simple-terminates.cpp
|
||||
$(CXX) -Wall -g -o $@ $<
|
||||
|
||||
forks: forks.cpp
|
||||
$(CXX) -Wall -g -o $@ $<
|
||||
|
||||
random: random.cpp
|
||||
g++ -Wall -g -o $@ $<
|
||||
$(CXX) -Wall -g -o $@ $<
|
||||
|
||||
linux-perf:
|
||||
docker build -t speedscope-ubuntu .
|
||||
docker run --privileged speedscope-ubuntu /bin/bash perf-script.sh forks > ../../profiles/linux-perf/forks.linux-perf.txt
|
||||
# docker run --privileged speedscope-ubuntu /bin/bash perf-script.sh with-header > ../../profiles/linux-perf/simple-with-header.linux-perf.txt
|
||||
# docker run --privileged speedscope-ubuntu /bin/bash perf-script.sh with-pid > ../../profiles/linux-perf/simple-with-pid.linux-perf.txt
|
||||
# docker run --privileged speedscope-ubuntu /bin/bash perf-script.sh > ../../profiles/linux-perf/simple.linux-perf.txt
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
#include <cstdlib>
|
||||
#include <unistd.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void alpha()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
}
|
||||
|
||||
void beta()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
}
|
||||
|
||||
void delta()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
alpha();
|
||||
beta();
|
||||
}
|
||||
|
||||
void gamma()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
pid_t pid1 = fork();
|
||||
if (pid1 == 0)
|
||||
{
|
||||
// Child process 1
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
alpha();
|
||||
beta();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pid_t pid2 = fork();
|
||||
|
||||
if (pid2 == 0)
|
||||
{
|
||||
// Child process 2
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
alpha();
|
||||
beta();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
alpha();
|
||||
beta();
|
||||
gamma();
|
||||
delta();
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eoux pipefail
|
||||
|
||||
if [[ "$1" == "system-wide" ]]; then
|
||||
perf record -a -F 999 -g ./simple-terminates > perf.data
|
||||
perf script -i perf.data
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "$1" == "forks" ]]; then
|
||||
perf record -a -F 999 -g ./forks > perf.data
|
||||
perf script -i perf.data
|
||||
exit 0
|
||||
fi
|
||||
|
||||
perf record -F 999 -g ./simple-terminates > perf.data
|
||||
|
||||
if [[ "$1" == "with-header" ]]; then
|
||||
perf script --header -i perf.data
|
||||
elif [[ "$1" == "with-pid" ]]; then
|
||||
# perf script -F comm,pid,tid,time,event,ip,sym,dso -i perf.data
|
||||
# comm: command (maybe truncated)
|
||||
# pid: process ID
|
||||
# id: thread ID
|
||||
# time: time of event
|
||||
# ip: instruction pointer
|
||||
# sym: symbol
|
||||
# dso: dynamic shared object
|
||||
perf script -F comm,pid,tid,time,event,ip,sym,dso -i perf.data
|
||||
else
|
||||
perf script -i perf.data
|
||||
fi
|
||||
@@ -0,0 +1,52 @@
|
||||
#include <cstdlib>
|
||||
using namespace std;
|
||||
|
||||
void alpha()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
}
|
||||
|
||||
void beta()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
}
|
||||
|
||||
void delta()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
alpha();
|
||||
beta();
|
||||
}
|
||||
|
||||
void gamma()
|
||||
{
|
||||
int z = 3;
|
||||
for (int i = 0; i < 100000; i++)
|
||||
{
|
||||
z *= 3;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
alpha();
|
||||
beta();
|
||||
delta();
|
||||
gamma();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
<script src="./recursion.js"></script>
|
||||
@@ -0,0 +1,41 @@
|
||||
function alpha(depth) {
|
||||
if (depth > 15 * Math.random()) {
|
||||
return
|
||||
}
|
||||
beta(depth + 1)
|
||||
delta()
|
||||
gamma()
|
||||
}
|
||||
|
||||
function beta(depth) {
|
||||
alpha(depth + 1)
|
||||
for (let i = 0; i < 10; i++) {
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
|
||||
function delta() {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
|
||||
function gamma() {
|
||||
let prod = 1
|
||||
for (let i = 1; i < 1000; i++) {
|
||||
prod *= i
|
||||
}
|
||||
return prod
|
||||
}
|
||||
|
||||
function main() {
|
||||
for (let i = 0; i < 100; i++) {
|
||||
alpha(0)
|
||||
}
|
||||
}
|
||||
|
||||
console.profile('recursion')
|
||||
main()
|
||||
setTimeout(() => {
|
||||
console.profileEnd('recursion')
|
||||
}, 0)
|
||||
@@ -1,23 +1,23 @@
|
||||
function a() {
|
||||
function alpha() {
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
b()
|
||||
c()
|
||||
beta()
|
||||
delta()
|
||||
}
|
||||
}
|
||||
|
||||
function b() {
|
||||
function beta() {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
d()
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
|
||||
function c() {
|
||||
function delta() {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
d()
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
|
||||
function d() {
|
||||
function gamma() {
|
||||
let prod = 1
|
||||
for (let i = 1; i < 1000; i++) {
|
||||
prod *= i
|
||||
@@ -25,10 +25,8 @@ function d() {
|
||||
return prod
|
||||
}
|
||||
|
||||
console.profile('a')
|
||||
a()
|
||||
console.profile('simple')
|
||||
alpha()
|
||||
setTimeout(() => {
|
||||
console.profileEnd('a')
|
||||
console.profileEnd('simple')
|
||||
}, 0)
|
||||
|
||||
window.addEventListener('click', a)
|
||||
|
||||
@@ -1,345 +0,0 @@
|
||||
import {ReloadableComponent} from './reloadable'
|
||||
import {Profile, Frame, CallTreeNode} from './profile'
|
||||
import {StyleSheet, css} from 'aphrodite'
|
||||
import {SortMethod, ProfileTableView} from './profile-table-view'
|
||||
import {h} from 'preact'
|
||||
import {commonStyle, Sizes, Colors, FontSize} from './style'
|
||||
import {CanvasContext} from './canvas-context'
|
||||
import {FlamechartRenderer, FlamechartRowAtlasKey} from './flamechart-renderer'
|
||||
import {Flamechart} from './flamechart'
|
||||
import {RowAtlas} from './row-atlas'
|
||||
import {Rect, AffineTransform, Vec2, clamp} from './math'
|
||||
import {FlamechartPanZoomView, FlamechartPanZoomViewProps} from './flamechart-pan-zoom-view'
|
||||
import {noop, formatPercent} from './utils'
|
||||
import {Hovertip} from './hovertip'
|
||||
|
||||
interface FlamechartWrapperProps {
|
||||
flamechart: Flamechart
|
||||
canvasContext: CanvasContext
|
||||
flamechartRenderer: FlamechartRenderer
|
||||
renderInverted: boolean
|
||||
}
|
||||
|
||||
interface FlamechartWrapperState {
|
||||
hover: {
|
||||
node: CallTreeNode
|
||||
event: MouseEvent
|
||||
} | null
|
||||
configSpaceViewportRect: Rect
|
||||
}
|
||||
|
||||
export class FlamechartWrapper extends ReloadableComponent<
|
||||
FlamechartWrapperProps,
|
||||
FlamechartWrapperState
|
||||
> {
|
||||
constructor(props: FlamechartWrapperProps) {
|
||||
super(props)
|
||||
this.state = {
|
||||
hover: null,
|
||||
configSpaceViewportRect: Rect.empty,
|
||||
}
|
||||
}
|
||||
|
||||
private clampViewportToFlamegraph(viewportRect: Rect, flamegraph: Flamechart, inverted: boolean) {
|
||||
const configSpaceSize = new Vec2(flamegraph.getTotalWeight(), flamegraph.getLayers().length)
|
||||
|
||||
const width = clamp(
|
||||
viewportRect.size.x,
|
||||
Math.min(configSpaceSize.x, 3 * flamegraph.getMinFrameWidth()),
|
||||
configSpaceSize.x,
|
||||
)
|
||||
|
||||
const size = viewportRect.size.withX(width)
|
||||
|
||||
const origin = Vec2.clamp(
|
||||
viewportRect.origin,
|
||||
new Vec2(0, inverted ? 0 : -1),
|
||||
Vec2.max(Vec2.zero, configSpaceSize.minus(size).plus(new Vec2(0, 1))),
|
||||
)
|
||||
|
||||
return new Rect(origin, viewportRect.size.withX(width))
|
||||
}
|
||||
|
||||
private setConfigSpaceViewportRect = (viewportRect: Rect) => {
|
||||
this.setState({
|
||||
configSpaceViewportRect: this.clampViewportToFlamegraph(
|
||||
viewportRect,
|
||||
this.props.flamechart,
|
||||
this.props.renderInverted,
|
||||
),
|
||||
})
|
||||
}
|
||||
|
||||
private transformViewport = (transform: AffineTransform) => {
|
||||
this.setConfigSpaceViewportRect(transform.transformRect(this.state.configSpaceViewportRect))
|
||||
}
|
||||
|
||||
private formatValue(weight: number) {
|
||||
const totalWeight = this.props.flamechart.getTotalWeight()
|
||||
const percent = 100 * weight / totalWeight
|
||||
const formattedPercent = formatPercent(percent)
|
||||
return `${this.props.flamechart.formatValue(weight)} (${formattedPercent})`
|
||||
}
|
||||
|
||||
private renderTooltip() {
|
||||
if (!this.container) return null
|
||||
|
||||
const {hover} = this.state
|
||||
if (!hover) return null
|
||||
const {width, height, left, top} = this.container.getBoundingClientRect()
|
||||
const offset = new Vec2(hover.event.clientX - left, hover.event.clientY - top)
|
||||
|
||||
return (
|
||||
<Hovertip containerSize={new Vec2(width, height)} offset={offset}>
|
||||
<span className={css(style.hoverCount)}>
|
||||
{this.formatValue(hover.node.getTotalWeight())}
|
||||
</span>{' '}
|
||||
{hover.node.frame.name}
|
||||
</Hovertip>
|
||||
)
|
||||
}
|
||||
|
||||
container: HTMLDivElement | null = null
|
||||
containerRef = (container?: Element) => {
|
||||
this.container = (container as HTMLDivElement) || null
|
||||
}
|
||||
|
||||
private setNodeHover = (hover: {node: CallTreeNode; event: MouseEvent} | null) => {
|
||||
this.setState({hover})
|
||||
}
|
||||
|
||||
render() {
|
||||
const props: FlamechartPanZoomViewProps = {
|
||||
...(this.props as FlamechartWrapperProps),
|
||||
selectedNode: null,
|
||||
onNodeHover: this.setNodeHover,
|
||||
onNodeSelect: noop,
|
||||
configSpaceViewportRect: this.state.configSpaceViewportRect,
|
||||
setConfigSpaceViewportRect: this.setConfigSpaceViewportRect,
|
||||
transformViewport: this.transformViewport,
|
||||
}
|
||||
return (
|
||||
<div
|
||||
className={css(commonStyle.fillY, commonStyle.fillX, commonStyle.vbox)}
|
||||
ref={this.containerRef}
|
||||
>
|
||||
<FlamechartPanZoomView {...props} />
|
||||
{this.renderTooltip()}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
interface SandwichViewProps {
|
||||
profile: Profile
|
||||
flattenRecursion: boolean
|
||||
|
||||
// TODO(jlfwong): It's kind of awkward requiring both of these
|
||||
getColorBucketForFrame: (frame: Frame) => number
|
||||
getCSSColorForFrame: (frame: Frame) => string
|
||||
|
||||
sortMethod: SortMethod
|
||||
setSortMethod: (sortMethod: SortMethod) => void
|
||||
canvasContext: CanvasContext
|
||||
rowAtlas: RowAtlas<FlamechartRowAtlasKey>
|
||||
}
|
||||
|
||||
interface CallerCalleeState {
|
||||
selectedFrame: Frame
|
||||
|
||||
invertedCallerFlamegraph: Flamechart
|
||||
invertedCallerFlamegraphRenderer: FlamechartRenderer
|
||||
|
||||
calleeFlamegraph: Flamechart
|
||||
calleeFlamegraphRenderer: FlamechartRenderer
|
||||
}
|
||||
|
||||
interface SandwichViewState {
|
||||
callerCallee: CallerCalleeState | null
|
||||
}
|
||||
|
||||
export class SandwichView extends ReloadableComponent<SandwichViewProps, SandwichViewState> {
|
||||
constructor(props: SandwichViewProps) {
|
||||
super(props)
|
||||
this.state = {
|
||||
callerCallee: null,
|
||||
}
|
||||
}
|
||||
|
||||
private setSelectedFrame = (
|
||||
selectedFrame: Frame | null,
|
||||
props: SandwichViewProps = this.props,
|
||||
) => {
|
||||
const {profile, canvasContext, rowAtlas, getColorBucketForFrame, flattenRecursion} = props
|
||||
|
||||
if (!selectedFrame) {
|
||||
this.setState({callerCallee: null})
|
||||
return
|
||||
}
|
||||
|
||||
let invertedCallerProfile = profile.getInvertedProfileForCallersOf(selectedFrame)
|
||||
if (flattenRecursion) {
|
||||
invertedCallerProfile = invertedCallerProfile.getProfileWithRecursionFlattened()
|
||||
}
|
||||
|
||||
const invertedCallerFlamegraph = new Flamechart({
|
||||
getTotalWeight: invertedCallerProfile.getTotalNonIdleWeight.bind(invertedCallerProfile),
|
||||
forEachCall: invertedCallerProfile.forEachCallGrouped.bind(invertedCallerProfile),
|
||||
formatValue: invertedCallerProfile.formatValue.bind(invertedCallerProfile),
|
||||
getColorBucketForFrame,
|
||||
})
|
||||
const invertedCallerFlamegraphRenderer = new FlamechartRenderer(
|
||||
canvasContext,
|
||||
rowAtlas,
|
||||
invertedCallerFlamegraph,
|
||||
{inverted: true},
|
||||
)
|
||||
|
||||
let calleeProfile = profile.getProfileForCalleesOf(selectedFrame)
|
||||
|
||||
if (flattenRecursion) {
|
||||
calleeProfile = calleeProfile.getProfileWithRecursionFlattened()
|
||||
}
|
||||
|
||||
const calleeFlamegraph = new Flamechart({
|
||||
getTotalWeight: calleeProfile.getTotalNonIdleWeight.bind(calleeProfile),
|
||||
forEachCall: calleeProfile.forEachCallGrouped.bind(calleeProfile),
|
||||
formatValue: calleeProfile.formatValue.bind(calleeProfile),
|
||||
getColorBucketForFrame,
|
||||
})
|
||||
const calleeFlamegraphRenderer = new FlamechartRenderer(
|
||||
canvasContext,
|
||||
rowAtlas,
|
||||
calleeFlamegraph,
|
||||
)
|
||||
|
||||
this.setState({
|
||||
callerCallee: {
|
||||
selectedFrame,
|
||||
invertedCallerFlamegraph,
|
||||
invertedCallerFlamegraphRenderer,
|
||||
calleeFlamegraph,
|
||||
calleeFlamegraphRenderer,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
onWindowKeyPress = (ev: KeyboardEvent) => {
|
||||
if (ev.key === 'Escape') {
|
||||
this.setState({callerCallee: null})
|
||||
}
|
||||
}
|
||||
|
||||
componentWillReceiveProps(nextProps: SandwichViewProps) {
|
||||
if (this.props.flattenRecursion !== nextProps.flattenRecursion) {
|
||||
if (this.state.callerCallee) {
|
||||
this.setSelectedFrame(this.state.callerCallee.selectedFrame, nextProps)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
window.addEventListener('keydown', this.onWindowKeyPress)
|
||||
}
|
||||
componentWillUnmount() {
|
||||
window.removeEventListener('keydown', this.onWindowKeyPress)
|
||||
}
|
||||
|
||||
render() {
|
||||
const {canvasContext} = this.props
|
||||
const {callerCallee} = this.state
|
||||
|
||||
let selectedFrame: Frame | null = null
|
||||
let flamegraphViews: JSX.Element | null = null
|
||||
|
||||
if (callerCallee) {
|
||||
selectedFrame = callerCallee.selectedFrame
|
||||
flamegraphViews = (
|
||||
<div className={css(commonStyle.fillY, style.callersAndCallees, commonStyle.vbox)}>
|
||||
<div className={css(commonStyle.hbox, style.panZoomViewWraper)}>
|
||||
<div className={css(style.flamechartLabelParent)}>
|
||||
<div className={css(style.flamechartLabel)}>Callers</div>
|
||||
</div>
|
||||
<FlamechartWrapper
|
||||
flamechart={callerCallee.invertedCallerFlamegraph}
|
||||
canvasContext={canvasContext}
|
||||
flamechartRenderer={callerCallee.invertedCallerFlamegraphRenderer}
|
||||
renderInverted={true}
|
||||
/>
|
||||
</div>
|
||||
<div className={css(style.divider)} />
|
||||
<div className={css(commonStyle.hbox, style.panZoomViewWraper)}>
|
||||
<div className={css(style.flamechartLabelParent, style.flamechartLabelParentBottom)}>
|
||||
<div className={css(style.flamechartLabel, style.flamechartLabelBottom)}>Callees</div>
|
||||
</div>
|
||||
<FlamechartWrapper
|
||||
flamechart={callerCallee.calleeFlamegraph}
|
||||
canvasContext={canvasContext}
|
||||
flamechartRenderer={callerCallee.calleeFlamegraphRenderer}
|
||||
renderInverted={false}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={css(commonStyle.hbox, commonStyle.fillY)}>
|
||||
<div className={css(style.tableView)}>
|
||||
<ProfileTableView
|
||||
selectedFrame={selectedFrame}
|
||||
setSelectedFrame={this.setSelectedFrame}
|
||||
profile={this.props.profile}
|
||||
getCSSColorForFrame={this.props.getCSSColorForFrame}
|
||||
sortMethod={this.props.sortMethod}
|
||||
setSortMethod={this.props.setSortMethod}
|
||||
/>
|
||||
</div>
|
||||
{flamegraphViews}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const style = StyleSheet.create({
|
||||
tableView: {
|
||||
flex: 1,
|
||||
},
|
||||
panZoomViewWraper: {
|
||||
flex: 1,
|
||||
},
|
||||
flamechartLabelParent: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
justifyContent: 'flex-end',
|
||||
alignItems: 'flex-start',
|
||||
fontSize: FontSize.TITLE,
|
||||
width: FontSize.TITLE * 1.2,
|
||||
borderRight: `1px solid ${Colors.LIGHT_GRAY}`,
|
||||
},
|
||||
flamechartLabelParentBottom: {
|
||||
justifyContent: 'flex-start',
|
||||
},
|
||||
flamechartLabel: {
|
||||
transform: 'rotate(-90deg)',
|
||||
transformOrigin: '50% 50% 0',
|
||||
width: FontSize.TITLE * 1.2,
|
||||
flexShrink: 1,
|
||||
},
|
||||
flamechartLabelBottom: {
|
||||
transform: 'rotate(-90deg)',
|
||||
display: 'flex',
|
||||
justifyContent: 'flex-end',
|
||||
},
|
||||
callersAndCallees: {
|
||||
flex: 1,
|
||||
borderLeft: `${Sizes.SEPARATOR_HEIGHT}px solid ${Colors.LIGHT_GRAY}`,
|
||||
},
|
||||
divider: {
|
||||
height: 2,
|
||||
background: Colors.LIGHT_GRAY,
|
||||
},
|
||||
hoverCount: {
|
||||
color: Colors.GREEN,
|
||||
},
|
||||
})
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Fail on first error
|
||||
set -e
|
||||
set -euxo pipefail
|
||||
|
||||
OUTDIR=`pwd`/dist/release
|
||||
|
||||
# Typecheck
|
||||
@@ -12,11 +12,12 @@ rm -rf "$OUTDIR"
|
||||
mkdir -p "$OUTDIR"
|
||||
|
||||
# Place info about the current commit into the build dir to easily identify releases
|
||||
date > "$OUTDIR"/release.txt
|
||||
npm ls -depth -1 | head -n 1 | cut -d' ' -f 1 > "$OUTDIR"/release.txt
|
||||
date >> "$OUTDIR"/release.txt
|
||||
git rev-parse HEAD >> "$OUTDIR"/release.txt
|
||||
|
||||
# Place a json schema for the file format into the build directory too
|
||||
node generate-file-format-schema-json.js > "$OUTDIR"/file-format-schema.json
|
||||
node scripts/generate-file-format-schema-json.js > "$OUTDIR"/file-format-schema.json
|
||||
|
||||
# Build the compiled assets
|
||||
node_modules/.bin/parcel build index.html --no-cache --out-dir "$OUTDIR" --public-url "./" --detailed-report
|
||||
node_modules/.bin/parcel build assets/index.html --no-cache --out-dir "$OUTDIR" --public-url "./" --detailed-report
|
||||
@@ -4,13 +4,12 @@
|
||||
# repository into a temporary directory and copy the release build
|
||||
# artifacts into there to commit & push to the gh-pages branch
|
||||
|
||||
# Fail on first error
|
||||
set -e
|
||||
set -euxo pipefail
|
||||
|
||||
OUTDIR=`pwd`/dist/release
|
||||
echo $OUTDIR
|
||||
|
||||
./build-release.sh
|
||||
./scripts/build-release.sh
|
||||
|
||||
# Create a shallow clone of the repository
|
||||
TMPDIR=`mktemp -d -t speedscope-release`
|
||||
@@ -29,7 +28,10 @@ echo www.speedscope.app > CNAME
|
||||
# Set up a handler to run on Ctrl+C
|
||||
trap ctrl_c INT
|
||||
function ctrl_c() {
|
||||
set +x
|
||||
read -p "Commit release? [yes/no]: "
|
||||
set -x
|
||||
|
||||
if [[ $REPLY =~ ^yes$ ]]
|
||||
then
|
||||
git add --all
|
||||
@@ -39,7 +41,10 @@ function ctrl_c() {
|
||||
rm -rf "$TMPDIR"
|
||||
exit 0
|
||||
else
|
||||
set +x
|
||||
echo "Aborting release."
|
||||
set -x
|
||||
|
||||
popd
|
||||
rm -rf "$TMPDIR"
|
||||
exit 1
|
||||
@@ -47,6 +52,7 @@ function ctrl_c() {
|
||||
}
|
||||
|
||||
# Start a local server for verification of the build
|
||||
set +x
|
||||
echo
|
||||
echo
|
||||
echo "Build complete. Starting server on http://localhost:4444/"
|
||||
@@ -54,3 +60,4 @@ echo "Hit Ctrl+C to complete or cancel the release"
|
||||
echo
|
||||
echo
|
||||
python -m SimpleHTTPServer 4444 .
|
||||
set +x
|
||||
@@ -3,11 +3,18 @@ const child_process = require('child_process')
|
||||
|
||||
// Convert the file-format-spec.ts file into a json schema file
|
||||
let jsonSchema = child_process.execSync(
|
||||
'node_modules/.bin/quicktype --lang schema ./file-format-spec.ts',
|
||||
'node_modules/.bin/quicktype --lang schema ./src/lib/file-format-spec.ts',
|
||||
{
|
||||
encoding: 'utf8',
|
||||
},
|
||||
)
|
||||
jsonSchema = JSON.parse(jsonSchema)
|
||||
|
||||
if (!jsonSchema.definitions['FileFormat.File']) {
|
||||
console.error('SCHEMA GENERATION FAILURE: Could not find FileFormat.File in the definitions list')
|
||||
console.error(jsonSchema)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
jsonSchema['$ref'] = '#/definitions/FileFormat.File'
|
||||
console.log(JSON.stringify(jsonSchema, null, 4))
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Prepare a mock installation of speedscope to test it before the actual npm
|
||||
# publish
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
TMPDIR=`mktemp -d -t speedscope-test-installation`
|
||||
PACKEDNAME=`npm pack | tail -n1`
|
||||
|
||||
mv "$PACKEDNAME" "$TMPDIR"
|
||||
cd "$TMPDIR"
|
||||
tar -xvvf "$PACKEDNAME"
|
||||
cd package
|
||||
npm install
|
||||
|
||||
set +x
|
||||
echo
|
||||
echo "Run the following command to switch into the test directory"
|
||||
echo cd "$TMPDIR"/package
|
||||
@@ -1,26 +0,0 @@
|
||||
import {h, render} from 'preact'
|
||||
import {Application} from './application'
|
||||
|
||||
console.log(`speedscope v${require('./package.json').version}`)
|
||||
|
||||
let app: Application | null = null
|
||||
const retained = (window as any)['__retained__'] as any
|
||||
declare const module: any
|
||||
if (module.hot) {
|
||||
module.hot.dispose(() => {
|
||||
if (app) {
|
||||
;(window as any)['__retained__'] = app.serialize()
|
||||
}
|
||||
})
|
||||
module.hot.accept()
|
||||
}
|
||||
|
||||
function ref(instance: Application | null) {
|
||||
app = instance
|
||||
if (instance && retained) {
|
||||
console.log('rehydrating: ', retained)
|
||||
instance.rehydrate(retained)
|
||||
}
|
||||
}
|
||||
|
||||
render(<Application ref={ref} />, document.body, document.body.lastElementChild || undefined)
|
||||
@@ -13,9 +13,9 @@ import {
|
||||
TextureRenderer,
|
||||
TextureRendererProps,
|
||||
} from './texture-cached-renderer'
|
||||
import {StatsPanel} from './stats'
|
||||
import {StatsPanel} from '../lib/stats'
|
||||
|
||||
import {Vec2, Rect} from './math'
|
||||
import {Vec2, Rect} from '../lib/math'
|
||||
import {
|
||||
FlamechartColorPassRenderer,
|
||||
FlamechartColorPassRenderProps,
|
||||
@@ -53,6 +53,7 @@ export class CanvasContext {
|
||||
}, version: ${this.gl.limits.version}`,
|
||||
)
|
||||
;(window as any)['CanvasContext'] = this
|
||||
|
||||
this.rectangleBatchRenderer = new RectangleBatchRenderer(this.gl)
|
||||
this.viewportRectangleRenderer = new ViewportRectangleRenderer(this.gl)
|
||||
this.textureRenderer = new TextureRenderer(this.gl)
|
||||
@@ -1,5 +1,5 @@
|
||||
import regl from 'regl'
|
||||
import {Vec2, Rect, AffineTransform} from './math'
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
|
||||
export interface FlamechartColorPassRenderProps {
|
||||
rectInfoTexture: regl.Texture
|
||||
@@ -1,10 +1,10 @@
|
||||
import regl from 'regl'
|
||||
import {Flamechart} from './flamechart'
|
||||
import {Flamechart} from '../lib/flamechart'
|
||||
import {RectangleBatch} from './rectangle-batch-renderer'
|
||||
import {CanvasContext} from './canvas-context'
|
||||
import {Vec2, Rect, AffineTransform} from './math'
|
||||
import {Color} from './color'
|
||||
import {KeyedSet} from './utils'
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
import {Color} from '../lib/color'
|
||||
import {KeyedSet} from '../lib/utils'
|
||||
import {RowAtlas} from './row-atlas'
|
||||
|
||||
const MAX_BATCH_SIZE = 10000
|
||||
@@ -121,7 +121,7 @@ export class FlamechartRowAtlasKey {
|
||||
}
|
||||
}
|
||||
|
||||
interface RendererOptions {
|
||||
export interface FlamechartRendererOptions {
|
||||
inverted: boolean
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ export class FlamechartRenderer {
|
||||
private canvasContext: CanvasContext,
|
||||
private rowAtlas: RowAtlas<FlamechartRowAtlasKey>,
|
||||
private flamechart: Flamechart,
|
||||
private options: RendererOptions = {inverted: false},
|
||||
private options: FlamechartRendererOptions = {inverted: false},
|
||||
) {
|
||||
const nLayers = flamechart.getLayers().length
|
||||
for (let stackDepth = 0; stackDepth < nLayers; stackDepth++) {
|
||||
@@ -1,5 +1,5 @@
|
||||
import regl from 'regl'
|
||||
import {AffineTransform, Rect} from './math'
|
||||
import {AffineTransform, Rect} from '../lib/math'
|
||||
|
||||
export interface ViewportRectangleRendererProps {
|
||||
configSpaceToPhysicalViewSpace: AffineTransform
|
||||
@@ -1,6 +1,6 @@
|
||||
import regl from 'regl'
|
||||
import {Rect, Vec2, AffineTransform} from './math'
|
||||
import {Color} from './color'
|
||||
import {Rect, Vec2, AffineTransform} from '../lib/math'
|
||||
import {Color} from '../lib/color'
|
||||
|
||||
export class RectangleBatch {
|
||||
private rectCapacity = 1000
|
||||
@@ -1,9 +1,9 @@
|
||||
import regl from 'regl'
|
||||
import {LRUCache} from './lru-cache'
|
||||
import {LRUCache} from '../lib/lru-cache'
|
||||
import {RectangleBatch} from './rectangle-batch-renderer'
|
||||
import {CanvasContext} from './canvas-context'
|
||||
import {Rect, Vec2} from './math'
|
||||
import {Color} from './color'
|
||||
import {Rect, Vec2} from '../lib/math'
|
||||
import {Color} from '../lib/color'
|
||||
|
||||
export class RowAtlas<K> {
|
||||
texture: regl.Texture
|
||||
@@ -1,5 +1,5 @@
|
||||
import regl from 'regl'
|
||||
import {Vec2, Rect, AffineTransform} from './math'
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
|
||||
export interface TextureRendererProps {
|
||||
texture: regl.Texture
|
||||
+5
@@ -40,6 +40,7 @@ Object {
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "simple.txt",
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
@@ -48,3 +49,7 @@ Object {
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromBGFlameGraph: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph: profileGroup.name 1`] = `"simple.txt"`;
|
||||
+10
@@ -49,6 +49,7 @@ Object {
|
||||
"totalWeight": 17557,
|
||||
},
|
||||
],
|
||||
"name": "simple.cpuprofile",
|
||||
"stacks": Array [
|
||||
"(anonymous) 11.57ms",
|
||||
"(anonymous);a;b;d 16.79ms",
|
||||
@@ -57,6 +58,10 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromChromeCPUProfile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromChromeCPUProfile: profileGroup.name 1`] = `"simple.cpuprofile"`;
|
||||
|
||||
exports[`importFromChromeTimeline 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -97,6 +102,7 @@ Object {
|
||||
"totalWeight": 16987,
|
||||
},
|
||||
],
|
||||
"name": "simple-timeline.json",
|
||||
"stacks": Array [
|
||||
"(program) 10.16ms",
|
||||
" 1.99ms",
|
||||
@@ -255,3 +261,7 @@ Object {
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromChromeTimeline: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromChromeTimeline: profileGroup.name 1`] = `"simple-timeline.json"`;
|
||||
@@ -0,0 +1,132 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importFromFirefox 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "a (file:///Users/jlfwong/code/speedscope/sample/simple.js:1)",
|
||||
"line": 1,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 31.992820999992546,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "b (file:///Users/jlfwong/code/speedscope/sample/simple.js:8)",
|
||||
"line": 8,
|
||||
"name": "b",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 20.971447000018088,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "d (file:///Users/jlfwong/code/speedscope/sample/simple.js:20)",
|
||||
"line": 20,
|
||||
"name": "d",
|
||||
"selfWeight": 31.992820999992546,
|
||||
"totalWeight": 31.992820999992546,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/simple.js",
|
||||
"key": "c (file:///Users/jlfwong/code/speedscope/sample/simple.js:14)",
|
||||
"line": 14,
|
||||
"name": "c",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 11.021373999974458,
|
||||
},
|
||||
],
|
||||
"name": "simple-firefox.json",
|
||||
"stacks": Array [
|
||||
"a;b;d 989.53µs",
|
||||
"a;c;d 1.02ms",
|
||||
"a;b;d 982.04µs",
|
||||
"a;c;d 1.02ms",
|
||||
"a;b;d 7.00ms",
|
||||
"a;c;d 2.00ms",
|
||||
"a;b;d 981.44µs",
|
||||
"a;c;d 2.00ms",
|
||||
"a;b;d 2.00ms",
|
||||
"a;c;d 3.02ms",
|
||||
"a;b;d 4.03ms",
|
||||
"a;c;d 1.96ms",
|
||||
"a;b;d 4.99ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromFirefox recursion 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js",
|
||||
"key": "main (file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js:31)",
|
||||
"line": 31,
|
||||
"name": "main",
|
||||
"selfWeight": 1.1944820000207983,
|
||||
"totalWeight": 11.149112000013702,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js",
|
||||
"key": "alpha (file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js:1)",
|
||||
"line": 1,
|
||||
"name": "alpha",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 9.954629999992903,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js",
|
||||
"key": "beta (file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js:10)",
|
||||
"line": 10,
|
||||
"name": "beta",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 8.962158999987878,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js",
|
||||
"key": "delta (file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js:17)",
|
||||
"line": 17,
|
||||
"name": "delta",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 6.859736999962479,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js",
|
||||
"key": "gamma (file:///Users/jlfwong/code/speedscope/sample/programs/javascript/recursion.js:23)",
|
||||
"line": 23,
|
||||
"name": "gamma",
|
||||
"selfWeight": 9.954629999992903,
|
||||
"totalWeight": 9.954629999992903,
|
||||
},
|
||||
],
|
||||
"name": "recursion.json",
|
||||
"stacks": Array [
|
||||
"main;alpha;beta;alpha;beta;alpha;beta;alpha;delta;gamma 998.89µs",
|
||||
"main 1.19ms",
|
||||
"main;alpha;beta;alpha;delta;gamma 1.83ms",
|
||||
"main;alpha;beta;alpha;beta;alpha;beta;gamma 1.16ms",
|
||||
"main;alpha;beta;alpha;delta;gamma 1.84ms",
|
||||
"main;alpha;beta;alpha;beta;alpha;beta;alpha;gamma 964.81µs",
|
||||
"main;alpha;beta;alpha;beta;alpha;beta;alpha;delta;gamma 1.19ms",
|
||||
"main;alpha;beta;gamma 965.25µs",
|
||||
"main;alpha;delta;gamma 992.47µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromFirefox recursion: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromFirefox recursion: profileGroup.name 1`] = `"recursion.json"`;
|
||||
|
||||
exports[`importFromFirefox: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromFirefox: profileGroup.name 1`] = `"simple-firefox.json"`;
|
||||
+12
-18
@@ -85,6 +85,7 @@ Object {
|
||||
"totalWeight": 74448896,
|
||||
},
|
||||
],
|
||||
"name": "random-allocations-deep-copy.txt",
|
||||
"stacks": Array [
|
||||
"start;main;delta();alpha();leakMemory();malloc;malloc_zone_malloc 73.00 MB",
|
||||
"start;main;delta();beta();leakMemory();malloc;malloc_zone_malloc 72.00 MB",
|
||||
@@ -98,6 +99,10 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy allocations profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy allocations profile: profileGroup.name 1`] = `"random-allocations-deep-copy.txt"`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -282,6 +287,7 @@ Object {
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "simple-time-profile-deep-copy.txt",
|
||||
"stacks": Array [
|
||||
"start;main;delta();alpha();leakMemory();malloc;malloc_zone_malloc;szone_malloc_should_clear;small_malloc_from_free_list 4.00ms",
|
||||
"start;main;delta();alpha();leakMemory();malloc;malloc_zone_malloc;szone_malloc_should_clear;allocate_pages_securely;mach_vm_map;_kernelrpc_mach_vm_map_trap 1.00ms",
|
||||
@@ -326,6 +332,10 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile: profileGroup.name 1`] = `"simple-time-profile-deep-copy.txt"`;
|
||||
|
||||
exports[`importFromInstrumentsTrace Instruments 8.3.3 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -681,6 +691,7 @@ Object {
|
||||
"totalWeight": 1016403,
|
||||
},
|
||||
],
|
||||
"name": "simple-time-profile.trace - thread 4",
|
||||
"stacks": Array [
|
||||
" 730.82ms",
|
||||
"_dyld_start;dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*);dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*);dyld::link(ImageLoader*, bool, bool, ImageLoader::RPathChain const&, unsigned int);ImageLoader::link(ImageLoader::LinkContext const&, bool, bool, bool, ImageLoader::RPathChain const&, char const*);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoader::recursiveBind(ImageLoader::LinkContext const&, bool, bool);ImageLoaderMachOCompressed::doBind(ImageLoader::LinkContext const&, bool);ImageLoaderMachO::setupLazyPointerHandler(ImageLoader::LinkContext const&) 5.06ms",
|
||||
@@ -3855,24 +3866,6 @@ Object {
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 9020084,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "null:dyld::paths_expand_roots(char const**, char const*, char const*)",
|
||||
"line": undefined,
|
||||
"name": "dyld::paths_expand_roots(char const**, char const*, char const*)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "null:strlen",
|
||||
"line": undefined,
|
||||
"name": "strlen",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
@@ -4108,6 +4101,7 @@ Object {
|
||||
"totalWeight": 1012057,
|
||||
},
|
||||
],
|
||||
"name": "simple-time-profile.trace - thread 4",
|
||||
"stacks": Array [
|
||||
" 7.15ms",
|
||||
"_dyld_start;dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*);dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*);dyld::initializeMainExecutable();ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&);ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&);ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&);ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&);ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&);ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&);ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&);0x0000000110c55a79;libSystem_initializer;_libc_initializer;__chk_init;_dyld_register_func_for_add_image;_dyld_func_lookup 9.02ms",
|
||||
File diff suppressed because it is too large
Load Diff
+5
@@ -76,6 +76,7 @@ Object {
|
||||
"totalWeight": 774706,
|
||||
},
|
||||
],
|
||||
"name": "simple-stackprof.json",
|
||||
"stacks": Array [
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 6.11ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d;(garbage collection) 1.02ms",
|
||||
@@ -849,3 +850,7 @@ Object {
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromStackprof: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromStackprof: profileGroup.name 1`] = `"simple-stackprof.json"`;
|
||||
+5
@@ -238,6 +238,7 @@ Object {
|
||||
"totalWeight": 10154,
|
||||
},
|
||||
],
|
||||
"name": "simple.v8log.json",
|
||||
"stacks": Array [
|
||||
"(anonymous);startup;setupGlobalVariables;NativeModule.require;NativeModule.compile;(anonymous);NativeModule.require;NativeModule.compile;(anonymous);(c++) v8::internal::Runtime_CreateArrayLiteral;(c++) v8::internal::JSFunction::EnsureHasInitialMap 29.38ms",
|
||||
"(anonymous);startup;setupGlobalConsole;setupInspectorCommandLineAPI;NativeModule.require;NativeModule.compile;(anonymous);NativeModule.require;NativeModule.compile;(anonymous);(c++) v8::internal::Runtime_StoreIC_Miss;(c++) v8::internal::Map::RawCopy 22.89ms",
|
||||
@@ -258,3 +259,7 @@ Object {
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromV8ProfLog: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromV8ProfLog: profileGroup.name 1`] = `"simple.v8log.json"`;
|
||||
@@ -1,4 +1,4 @@
|
||||
import {checkProfileSnapshot} from '../test-utils'
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromBGFlameGraph', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple.txt')
|
||||
@@ -1,6 +1,6 @@
|
||||
// https://github.com/brendangregg/FlameGraph#2-fold-stacks
|
||||
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../profile'
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../lib/profile'
|
||||
|
||||
interface BGSample {
|
||||
stack: FrameInfo[]
|
||||
@@ -19,12 +19,15 @@ function parseBGFoldedStacks(contents: string): BGSample[] {
|
||||
return samples
|
||||
}
|
||||
|
||||
export function importFromBGFlameGraph(contents: string): Profile {
|
||||
export function importFromBGFlameGraph(contents: string): Profile | null {
|
||||
const parsed = parseBGFoldedStacks(contents)
|
||||
const duration = parsed.reduce((prev: number, cur: BGSample) => prev + cur.duration, 0)
|
||||
const profile = new StackListProfileBuilder(duration)
|
||||
if (parsed.length === 0) {
|
||||
return null
|
||||
}
|
||||
for (let sample of parsed) {
|
||||
profile.appendSample(sample.stack, sample.duration)
|
||||
profile.appendSampleWithWeight(sample.stack, sample.duration)
|
||||
}
|
||||
return profile.build()
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import {checkProfileSnapshot} from '../test-utils'
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromChromeCPUProfile', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/65/simple.cpuprofile')
|
||||
@@ -1,6 +1,6 @@
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder} from '../profile'
|
||||
import {getOrInsert, lastOf} from '../utils'
|
||||
import {TimeFormatter} from '../value-formatters'
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder} from '../lib/profile'
|
||||
import {getOrInsert, lastOf} from '../lib/utils'
|
||||
import {TimeFormatter} from '../lib/value-formatters'
|
||||
|
||||
interface TimelineEvent {
|
||||
pid: number
|
||||
@@ -0,0 +1,9 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromFirefox', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Firefox/59/simple-firefox.json')
|
||||
})
|
||||
|
||||
test('importFromFirefox recursion', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Firefox/61/recursion.json')
|
||||
})
|
||||
@@ -1,6 +1,6 @@
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder} from '../profile'
|
||||
import {getOrInsert, lastOf} from '../utils'
|
||||
import {TimeFormatter} from '../value-formatters'
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder} from '../lib/profile'
|
||||
import {getOrInsert} from '../lib/utils'
|
||||
import {TimeFormatter} from '../lib/value-formatters'
|
||||
|
||||
interface Allocations {
|
||||
frames: any[]
|
||||
@@ -158,7 +158,7 @@ export function importFromFirefox(firefoxProfile: FirefoxProfile): Profile {
|
||||
? cpuProfile.threads[0]
|
||||
: cpuProfile.threads.filter(t => t.name === 'GeckoMain')[0]
|
||||
|
||||
const frameIdToFrameInfo = new Map<number, FrameInfo>()
|
||||
const frameKeyToFrameInfo = new Map<string, FrameInfo>()
|
||||
|
||||
function extractStack(sample: Sample): FrameInfo[] {
|
||||
let stackFrameId: number | null = sample[0]
|
||||
@@ -185,7 +185,7 @@ export function importFromFirefox(firefoxProfile: FirefoxProfile): Profile {
|
||||
return null
|
||||
}
|
||||
|
||||
return getOrInsert(frameIdToFrameInfo, f, () => ({
|
||||
return getOrInsert(frameKeyToFrameInfo, location, () => ({
|
||||
key: location,
|
||||
name: match[1]!,
|
||||
file: match[2]!,
|
||||
@@ -203,27 +203,22 @@ export function importFromFirefox(firefoxProfile: FirefoxProfile): Profile {
|
||||
const value = sample[1]
|
||||
|
||||
// Find lowest common ancestor of the current stack and the previous one
|
||||
let lca: FrameInfo | null = null
|
||||
let lcaIndex = -1
|
||||
|
||||
// This is O(n^2), but n should be relatively small here (stack height),
|
||||
// so hopefully this isn't much of a problem
|
||||
for (let i = stack.length - 1; i >= 0 && prevStack.indexOf(stack[i]) === -1; i--) {}
|
||||
for (let i = 0; i < Math.min(stack.length, prevStack.length); i++) {
|
||||
if (prevStack[i] !== stack[i]) {
|
||||
break
|
||||
}
|
||||
lcaIndex = i
|
||||
}
|
||||
|
||||
// Close frames that are no longer open
|
||||
while (prevStack.length > 0 && lastOf(prevStack) != lca) {
|
||||
const closingFrame = prevStack.pop()!
|
||||
profile.leaveFrame(closingFrame, value)
|
||||
for (let i = prevStack.length - 1; i > lcaIndex; i--) {
|
||||
profile.leaveFrame(prevStack[i], value)
|
||||
}
|
||||
|
||||
// Open frames that are now becoming open
|
||||
const toOpen: FrameInfo[] = []
|
||||
for (let i = stack.length - 1; i >= 0 && stack[i] != lca; i--) {
|
||||
toOpen.push(stack[i])
|
||||
}
|
||||
toOpen.reverse()
|
||||
|
||||
for (let frame of toOpen) {
|
||||
profile.enterFrame(frame, value)
|
||||
for (let i = lcaIndex + 1; i < stack.length; i++) {
|
||||
profile.enterFrame(stack[i], value)
|
||||
}
|
||||
|
||||
prevStack = stack
|
||||
@@ -0,0 +1,8 @@
|
||||
import {importProfileGroup} from '.'
|
||||
|
||||
test('importProfileGroup', async () => {
|
||||
// Importing garbage should return null
|
||||
expect(await importProfileGroup('unknown', '')).toBe(null)
|
||||
expect(await importProfileGroup('unknown', 'Hello world')).toBe(null)
|
||||
expect(await importProfileGroup('unknown', 'Hello\n\nWorld')).toBe(null)
|
||||
})
|
||||
@@ -1,4 +1,4 @@
|
||||
import {Profile} from '../profile'
|
||||
import {Profile, ProfileGroup} from '../lib/profile'
|
||||
import {FileSystemDirectoryEntry} from './file-system-entry'
|
||||
|
||||
import {importFromChromeCPUProfile, importFromChromeTimeline} from './chrome'
|
||||
@@ -6,49 +6,63 @@ import {importFromStackprof} from './stackprof'
|
||||
import {importFromInstrumentsDeepCopy, importFromInstrumentsTrace} from './instruments'
|
||||
import {importFromBGFlameGraph} from './bg-flamegraph'
|
||||
import {importFromFirefox} from './firefox'
|
||||
import {importSpeedscopeProfiles} from '../file-format'
|
||||
import {FileFormat} from '../file-format-spec'
|
||||
import {importSpeedscopeProfiles} from '../lib/file-format'
|
||||
import {importFromV8ProfLog} from './v8proflog'
|
||||
import {importFromLinuxPerf} from './linux-tools-perf'
|
||||
|
||||
export async function importProfile(fileName: string, contents: string): Promise<Profile | null> {
|
||||
const profile = await _importProfile(fileName, contents)
|
||||
if (profile && !profile.getName()) {
|
||||
profile.setName(fileName)
|
||||
export async function importProfileGroup(
|
||||
fileName: string,
|
||||
contents: string,
|
||||
): Promise<ProfileGroup | null> {
|
||||
const profileGroup = await _importProfileGroup(fileName, contents)
|
||||
if (profileGroup) {
|
||||
if (!profileGroup.name) {
|
||||
profileGroup.name = fileName
|
||||
}
|
||||
for (let profile of profileGroup.profiles) {
|
||||
if (profile && !profile.getName()) {
|
||||
profile.setName(fileName)
|
||||
}
|
||||
}
|
||||
return profileGroup
|
||||
}
|
||||
return profile
|
||||
return null
|
||||
}
|
||||
|
||||
function importSingleSpeedscopeProfile(serialized: FileFormat.File) {
|
||||
const profiles = importSpeedscopeProfiles(serialized)
|
||||
if (profiles.length === 0) {
|
||||
throw new Error('Failed to extract any profiles from the imported speedscope profile')
|
||||
}
|
||||
return profiles[0]
|
||||
function toGroup(profile: Profile | null): ProfileGroup | null {
|
||||
if (!profile) return null
|
||||
return {name: profile.getName(), indexToView: 0, profiles: [profile]}
|
||||
}
|
||||
|
||||
async function _importProfile(fileName: string, contents: string): Promise<Profile | null> {
|
||||
async function _importProfileGroup(
|
||||
fileName: string,
|
||||
contents: string,
|
||||
): Promise<ProfileGroup | null> {
|
||||
// First pass: Check known file format names to infer the file type
|
||||
if (fileName.endsWith('.speedscope.json')) {
|
||||
console.log('Importing as speedscope json file')
|
||||
return importSingleSpeedscopeProfile(JSON.parse(contents))
|
||||
return importSpeedscopeProfiles(JSON.parse(contents))
|
||||
} else if (fileName.endsWith('.cpuprofile')) {
|
||||
console.log('Importing as Chrome CPU Profile')
|
||||
return importFromChromeCPUProfile(JSON.parse(contents))
|
||||
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 importFromChromeTimeline(JSON.parse(contents))
|
||||
return toGroup(importFromChromeTimeline(JSON.parse(contents)))
|
||||
} else if (fileName.endsWith('.stackprof.json')) {
|
||||
console.log('Importing as stackprof profile')
|
||||
return importFromStackprof(JSON.parse(contents))
|
||||
return toGroup(importFromStackprof(JSON.parse(contents)))
|
||||
} else if (fileName.endsWith('.instruments.txt')) {
|
||||
console.log('Importing as Instruments.app deep copy')
|
||||
return importFromInstrumentsDeepCopy(contents)
|
||||
return toGroup(importFromInstrumentsDeepCopy(contents))
|
||||
} else if (fileName.endsWith('.linux-perf.txt')) {
|
||||
console.log('Importing as output of linux perf script')
|
||||
return importFromLinuxPerf(contents)
|
||||
} else if (fileName.endsWith('.collapsedstack.txt')) {
|
||||
console.log('Importing as collapsed stack format')
|
||||
return importFromBGFlameGraph(contents)
|
||||
return toGroup(importFromBGFlameGraph(contents))
|
||||
} else if (fileName.endsWith('.v8log.json')) {
|
||||
console.log('Importing as --prof-process v8 log')
|
||||
return importFromV8ProfLog(JSON.parse(contents))
|
||||
return toGroup(importFromV8ProfLog(JSON.parse(contents)))
|
||||
}
|
||||
|
||||
// Second pass: Try to guess what file format it is based on structure
|
||||
@@ -59,22 +73,22 @@ async function _importProfile(fileName: string, contents: string): Promise<Profi
|
||||
if (parsed) {
|
||||
if (parsed['$schema'] === 'https://www.speedscope.app/file-format-schema.json') {
|
||||
console.log('Importing as speedscope json file')
|
||||
return importSingleSpeedscopeProfile(parsed)
|
||||
return importSpeedscopeProfiles(JSON.parse(contents))
|
||||
} else if (parsed['systemHost'] && parsed['systemHost']['name'] == 'Firefox') {
|
||||
console.log('Importing as Firefox profile')
|
||||
return importFromFirefox(parsed)
|
||||
return toGroup(importFromFirefox(parsed))
|
||||
} else if (Array.isArray(parsed) && parsed[parsed.length - 1].name === 'CpuProfile') {
|
||||
console.log('Importing as Chrome CPU Profile')
|
||||
return importFromChromeTimeline(parsed)
|
||||
return toGroup(importFromChromeTimeline(parsed))
|
||||
} else if ('nodes' in parsed && 'samples' in parsed && 'timeDeltas' in parsed) {
|
||||
console.log('Importing as Chrome Timeline')
|
||||
return importFromChromeCPUProfile(parsed)
|
||||
return toGroup(importFromChromeCPUProfile(parsed))
|
||||
} else if ('mode' in parsed && 'frames' in parsed) {
|
||||
console.log('Importing as stackprof profile')
|
||||
return importFromStackprof(parsed)
|
||||
return toGroup(importFromStackprof(parsed))
|
||||
} else if ('code' in parsed && 'functions' in parsed && 'ticks' in parsed) {
|
||||
console.log('Importing as --prof-process v8 log')
|
||||
return importFromV8ProfLog(parsed)
|
||||
return toGroup(importFromV8ProfLog(parsed))
|
||||
}
|
||||
} else {
|
||||
// Format is not JSON
|
||||
@@ -83,7 +97,7 @@ async function _importProfile(fileName: string, contents: string): Promise<Profi
|
||||
// a deep copy from OS X Instruments.app
|
||||
if (/^[\w \t\(\)]*\tSymbol Name/.exec(contents)) {
|
||||
console.log('Importing as Instruments.app deep copy')
|
||||
return importFromInstrumentsDeepCopy(contents)
|
||||
return toGroup(importFromInstrumentsDeepCopy(contents))
|
||||
}
|
||||
|
||||
// If every line ends with a space followed by a number, it's probably
|
||||
@@ -91,7 +105,13 @@ async function _importProfile(fileName: string, contents: string): Promise<Profi
|
||||
const lineCount = contents.split(/\n/).length
|
||||
if (lineCount >= 1 && lineCount === contents.split(/ \d+\n/).length) {
|
||||
console.log('Importing as collapsed stack format')
|
||||
return importFromBGFlameGraph(contents)
|
||||
return toGroup(importFromBGFlameGraph(contents))
|
||||
}
|
||||
|
||||
const fromLinuxPerf = importFromLinuxPerf(contents)
|
||||
if (fromLinuxPerf) {
|
||||
console.log('Importing from linux perf script output')
|
||||
return fromLinuxPerf
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
import {dumpProfile, checkProfileSnapshot} from '../test-utils'
|
||||
import {dumpProfile, checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
import * as JSZip from 'jszip'
|
||||
import {FileSystemEntry} from './file-system-entry'
|
||||
@@ -87,7 +87,8 @@ describe('importFromInstrumentsTrace', () => {
|
||||
})
|
||||
})
|
||||
const root = new ZipBackedFileSystemEntry(zip, 'simple-time-profile.trace')
|
||||
const profile = await importFromFileSystemDirectoryEntry(root)
|
||||
const profileGroup = await importFromFileSystemDirectoryEntry(root)
|
||||
const profile = profileGroup.profiles[profileGroup.indexToView]
|
||||
expect(dumpProfile(profile)).toMatchSnapshot()
|
||||
}
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
// This file contains methods to import data from OS X Instruments.app
|
||||
// https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html
|
||||
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder, StackListProfileBuilder} from '../profile'
|
||||
import {sortBy, getOrThrow, getOrInsert, lastOf, getOrElse, zeroPad} from '../utils'
|
||||
import {
|
||||
Profile,
|
||||
FrameInfo,
|
||||
CallTreeProfileBuilder,
|
||||
StackListProfileBuilder,
|
||||
ProfileGroup,
|
||||
} from '../lib/profile'
|
||||
import {sortBy, getOrThrow, getOrInsert, lastOf, getOrElse, zeroPad} from '../lib/utils'
|
||||
import * as pako from 'pako'
|
||||
import {ByteFormatter, TimeFormatter} from '../value-formatters'
|
||||
import {ByteFormatter, TimeFormatter} from '../lib/value-formatters'
|
||||
import {FileSystemDirectoryEntry, FileSystemEntry, FileSystemFileEntry} from './file-system-entry'
|
||||
|
||||
function parseTSV<T>(contents: string): T[] {
|
||||
@@ -184,6 +190,9 @@ class MaybeCompressedFileReader {
|
||||
this.fileData = new Promise(resolve => {
|
||||
const reader = new FileReader()
|
||||
reader.addEventListener('loadend', () => {
|
||||
if (!(reader.result instanceof ArrayBuffer)) {
|
||||
throw new Error('Expected reader.result to be an instance of ArrayBuffer')
|
||||
}
|
||||
resolve(reader.result)
|
||||
})
|
||||
reader.readAsArrayBuffer(file)
|
||||
@@ -379,92 +388,126 @@ interface SymbolInfo {
|
||||
addressToLine: Map<number, number>
|
||||
}
|
||||
|
||||
interface FormTemplateData {
|
||||
selectedRun: number
|
||||
instrument: string
|
||||
version: number
|
||||
interface FormTemplateRunData {
|
||||
number: number
|
||||
addressToFrameMap: Map<number, FrameInfo>
|
||||
}
|
||||
|
||||
interface FormTemplateData {
|
||||
version: number
|
||||
selectedRunNumber: number
|
||||
instrument: string
|
||||
runs: FormTemplateRunData[]
|
||||
}
|
||||
|
||||
async function readFormTemplate(tree: TraceDirectoryTree): Promise<FormTemplateData> {
|
||||
const formTemplate = getOrThrow(tree.files, 'form.template')
|
||||
const archive = readInstrumentsKeyedArchive(await readAsArrayBuffer(formTemplate))
|
||||
|
||||
const version = archive['com.apple.xray.owner.template.version']
|
||||
const selectedRun = archive['com.apple.xray.owner.template'].get('_selectedRunNumber')
|
||||
const selectedRunNumber = archive['com.apple.xray.owner.template'].get('_selectedRunNumber')
|
||||
let instrument = archive['$1']
|
||||
if ('stubInfoByUUID' in archive) {
|
||||
instrument = Array.from(archive['stubInfoByUUID'].keys())[0]
|
||||
}
|
||||
let allRunData = archive['com.apple.xray.run.data']
|
||||
const runData = getOrThrow<number, Map<any, any>>(
|
||||
allRunData.runData,
|
||||
allRunData.runNumbers.pop()!,
|
||||
)
|
||||
const allRunData = archive['com.apple.xray.run.data']
|
||||
|
||||
const symbolsByPid = getOrThrow<string, Map<number, {symbols: SymbolInfo[]}>>(
|
||||
runData,
|
||||
'symbolsByPid',
|
||||
)
|
||||
const runs: FormTemplateRunData[] = []
|
||||
for (let runNumber of allRunData.runNumbers) {
|
||||
const runData = getOrThrow<number, Map<any, any>>(allRunData.runData, runNumber)
|
||||
|
||||
const addressToFrameMap = new Map<number, FrameInfo>()
|
||||
const symbolsByPid = getOrThrow<string, Map<number, {symbols: SymbolInfo[]}>>(
|
||||
runData,
|
||||
'symbolsByPid',
|
||||
)
|
||||
|
||||
// TODO(jlfwong): Deal with profiles with conflicts addresses?
|
||||
for (let [_pid, symbols] of symbolsByPid.entries()) {
|
||||
for (let symbol of symbols.symbols) {
|
||||
if (!symbol) continue
|
||||
const {sourcePath, symbolName, addressToLine} = symbol
|
||||
for (let [address, _line] of addressToLine) {
|
||||
getOrInsert(addressToFrameMap, address, () => {
|
||||
const name = symbolName || `0x${zeroPad(address.toString(16), 16)}`
|
||||
const frame: FrameInfo = {
|
||||
key: `${sourcePath}:${name}`,
|
||||
name: name,
|
||||
}
|
||||
if (sourcePath) {
|
||||
frame.file = sourcePath
|
||||
}
|
||||
return frame
|
||||
})
|
||||
const addressToFrameMap = new Map<number, FrameInfo>()
|
||||
|
||||
// TODO(jlfwong): Deal with profiles with conflicting addresses?
|
||||
for (let symbols of symbolsByPid.values()) {
|
||||
for (let symbol of symbols.symbols) {
|
||||
if (!symbol) continue
|
||||
const {sourcePath, symbolName, addressToLine} = symbol
|
||||
for (let address of addressToLine.keys()) {
|
||||
getOrInsert(addressToFrameMap, address, () => {
|
||||
const name = symbolName || `0x${zeroPad(address.toString(16), 16)}`
|
||||
const frame: FrameInfo = {
|
||||
key: `${sourcePath}:${name}`,
|
||||
name: name,
|
||||
}
|
||||
if (sourcePath) {
|
||||
frame.file = sourcePath
|
||||
}
|
||||
return frame
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
runs.push({
|
||||
number: runNumber,
|
||||
addressToFrameMap,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
version,
|
||||
instrument,
|
||||
selectedRun,
|
||||
addressToFrameMap,
|
||||
selectedRunNumber,
|
||||
runs,
|
||||
}
|
||||
}
|
||||
|
||||
// Import from a .trace file saved from Mac Instruments.app
|
||||
export async function importFromInstrumentsTrace(
|
||||
entry: FileSystemDirectoryEntry,
|
||||
): Promise<Profile> {
|
||||
): Promise<ProfileGroup> {
|
||||
const tree = await extractDirectoryTree(entry)
|
||||
|
||||
const {version, selectedRun, instrument, addressToFrameMap} = await readFormTemplate(tree)
|
||||
const {version, runs, instrument, selectedRunNumber} = await readFormTemplate(tree)
|
||||
if (instrument !== 'com.apple.xray.instrument-type.coresampler2') {
|
||||
throw new Error(
|
||||
`The only supported instrument from .trace import is "com.apple.xray.instrument-type.coresampler2". Got ${instrument}`,
|
||||
)
|
||||
}
|
||||
console.log('version: ', version)
|
||||
console.log(`Importing time profile from run ${selectedRun}`)
|
||||
console.log(`Importing time profile`)
|
||||
|
||||
const core = getCoreDirForRun(tree, selectedRun)
|
||||
const profiles: Profile[] = []
|
||||
let indexToView = 0
|
||||
|
||||
for (let run of runs) {
|
||||
const {addressToFrameMap, number} = run
|
||||
const group = await importRunFromInstrumentsTrace({
|
||||
fileName: entry.name,
|
||||
tree,
|
||||
addressToFrameMap,
|
||||
runNumber: number,
|
||||
})
|
||||
|
||||
if (run.number === selectedRunNumber) {
|
||||
indexToView = profiles.length + group.indexToView
|
||||
}
|
||||
|
||||
profiles.push(...group.profiles)
|
||||
}
|
||||
|
||||
return {name: entry.name, indexToView, profiles}
|
||||
}
|
||||
|
||||
export async function importRunFromInstrumentsTrace(args: {
|
||||
fileName: string
|
||||
tree: TraceDirectoryTree
|
||||
addressToFrameMap: Map<number, FrameInfo>
|
||||
runNumber: number
|
||||
}): Promise<ProfileGroup> {
|
||||
const {fileName, tree, addressToFrameMap, runNumber} = args
|
||||
const core = getCoreDirForRun(tree, runNumber)
|
||||
let samples = await getRawSampleList(core)
|
||||
const arrays = await getIntegerArrays(samples, core)
|
||||
const backtraceIDtoStack = new Map<number, FrameInfo[]>()
|
||||
|
||||
const profile = new StackListProfileBuilder(lastOf(samples)!.timestamp)
|
||||
profile.setName(entry.name)
|
||||
|
||||
// For now, we can only display the flamechart for a single thread of execution,
|
||||
// So let's choose whichever thread had the most sample hits.
|
||||
//
|
||||
// TODO(jlfwong): Support displaying flamecharts for multiple threads.
|
||||
// We'll try to guess which thread is the main thread by assuming
|
||||
// it's the one with the most samples.
|
||||
const sampleCountByThreadID = new Map<number, number>()
|
||||
for (let sample of samples) {
|
||||
sampleCountByThreadID.set(
|
||||
@@ -473,9 +516,38 @@ export async function importFromInstrumentsTrace(
|
||||
)
|
||||
}
|
||||
const counts = Array.from(sampleCountByThreadID.entries())
|
||||
sortBy(counts, c => c[1])
|
||||
const mainThreadID = lastOf(counts)![0]
|
||||
samples = samples.filter(s => s.threadID === mainThreadID)
|
||||
sortBy(counts, c => -c[1])
|
||||
const threadIDs = counts.map(c => c[0])
|
||||
|
||||
return {
|
||||
name: fileName,
|
||||
indexToView: 0,
|
||||
profiles: threadIDs.map(threadID =>
|
||||
importThreadFromInstrumentsTrace({
|
||||
threadID,
|
||||
fileName,
|
||||
arrays,
|
||||
addressToFrameMap,
|
||||
samples,
|
||||
}),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
export function importThreadFromInstrumentsTrace(args: {
|
||||
fileName: string
|
||||
addressToFrameMap: Map<number, FrameInfo>
|
||||
threadID: number
|
||||
arrays: number[][]
|
||||
samples: Sample[]
|
||||
}): Profile {
|
||||
let {fileName, addressToFrameMap, arrays, threadID, samples} = args
|
||||
|
||||
const backtraceIDtoStack = new Map<number, FrameInfo[]>()
|
||||
samples = samples.filter(s => s.threadID === threadID)
|
||||
|
||||
const profile = new StackListProfileBuilder(lastOf(samples)!.timestamp)
|
||||
profile.setName(`${fileName} - thread ${threadID}`)
|
||||
|
||||
function appendRecursive(k: number, stack: FrameInfo[]) {
|
||||
const frame = addressToFrameMap.get(k)
|
||||
@@ -507,7 +579,7 @@ export async function importFromInstrumentsTrace(
|
||||
if (lastTimestamp === null) {
|
||||
// The first sample is sometimes fairly late in the profile for some reason.
|
||||
// We'll just say nothing was known to be on the stack in that time.
|
||||
profile.appendSample([], sample.timestamp)
|
||||
profile.appendSampleWithWeight([], sample.timestamp)
|
||||
lastTimestamp = sample.timestamp
|
||||
}
|
||||
|
||||
@@ -515,7 +587,7 @@ export async function importFromInstrumentsTrace(
|
||||
throw new Error('Timestamps out of order!')
|
||||
}
|
||||
|
||||
profile.appendSample(stackForSample, sample.timestamp - lastTimestamp)
|
||||
profile.appendSampleWithWeight(stackForSample, sample.timestamp - lastTimestamp)
|
||||
lastTimestamp = sample.timestamp
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
describe('importFromLinuxPerf', async () => {
|
||||
test('simple.linux-perf.txt', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/linux-perf/simple.linux-perf.txt')
|
||||
})
|
||||
test('one-sample.linux-perf.txt', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/linux-perf/one-sample.linux-perf.txt')
|
||||
})
|
||||
test('forks.linux-perf.txt', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/linux-perf/forks.linux-perf.txt')
|
||||
})
|
||||
test('simple-with-header.linux-perf.txt', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/linux-perf/simple-with-header.linux-perf.txt')
|
||||
})
|
||||
test('simple-with-pids.linux-perf.txt', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/linux-perf/simple-with-pid.linux-perf.txt')
|
||||
})
|
||||
test('system-wide.linux-perf.txt', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/linux-perf/system-wide.linux-perf.txt')
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,130 @@
|
||||
import {StackListProfileBuilder, ProfileGroup} from '../lib/profile'
|
||||
import {itMap, getOrInsert} from '../lib/utils'
|
||||
import {TimeFormatter} from '../lib/value-formatters'
|
||||
|
||||
// This imports the output of the "perf script" command on linux.
|
||||
//
|
||||
// Reference: https://github.com/torvalds/linux/blob/0fbc4aea/tools/perf/builtin-script.c#L1622
|
||||
// Reference: https://github.com/brendangregg/FlameGraph/blob/18c3dea/stackcollapse-perf.pl#L163
|
||||
|
||||
interface PerfStackFrame {
|
||||
address: string
|
||||
symbolName: string
|
||||
file: string
|
||||
}
|
||||
|
||||
interface PerfEvent {
|
||||
command: string | null
|
||||
processID: number | null
|
||||
threadID: number | null
|
||||
time: number | null
|
||||
eventType: string
|
||||
stack: PerfStackFrame[]
|
||||
}
|
||||
|
||||
function parseEvent(rawEvent: string): PerfEvent | null {
|
||||
const lines = rawEvent.split('\n').filter(l => !/^\s*#/.exec(l))
|
||||
|
||||
const event: PerfEvent = {
|
||||
command: null,
|
||||
processID: null,
|
||||
threadID: null,
|
||||
time: null,
|
||||
eventType: '',
|
||||
stack: [],
|
||||
}
|
||||
|
||||
const firstLine = lines.shift()
|
||||
if (!firstLine) return null
|
||||
|
||||
// Note: command name may contain spaces, e.g.
|
||||
//
|
||||
// V8 WorkerThread 25607 4794564.109216: cycles:
|
||||
const eventStartMatch = /^(\S.+?)\s+(\d+)(?:\/?(\d+))?\s+/.exec(firstLine)
|
||||
if (!eventStartMatch) return null
|
||||
|
||||
event.command = eventStartMatch[1]
|
||||
|
||||
// default "perf script" output has TID but not PID
|
||||
if (eventStartMatch[3]) {
|
||||
event.processID = parseInt(eventStartMatch[2], 10)
|
||||
event.threadID = parseInt(eventStartMatch[3], 10)
|
||||
} else {
|
||||
event.threadID = parseInt(eventStartMatch[2], 10)
|
||||
}
|
||||
|
||||
const timeMatch = /\s+(\d+\.\d+):\s+/.exec(firstLine)
|
||||
if (timeMatch) {
|
||||
event.time = parseFloat(timeMatch[1])
|
||||
}
|
||||
|
||||
const evName = /(\S+):\s*$/.exec(firstLine)
|
||||
if (evName) {
|
||||
event.eventType = evName[1]
|
||||
}
|
||||
|
||||
for (let line of lines) {
|
||||
const lineMatch = /^\s*(\w+)\s*(.+) \((\S*)\)/.exec(line)
|
||||
if (!lineMatch) continue
|
||||
let [, address, symbolName, file] = lineMatch
|
||||
|
||||
// Linux 4.8 included symbol offsets in perf script output by default, eg:
|
||||
// 7fffb84c9afc cpu_startup_entry+0x800047c022ec ([kernel.kallsyms])
|
||||
// strip these off:
|
||||
symbolName = symbolName.replace(/\+0x[\da-f]+$/, '')
|
||||
|
||||
event.stack.push({address: `0x${address}`, symbolName, file})
|
||||
}
|
||||
event.stack.reverse()
|
||||
|
||||
return event
|
||||
}
|
||||
|
||||
export function importFromLinuxPerf(contents: string): ProfileGroup | null {
|
||||
const profiles = new Map<string, StackListProfileBuilder>()
|
||||
|
||||
let eventType: string | null = null
|
||||
const events = contents.split('\n\n').map(parseEvent)
|
||||
|
||||
for (let event of events) {
|
||||
if (event == null) continue
|
||||
if (eventType != null && eventType != event.eventType) continue
|
||||
if (event.time == null) continue
|
||||
eventType = event.eventType
|
||||
|
||||
let profileNameParts = []
|
||||
if (event.command) profileNameParts.push(event.command)
|
||||
if (event.processID) profileNameParts.push(`pid: ${event.processID}`)
|
||||
if (event.threadID) profileNameParts.push(`tid: ${event.threadID}`)
|
||||
const profileName = profileNameParts.join(' ')
|
||||
const builderState = getOrInsert(profiles, profileName, () => {
|
||||
const builder = new StackListProfileBuilder()
|
||||
builder.setName(profileName)
|
||||
builder.setValueFormatter(new TimeFormatter('seconds'))
|
||||
return builder
|
||||
})
|
||||
|
||||
const builder = builderState
|
||||
|
||||
builder.appendSampleWithTimestamp(
|
||||
event.stack.map(({symbolName, file}) => {
|
||||
return {
|
||||
key: `${symbolName} (${file})`,
|
||||
name: symbolName === '[unknown]' ? `??? (${file})` : symbolName,
|
||||
file: file,
|
||||
}
|
||||
}),
|
||||
event.time!,
|
||||
)
|
||||
}
|
||||
|
||||
if (profiles.size === 0) {
|
||||
return null
|
||||
}
|
||||
|
||||
return {
|
||||
name: profiles.size === 1 ? Array.from(profiles.keys())[0] : '',
|
||||
indexToView: 0,
|
||||
profiles: Array.from(itMap(profiles.values(), builder => builder.build())),
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import {checkProfileSnapshot} from '../test-utils'
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromStackprof', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackprof/simple-stackprof.json')
|
||||
@@ -1,7 +1,7 @@
|
||||
// https://github.com/tmm1/stackprof
|
||||
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../profile'
|
||||
import {TimeFormatter} from '../value-formatters'
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../lib/profile'
|
||||
import {TimeFormatter} from '../lib/value-formatters'
|
||||
|
||||
interface StackprofFrame {
|
||||
name: string
|
||||
@@ -45,7 +45,7 @@ export function importFromStackprof(stackprofProfile: StackprofProfile): Profile
|
||||
sampleDuration += raw_timestamp_deltas[sampleIndex++]
|
||||
}
|
||||
|
||||
profile.appendSample(stack, sampleDuration)
|
||||
profile.appendSampleWithWeight(stack, sampleDuration)
|
||||
prevStack = stack
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import {checkProfileSnapshot} from '../test-utils'
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromV8ProfLog', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/node/8.5.0/simple.v8log.json')
|
||||
@@ -1,6 +1,6 @@
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../profile'
|
||||
import {getOrInsert, sortBy} from '../utils'
|
||||
import {TimeFormatter} from '../value-formatters'
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../lib/profile'
|
||||
import {getOrInsert, sortBy} from '../lib/utils'
|
||||
import {TimeFormatter} from '../lib/value-formatters'
|
||||
|
||||
// This imports profiles generated by a combination of the following commands:
|
||||
//
|
||||
@@ -173,7 +173,7 @@ export function importFromV8ProfLog(v8log: V8LogProfile): Profile {
|
||||
}
|
||||
stack.push(getFrameInfo(id))
|
||||
}
|
||||
profile.appendSample(stack, tick.tm - lastTm)
|
||||
profile.appendSampleWithWeight(stack, tick.tm - lastTm)
|
||||
lastTm = tick.tm
|
||||
}
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.0.1 evented profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 0,
|
||||
"line": undefined,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "b",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "c",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "d",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "simple.txt",
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
"a;b;c 3",
|
||||
"a;b 5",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.0.1 evented profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.0.1 evented profile: profileGroup.name 1`] = `"simple.txt"`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.1.2 sampled profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 0,
|
||||
"line": undefined,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "b",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "c",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "d",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "simple.speedscope.json",
|
||||
"stacks": Array [
|
||||
"a;b;c 2.00s",
|
||||
"a;b;d 4.00s",
|
||||
"a;b;c 3.00s",
|
||||
"a;b 5.00s",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.1.2 sampled profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.1.2 sampled profile: profileGroup.name 1`] = `"simple.speedscope.json"`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.6.0 multiple profiles 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 0,
|
||||
"line": undefined,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "b",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "c",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "d",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "one",
|
||||
"stacks": Array [
|
||||
"a;b;c 2.00s",
|
||||
"a;b;d 4.00s",
|
||||
"a;b;c 3.00s",
|
||||
"a;b 5.00s",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.6.0 multiple profiles 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 0,
|
||||
"line": undefined,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "b",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "c",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "d",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "two",
|
||||
"stacks": Array [
|
||||
"a;b;c 2.00s",
|
||||
"a;b;d 4.00s",
|
||||
"a;b;c 3.00s",
|
||||
"a;b 5.00s",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.6.0 multiple profiles: indexToView 1`] = `1`;
|
||||
|
||||
exports[`importSpeedscopeProfiles 0.6.0 multiple profiles: profileGroup.name 1`] = `"Two Samples"`;
|
||||
@@ -0,0 +1,47 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`CallTreeProfileBuilder separates non-contiguous: append order 1`] = `
|
||||
"((speedscope root):0:5
|
||||
(a:1:5
|
||||
(b:1:2
|
||||
(c:1:1)
|
||||
)
|
||||
(b:1:2
|
||||
(c:1:1)
|
||||
)
|
||||
)
|
||||
)"
|
||||
`;
|
||||
|
||||
exports[`CallTreeProfileBuilder separates non-contiguous: grouped 1`] = `
|
||||
"((speedscope root):0:5
|
||||
(a:1:5
|
||||
(b:2:4
|
||||
(c:2:2)
|
||||
)
|
||||
)
|
||||
)"
|
||||
`;
|
||||
|
||||
exports[`StackListProfileBuilder separates non-contiguous: append order 1`] = `
|
||||
"((speedscope root):4:0
|
||||
(a:1:5
|
||||
(b:1:2
|
||||
(c:1:1)
|
||||
)
|
||||
(b:1:2
|
||||
(c:1:1)
|
||||
)
|
||||
)
|
||||
)"
|
||||
`;
|
||||
|
||||
exports[`StackListProfileBuilder separates non-contiguous: grouped 1`] = `
|
||||
"((speedscope root):4:0
|
||||
(a:1:5
|
||||
(b:2:4
|
||||
(c:2:2)
|
||||
)
|
||||
)
|
||||
)"
|
||||
`;
|
||||
@@ -0,0 +1,29 @@
|
||||
import {Color} from './color'
|
||||
|
||||
describe('Color', () => {
|
||||
test('fromLumaChromaHue', () => {
|
||||
expect(Color.fromLumaChromaHue(0, 0, 0).toCSS()).toEqual('rgba(0, 0, 0, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(1, 0, 0).toCSS()).toEqual('rgba(255, 255, 255, 1.00)')
|
||||
|
||||
expect(Color.fromLumaChromaHue(0.5, 0, 30).toCSS()).toEqual('rgba(128, 128, 128, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(0.5, 0, 60).toCSS()).toEqual('rgba(128, 128, 128, 1.00)')
|
||||
|
||||
expect(Color.fromLumaChromaHue(0.5, 0.5, 0).toCSS()).toEqual('rgba(217, 89, 89, 1.00)')
|
||||
|
||||
expect(Color.fromLumaChromaHue(0.5, 1.0, 0).toCSS()).toEqual('rgba(255, 51, 51, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(0.5, 1.0, 60).toCSS()).toEqual('rgba(156, 156, 0, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(0.5, 1.0, 120).toCSS()).toEqual('rgba(0, 232, 0, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(0.5, 1.0, 180).toCSS()).toEqual('rgba(0, 204, 204, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(0.5, 1.0, 240).toCSS()).toEqual('rgba(99, 99, 255, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(0.5, 1.0, 300).toCSS()).toEqual('rgba(255, 23, 255, 1.00)')
|
||||
expect(Color.fromLumaChromaHue(0.5, 1.0, 360).toCSS()).toEqual('rgba(255, 51, 51, 1.00)')
|
||||
})
|
||||
|
||||
test('toCSS', () => {
|
||||
expect(new Color().toCSS()).toEqual('rgba(0, 0, 0, 1.00)')
|
||||
expect(new Color(1, 0, 0, 1).toCSS()).toEqual('rgba(255, 0, 0, 1.00)')
|
||||
expect(new Color(0, 1, 0, 1).toCSS()).toEqual('rgba(0, 255, 0, 1.00)')
|
||||
expect(new Color(0, 0, 1, 1).toCSS()).toEqual('rgba(0, 0, 255, 1.00)')
|
||||
expect(new Color(0, 0, 1, 0.599).toCSS()).toEqual('rgba(0, 0, 255, 0.60)')
|
||||
})
|
||||
})
|
||||
@@ -1,3 +1,5 @@
|
||||
import {clamp} from './math'
|
||||
|
||||
export class Color {
|
||||
constructor(
|
||||
readonly r: number = 0,
|
||||
@@ -7,6 +9,9 @@ export class Color {
|
||||
) {}
|
||||
|
||||
static fromLumaChromaHue(L: number, C: number, H: number) {
|
||||
// 0 <= L <= 1
|
||||
// 0 <= C <= 1
|
||||
// 0 <= H <= 360
|
||||
// https://en.wikipedia.org/wiki/HSL_and_HSV#From_luma/chroma/hue
|
||||
|
||||
const hPrime = H / 60
|
||||
@@ -26,7 +31,7 @@ export class Color {
|
||||
|
||||
const m = L - (0.3 * R1 + 0.59 * G1 + 0.11 * B1)
|
||||
|
||||
return new Color(R1 + m, G1 + m, B1 + m, 1.0)
|
||||
return new Color(clamp(R1 + m, 0, 1), clamp(G1 + m, 0, 1), clamp(B1 + m, 0, 1), 1.0)
|
||||
}
|
||||
|
||||
toCSS(): string {
|
||||
@@ -0,0 +1,13 @@
|
||||
import {demangleCpp} from './demangle-cpp'
|
||||
|
||||
test('demangleCpp', () => {
|
||||
expect(demangleCpp('a')).toBe('a')
|
||||
expect(demangleCpp('someUnobfuscatedFunction')).toBe('someUnobfuscatedFunction')
|
||||
expect(demangleCpp('__ZNK7Support6ColorFeqERKS0_')).toBe(
|
||||
'Support::ColorF::operator==(Support::ColorF const&) const',
|
||||
)
|
||||
// Running a second time to test the cache
|
||||
expect(demangleCpp('__ZNK7Support6ColorFeqERKS0_')).toBe(
|
||||
'Support::ColorF::operator==(Support::ColorF const&) const',
|
||||
)
|
||||
})
|
||||
File diff suppressed because one or more lines are too long
@@ -21,10 +21,11 @@ test('importEmscriptenSymbolMap', () => {
|
||||
'a:A',
|
||||
'b:B',
|
||||
'c:C',
|
||||
'd:D-D',
|
||||
'',
|
||||
].join('\n'),
|
||||
),
|
||||
).toEqual(new Map([['a', 'A'], ['b', 'B'], ['c', 'C']]))
|
||||
).toEqual(new Map([['a', 'A'], ['b', 'B'], ['c', 'C'], ['d', 'D-D']]))
|
||||
|
||||
// Valid symbol map with non-alpha characters
|
||||
expect(importEmscriptenSymbolMap('u6:__ZN8tinyxml210XMLCommentD0Ev\n')).toEqual(
|
||||
@@ -39,10 +40,16 @@ test('importEmscriptenSymbolMap', () => {
|
||||
'0:A',
|
||||
'1:B',
|
||||
'2:C',
|
||||
'3:D-D',
|
||||
].join('\n'),
|
||||
),
|
||||
).toEqual(
|
||||
new Map([['wasm-function[0]', 'A'], ['wasm-function[1]', 'B'], ['wasm-function[2]', 'C']]),
|
||||
new Map([
|
||||
['wasm-function[0]', 'A'],
|
||||
['wasm-function[1]', 'B'],
|
||||
['wasm-function[2]', 'C'],
|
||||
['wasm-function[3]', 'D-D'],
|
||||
]),
|
||||
)
|
||||
|
||||
// Invalid symbol map
|
||||
@@ -14,8 +14,8 @@ export function importEmscriptenSymbolMap(contents: string): EmscriptenSymbolMap
|
||||
if (!lines.length) return null
|
||||
|
||||
const map: EmscriptenSymbolMap = new Map()
|
||||
const intRegex = /^(\d+):([\$\w]+)$/
|
||||
const idRegex = /^([\$\w]+):([\$\w]+)$/
|
||||
const intRegex = /^(\d+):([\$\w-]+)$/
|
||||
const idRegex = /^([\$\w]+):([\$\w-]+)$/
|
||||
|
||||
for (const line of lines) {
|
||||
// Match lines like "103:__ZN8tinyxml210XMLCommentD0Ev"
|
||||
@@ -4,12 +4,36 @@ export namespace FileFormat {
|
||||
export type Profile = EventedProfile | SampledProfile
|
||||
|
||||
export interface File {
|
||||
version: string
|
||||
$schema: 'https://www.speedscope.app/file-format-schema.json'
|
||||
|
||||
// Data shared between profiles
|
||||
shared: {
|
||||
frames: Frame[]
|
||||
}
|
||||
|
||||
// List of profile definitions
|
||||
profiles: Profile[]
|
||||
|
||||
// The name of the contained profile group. If omitted, will use the name of
|
||||
// the file itself.
|
||||
// Added in 0.6.0
|
||||
name?: string
|
||||
|
||||
// The index into the `profiles` array that should be displayed upon file
|
||||
// load. If omitted, will default to displaying the first profile in the
|
||||
// file.
|
||||
//
|
||||
// Added in 0.6.0
|
||||
activeProfileIndex?: number
|
||||
|
||||
// The name of the the program which exported this profile. This isn't
|
||||
// consumed but can be helpful for debugging generated data by seeing what
|
||||
// was generating it! Recommended format is "name@version". e.g. when the
|
||||
// file was exported by speedscope v0.6.0 itself, it will be
|
||||
// "speedscope@0.6.0"
|
||||
//
|
||||
// Added in 0.6.0
|
||||
exporter?: string
|
||||
}
|
||||
|
||||
export interface Frame {
|
||||
@@ -8,4 +8,8 @@ describe('importSpeedscopeProfiles', async () => {
|
||||
test('0.1.2 sampled profile', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/speedscope/0.1.2/simple-sampled.speedscope.json')
|
||||
})
|
||||
|
||||
test('0.6.0 multiple profiles', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/speedscope/0.6.0/two-sampled.speedscope.json')
|
||||
})
|
||||
})
|
||||
@@ -5,29 +5,14 @@ import {
|
||||
CallTreeProfileBuilder,
|
||||
FrameInfo,
|
||||
StackListProfileBuilder,
|
||||
ProfileGroup,
|
||||
} from './profile'
|
||||
import {TimeFormatter, ByteFormatter, RawValueFormatter} from './value-formatters'
|
||||
import {FileFormat} from './file-format-spec'
|
||||
|
||||
export function exportProfile(profile: Profile): FileFormat.File {
|
||||
export function exportProfileGroup(profileGroup: ProfileGroup): FileFormat.File {
|
||||
const frames: FileFormat.Frame[] = []
|
||||
|
||||
const eventedProfile: FileFormat.EventedProfile = {
|
||||
type: FileFormat.ProfileType.EVENTED,
|
||||
name: profile.getName(),
|
||||
unit: profile.getWeightUnit(),
|
||||
startValue: 0,
|
||||
endValue: profile.getTotalWeight(),
|
||||
events: [],
|
||||
}
|
||||
|
||||
const file: FileFormat.File = {
|
||||
version: require('./package.json').version,
|
||||
$schema: 'https://www.speedscope.app/file-format-schema.json',
|
||||
shared: {frames},
|
||||
profiles: [eventedProfile],
|
||||
}
|
||||
|
||||
const indexForFrame = new Map<Frame, number>()
|
||||
function getIndexForFrame(frame: Frame): number {
|
||||
let index = indexForFrame.get(frame)
|
||||
@@ -38,7 +23,6 @@ export function exportProfile(profile: Profile): FileFormat.File {
|
||||
if (frame.file != null) serializedFrame.file = frame.file
|
||||
if (frame.line != null) serializedFrame.line = frame.line
|
||||
if (frame.col != null) serializedFrame.col = frame.col
|
||||
|
||||
index = frames.length
|
||||
indexForFrame.set(frame, index)
|
||||
frames.push(serializedFrame)
|
||||
@@ -46,6 +30,31 @@ export function exportProfile(profile: Profile): FileFormat.File {
|
||||
return index
|
||||
}
|
||||
|
||||
const file: FileFormat.File = {
|
||||
exporter: `speedscope@${require('../../package.json').version}`,
|
||||
name: profileGroup.name,
|
||||
activeProfileIndex: profileGroup.indexToView,
|
||||
$schema: 'https://www.speedscope.app/file-format-schema.json',
|
||||
shared: {frames},
|
||||
profiles: [],
|
||||
}
|
||||
|
||||
for (let profile of profileGroup.profiles) {
|
||||
file.profiles.push(exportProfile(profile, getIndexForFrame))
|
||||
}
|
||||
|
||||
return file
|
||||
}
|
||||
|
||||
function exportProfile(profile: Profile, getIndexForFrame: (frame: Frame) => number) {
|
||||
const eventedProfile: FileFormat.EventedProfile = {
|
||||
type: FileFormat.ProfileType.EVENTED,
|
||||
name: profile.getName(),
|
||||
unit: profile.getWeightUnit(),
|
||||
startValue: 0,
|
||||
endValue: profile.getTotalWeight(),
|
||||
events: [],
|
||||
}
|
||||
const openFrame = (node: CallTreeNode, value: number) => {
|
||||
eventedProfile.events.push({
|
||||
type: FileFormat.EventType.OPEN_FRAME,
|
||||
@@ -61,8 +70,7 @@ export function exportProfile(profile: Profile): FileFormat.File {
|
||||
})
|
||||
}
|
||||
profile.forEachCall(openFrame, closeFrame)
|
||||
|
||||
return file
|
||||
return eventedProfile
|
||||
}
|
||||
|
||||
function importSpeedscopeProfile(
|
||||
@@ -130,7 +138,7 @@ function importSpeedscopeProfile(
|
||||
for (let i = 0; i < samples.length; i++) {
|
||||
const stack = samples[i]
|
||||
const weight = weights[i]
|
||||
profile.appendSample(stack.map(n => frameInfos[n]), weight)
|
||||
profile.appendSampleWithWeight(stack.map(n => frameInfos[n]), weight)
|
||||
}
|
||||
|
||||
return profile.build()
|
||||
@@ -144,14 +152,19 @@ function importSpeedscopeProfile(
|
||||
}
|
||||
}
|
||||
|
||||
export function importSpeedscopeProfiles(serialized: FileFormat.File): Profile[] {
|
||||
return serialized.profiles.map(p => importSpeedscopeProfile(p, serialized.shared.frames))
|
||||
export function importSpeedscopeProfiles(serialized: FileFormat.File): ProfileGroup {
|
||||
return {
|
||||
name: serialized.name || serialized.profiles[0].name || 'profile',
|
||||
indexToView: serialized.activeProfileIndex || 0,
|
||||
profiles: serialized.profiles.map(p => importSpeedscopeProfile(p, serialized.shared.frames)),
|
||||
}
|
||||
}
|
||||
|
||||
export function saveToFile(profile: Profile): void {
|
||||
const blob = new Blob([JSON.stringify(exportProfile(profile))], {type: 'text/json'})
|
||||
export function saveToFile(profileGroup: ProfileGroup): void {
|
||||
const file = exportProfileGroup(profileGroup)
|
||||
const blob = new Blob([JSON.stringify(file)], {type: 'text/json'})
|
||||
|
||||
const nameWithoutExt = profile.getName().split('.')[0]!
|
||||
const nameWithoutExt = file.name ? file.name.split('.')[0]! : 'profile'
|
||||
const filename = `${nameWithoutExt.replace(/\W+/g, '_')}.speedscope.json`
|
||||
|
||||
console.log('Saving', filename)
|
||||
@@ -1,6 +1,7 @@
|
||||
import {Frame, CallTreeNode} from './profile'
|
||||
|
||||
import {lastOf} from './utils'
|
||||
import {clamp} from './math'
|
||||
|
||||
export interface FlamechartFrame {
|
||||
node: CallTreeNode
|
||||
@@ -47,6 +48,48 @@ export class Flamechart {
|
||||
return this.source.formatValue(v)
|
||||
}
|
||||
|
||||
getClampedViewportWidth(viewportWidth: number) {
|
||||
const maxWidth = this.getTotalWeight()
|
||||
|
||||
// In order to avoid floating point error, we cap the maximum zoom. In
|
||||
// particular, it's important that at the maximum zoom level, the total
|
||||
// trace size + a viewport width is not equal to the trace size due to
|
||||
// floating point rounding.
|
||||
//
|
||||
// For instance, if the profile's total weight is 2^60, and the viewport
|
||||
// size is 1, trying to move one viewport width right will result in no
|
||||
// change because 2^60 + 1 = 2^60 in floating point arithmetic. JavaScript
|
||||
// numbers are 64 bit floats, and therefore have 53 mantissa bits. You can
|
||||
// see this for yourself in the console. Try:
|
||||
//
|
||||
// > Math.pow(2, 60) + 1 === Math.pow(2, 60)
|
||||
// true
|
||||
// > Math.pow(2, 53) + 1 === Math.pow(2, 53)
|
||||
// true
|
||||
// > Math.pow(2, 52) + 1 === Math.pow(2, 52)
|
||||
// false
|
||||
//
|
||||
// We use 2^40 as a cap instead, since we want to be able to make small
|
||||
// adjustments within a viewport width.
|
||||
//
|
||||
// For reference, this will still allow you to zoom until 1 nanosecond fills
|
||||
// the screen in a profile with a duration of over 18 minutes.
|
||||
//
|
||||
// > Math.pow(2, 40) / (60 * Math.pow(10, 9))
|
||||
// 18.325193796266667
|
||||
//
|
||||
const maxZoom = Math.pow(2, 40)
|
||||
|
||||
// In addition to capping zoom to avoid floating point error, we further cap
|
||||
// zoom to avoid letting you zoom in so that the smallest element more than
|
||||
// fills the screen, since that probably isn't useful. The final zoom cap is
|
||||
// determined by the minimum zoom of either 2^40x zoom or the necessary zoom
|
||||
// for the smallest frame to fill the screen three times.
|
||||
const minWidth = clamp(3 * this.getMinFrameWidth(), maxWidth / maxZoom, maxWidth)
|
||||
|
||||
return clamp(viewportWidth, minWidth, maxWidth)
|
||||
}
|
||||
|
||||
constructor(private source: FlamechartDataSource) {
|
||||
const stack: FlamechartFrame[] = []
|
||||
const openFrame = (node: CallTreeNode, value: number) => {
|
||||
@@ -0,0 +1,27 @@
|
||||
import {getHashParams} from './hash-params'
|
||||
|
||||
test('getHashParams', () => {
|
||||
expect(getHashParams('')).toEqual({})
|
||||
expect(getHashParams('#')).toEqual({})
|
||||
expect(getHashParams('#title=hello')).toEqual({title: 'hello'})
|
||||
expect(getHashParams('#localProfilePath=file:///tmp/file.js')).toEqual({
|
||||
localProfilePath: 'file:///tmp/file.js',
|
||||
})
|
||||
expect(
|
||||
getHashParams(
|
||||
'#profileURL=https://raw.githubusercontent.com/jlfwong/speedscope/master/sample/profiles/speedscope/0.1.2/simple-sampled.speedscope.json',
|
||||
),
|
||||
).toEqual({
|
||||
profileURL:
|
||||
'https://raw.githubusercontent.com/jlfwong/speedscope/master/sample/profiles/speedscope/0.1.2/simple-sampled.speedscope.json',
|
||||
})
|
||||
expect(getHashParams('#title=hello&localProfilePath=file:///tmp/file.js')).toEqual({
|
||||
title: 'hello',
|
||||
localProfilePath: 'file:///tmp/file.js',
|
||||
})
|
||||
expect(getHashParams('#title=hello%20world')).toEqual({
|
||||
title: 'hello world',
|
||||
})
|
||||
expect(getHashParams('#abc=bcd')).toEqual({})
|
||||
expect(getHashParams('garbage')).toEqual({})
|
||||
})
|
||||
@@ -4,22 +4,22 @@ export interface HashParams {
|
||||
localProfilePath?: string
|
||||
}
|
||||
|
||||
export function getHashParams(): HashParams {
|
||||
export function getHashParams(hashContents = window.location.hash): HashParams {
|
||||
try {
|
||||
const hashContents = window.location.hash
|
||||
if (!hashContents.startsWith('#')) {
|
||||
return {}
|
||||
}
|
||||
const components = hashContents.substr(1).split('&')
|
||||
const result: HashParams = {}
|
||||
for (const component of components) {
|
||||
const [key, value] = component.split('=')
|
||||
let [key, value] = component.split('=')
|
||||
value = decodeURIComponent(value)
|
||||
if (key === 'profileURL') {
|
||||
result.profileURL = decodeURIComponent(value)
|
||||
result.profileURL = value
|
||||
} else if (key === 'title') {
|
||||
result.title = decodeURIComponent(value)
|
||||
result.title = value
|
||||
} else if (key === 'localProfilePath') {
|
||||
result.localProfilePath = decodeURIComponent(value)
|
||||
result.localProfilePath = value
|
||||
}
|
||||
}
|
||||
return result
|
||||
@@ -50,6 +50,30 @@ function toStackList(profile: Profile, grouped: boolean): string[] {
|
||||
return stackList
|
||||
}
|
||||
|
||||
function flatten<T>(ts: T[][]): T[] {
|
||||
let ret: T[] = []
|
||||
return ret.concat(...ts)
|
||||
}
|
||||
|
||||
function toTreeString(profile: Profile, grouped: boolean): string {
|
||||
function visit(node: CallTreeNode): string[] {
|
||||
const childLines = flatten(node.children.map(child => visit(child))).map(l => ` ${l}`)
|
||||
const nodeStr = `${node.frame.key}:${node.getSelfWeight()}:${node.getTotalWeight()}`
|
||||
|
||||
if (childLines.length > 0) {
|
||||
return [`(${nodeStr}`].concat(childLines).concat(')')
|
||||
} else {
|
||||
return [`(${nodeStr})`]
|
||||
}
|
||||
}
|
||||
|
||||
if (grouped) {
|
||||
return visit(profile.getGroupedCalltreeRoot()).join('\n')
|
||||
} else {
|
||||
return visit(profile.getAppendOrderCalltreeRoot()).join('\n')
|
||||
}
|
||||
}
|
||||
|
||||
function verifyProfile(profile: Profile) {
|
||||
const allFrameKeys = new Set([fa, fb, fc, fd, fe].map(f => f.key))
|
||||
const framesInProfile = new Set<string | number>()
|
||||
@@ -123,9 +147,9 @@ test('StackListProfileBuilder', () => {
|
||||
]
|
||||
|
||||
samples.forEach(stack => {
|
||||
b.appendSample(stack, 1)
|
||||
b.appendSampleWithWeight(stack, 1)
|
||||
})
|
||||
b.appendSample([], 4)
|
||||
b.appendSampleWithWeight([], 4)
|
||||
|
||||
const profile = b.build()
|
||||
expect(profile.getTotalWeight()).toBe(samples.length + 4)
|
||||
@@ -133,6 +157,28 @@ test('StackListProfileBuilder', () => {
|
||||
verifyProfile(profile)
|
||||
})
|
||||
|
||||
test('StackListProfileBuilder separates non-contiguous', () => {
|
||||
const b = new StackListProfileBuilder()
|
||||
|
||||
const samples = [
|
||||
// prettier-ignore
|
||||
[fa, fb, fc],
|
||||
[fa, fb],
|
||||
[fa],
|
||||
[fa, fb],
|
||||
[fa, fb, fc],
|
||||
]
|
||||
|
||||
samples.forEach(stack => {
|
||||
b.appendSampleWithWeight(stack, 1)
|
||||
})
|
||||
b.appendSampleWithWeight([], 4)
|
||||
const profile = b.build()
|
||||
|
||||
expect(toTreeString(profile, true)).toMatchSnapshot('grouped')
|
||||
expect(toTreeString(profile, false)).toMatchSnapshot('append order')
|
||||
})
|
||||
|
||||
test('CallTreeProfileBuilder', () => {
|
||||
const b = new CallTreeProfileBuilder()
|
||||
|
||||
@@ -167,6 +213,30 @@ test('CallTreeProfileBuilder', () => {
|
||||
verifyProfile(profile)
|
||||
})
|
||||
|
||||
test('CallTreeProfileBuilder separates non-contiguous', () => {
|
||||
const b = new CallTreeProfileBuilder()
|
||||
|
||||
b.enterFrame(fa, 0)
|
||||
b.enterFrame(fb, 0)
|
||||
b.enterFrame(fc, 0)
|
||||
|
||||
b.leaveFrame(fc, 1)
|
||||
|
||||
b.leaveFrame(fb, 2)
|
||||
|
||||
b.enterFrame(fb, 3)
|
||||
|
||||
b.enterFrame(fc, 4)
|
||||
|
||||
b.leaveFrame(fc, 5)
|
||||
b.leaveFrame(fb, 5)
|
||||
b.leaveFrame(fa, 5)
|
||||
|
||||
const profile = b.build()
|
||||
expect(toTreeString(profile, true)).toMatchSnapshot('grouped')
|
||||
expect(toTreeString(profile, false)).toMatchSnapshot('append order')
|
||||
})
|
||||
|
||||
test('getInvertedProfileForCallersOf', () => {
|
||||
const b = new StackListProfileBuilder()
|
||||
|
||||
@@ -181,7 +251,7 @@ test('getInvertedProfileForCallersOf', () => {
|
||||
[fd, fb],
|
||||
]
|
||||
samples.forEach(stack => {
|
||||
b.appendSample(stack, 1)
|
||||
b.appendSampleWithWeight(stack, 1)
|
||||
})
|
||||
|
||||
const profile = b.build()
|
||||
@@ -209,7 +279,7 @@ test('getProfileForCalleesOf', () => {
|
||||
[fd, fb],
|
||||
]
|
||||
samples.forEach(stack => {
|
||||
b.appendSample(stack, 1)
|
||||
b.appendSampleWithWeight(stack, 1)
|
||||
})
|
||||
|
||||
const profile = b.build()
|
||||
@@ -235,7 +305,7 @@ test('getProfileWithRecursionFlattened', () => {
|
||||
[fa, fb, fa],
|
||||
]
|
||||
samples.forEach(stack => {
|
||||
b.appendSample(stack, 1)
|
||||
b.appendSampleWithWeight(stack, 1)
|
||||
})
|
||||
|
||||
const profile = b.build()
|
||||
@@ -89,20 +89,43 @@ export class CallTreeNode extends HasWeights {
|
||||
return this.frame === Frame.root
|
||||
}
|
||||
|
||||
// If a node is "frozen", it means it should no longer be mutated.
|
||||
private frozen = false
|
||||
isFrozen() {
|
||||
return this.frozen
|
||||
}
|
||||
freeze() {
|
||||
this.frozen = true
|
||||
}
|
||||
|
||||
constructor(readonly frame: Frame, readonly parent: CallTreeNode | null) {
|
||||
super()
|
||||
}
|
||||
}
|
||||
|
||||
export interface ProfileGroup {
|
||||
name: string
|
||||
indexToView: number
|
||||
profiles: Profile[]
|
||||
}
|
||||
|
||||
export class Profile {
|
||||
protected name: string = ''
|
||||
|
||||
protected totalWeight: number
|
||||
|
||||
protected frames = new KeyedSet<Frame>()
|
||||
|
||||
protected appendOrderCalltreeRoot = new CallTreeNode(Frame.root, null)
|
||||
protected groupedCalltreeRoot = new CallTreeNode(Frame.root, null)
|
||||
|
||||
public getAppendOrderCalltreeRoot() {
|
||||
return this.appendOrderCalltreeRoot
|
||||
}
|
||||
public getGroupedCalltreeRoot() {
|
||||
return this.groupedCalltreeRoot
|
||||
}
|
||||
|
||||
// List of references to CallTreeNodes at the top of the
|
||||
// stack at the time of the sample.
|
||||
protected samples: CallTreeNode[] = []
|
||||
@@ -314,7 +337,7 @@ export class Profile {
|
||||
for (let n: CallTreeNode | null = node; n != null && n.frame !== Frame.root; n = n.parent) {
|
||||
stack.push(n.frame)
|
||||
}
|
||||
builder.appendSample(stack, node.getTotalWeight())
|
||||
builder.appendSampleWithWeight(stack, node.getTotalWeight())
|
||||
}
|
||||
|
||||
const ret = builder.build()
|
||||
@@ -332,7 +355,7 @@ export class Profile {
|
||||
|
||||
function visit(node: CallTreeNode) {
|
||||
stack.push(node.frame)
|
||||
builder.appendSample(stack, node.getSelfWeight())
|
||||
builder.appendSampleWithWeight(stack, node.getSelfWeight())
|
||||
for (let child of node.children) {
|
||||
visit(child)
|
||||
}
|
||||
@@ -395,7 +418,7 @@ export class StackListProfileBuilder extends Profile {
|
||||
const last = useAppendOrder
|
||||
? lastOf(node.children)
|
||||
: node.children.find(c => c.frame === frame)
|
||||
if (last && last.frame == frame) {
|
||||
if (last && !last.isFrozen() && last.frame == frame) {
|
||||
node = last
|
||||
} else {
|
||||
const parent = node
|
||||
@@ -414,6 +437,12 @@ export class StackListProfileBuilder extends Profile {
|
||||
}
|
||||
node.addToSelfWeight(weight)
|
||||
|
||||
if (useAppendOrder) {
|
||||
for (let child of node.children) {
|
||||
child.freeze()
|
||||
}
|
||||
}
|
||||
|
||||
if (useAppendOrder) {
|
||||
node.frame.addToSelfWeight(weight)
|
||||
|
||||
@@ -421,17 +450,63 @@ export class StackListProfileBuilder extends Profile {
|
||||
frame.addToTotalWeight(weight)
|
||||
}
|
||||
|
||||
this.samples.push(node)
|
||||
this.weights.push(weight)
|
||||
if (node === lastOf(this.samples)) {
|
||||
this.weights[this.weights.length - 1] += weight
|
||||
} else {
|
||||
this.samples.push(node)
|
||||
this.weights.push(weight)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
appendSample(stack: FrameInfo[], weight: number) {
|
||||
appendSampleWithWeight(stack: FrameInfo[], weight: number) {
|
||||
if (weight === 0) {
|
||||
// Samples with zero weight have no effect, so let's ignore them
|
||||
return
|
||||
}
|
||||
if (weight < 0) {
|
||||
throw new Error('Samples must have positive weights')
|
||||
}
|
||||
|
||||
this._appendSample(stack, weight, true)
|
||||
this._appendSample(stack, weight, false)
|
||||
}
|
||||
|
||||
private pendingSample: {
|
||||
stack: FrameInfo[]
|
||||
startTimestamp: number
|
||||
centralTimestamp: number
|
||||
} | null = null
|
||||
appendSampleWithTimestamp(stack: FrameInfo[], timestamp: number) {
|
||||
if (this.pendingSample) {
|
||||
if (timestamp < this.pendingSample.centralTimestamp) {
|
||||
throw new Error('Timestamps received out of order')
|
||||
}
|
||||
const endTimestamp = (timestamp + this.pendingSample.centralTimestamp) / 2
|
||||
this.appendSampleWithWeight(
|
||||
this.pendingSample.stack,
|
||||
endTimestamp - this.pendingSample.startTimestamp,
|
||||
)
|
||||
this.pendingSample = {stack, startTimestamp: endTimestamp, centralTimestamp: timestamp}
|
||||
} else {
|
||||
this.pendingSample = {stack, startTimestamp: timestamp, centralTimestamp: timestamp}
|
||||
}
|
||||
}
|
||||
|
||||
build(): Profile {
|
||||
if (this.pendingSample) {
|
||||
if (this.samples.length > 0) {
|
||||
this.appendSampleWithWeight(
|
||||
this.pendingSample.stack,
|
||||
this.pendingSample.centralTimestamp - this.pendingSample.startTimestamp,
|
||||
)
|
||||
} else {
|
||||
// There is only a single sample. In this case, units will be meaningless,
|
||||
// so we'll append with a weight of 1 and also clear any value formatter
|
||||
this.appendSampleWithWeight(this.pendingSample.stack, 1)
|
||||
this.setValueFormatter(new RawValueFormatter())
|
||||
}
|
||||
}
|
||||
this.totalWeight = Math.max(this.totalWeight, this.weights.reduce((a, b) => a + b, 0))
|
||||
return this
|
||||
}
|
||||
@@ -493,7 +568,7 @@ export class CallTreeProfileBuilder extends Profile {
|
||||
? lastOf(prevTop.children)
|
||||
: prevTop.children.find(c => c.frame === frame)
|
||||
let node: CallTreeNode
|
||||
if (last && last.frame == frame) {
|
||||
if (last && !last.isFrozen() && last.frame == frame) {
|
||||
node = last
|
||||
} else {
|
||||
node = new CallTreeNode(frame, prevTop)
|
||||
@@ -520,10 +595,17 @@ export class CallTreeProfileBuilder extends Profile {
|
||||
|
||||
if (useAppendOrder) {
|
||||
const leavingStackTop = this.appendOrderStack.pop()
|
||||
const delta = value - this.lastValue!
|
||||
if (leavingStackTop == null) {
|
||||
throw new Error(`Trying to leave ${frame.key} when stack is empty`)
|
||||
}
|
||||
if (this.lastValue == null) {
|
||||
throw new Error(`Trying to leave a ${frame.key} before any have been entered`)
|
||||
}
|
||||
leavingStackTop.freeze()
|
||||
const delta = value - this.lastValue
|
||||
if (delta > 0) {
|
||||
this.samples.push(leavingStackTop!)
|
||||
this.weights.push(value - this.lastValue!)
|
||||
this.samples.push(leavingStackTop)
|
||||
this.weights.push(value - this.lastValue)
|
||||
} else if (delta < 0) {
|
||||
throw new Error(
|
||||
`Samples must be provided in increasing order of cumulative value. Last sample was ${this
|
||||
@@ -556,6 +638,11 @@ export class CallTreeProfileBuilder extends Profile {
|
||||
}
|
||||
|
||||
build(): Profile {
|
||||
// Each stack is expected to contain a single node which we initialize to be
|
||||
// the root node.
|
||||
if (this.appendOrderStack.length > 1 || this.groupedOrderStack.length > 1) {
|
||||
throw new Error('Tried to complete profile construction with a non-empty stack')
|
||||
}
|
||||
return this
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
import {Profile, CallTreeNode, Frame} from './profile'
|
||||
import {importProfileGroup} from '../import'
|
||||
import {exportProfileGroup, importSpeedscopeProfiles} from './file-format'
|
||||
|
||||
interface DumpedProfile {
|
||||
name: string
|
||||
stacks: string[]
|
||||
frames: Frame[]
|
||||
}
|
||||
|
||||
export function dumpProfile(profile: Profile): any {
|
||||
const dump: DumpedProfile = {
|
||||
name: profile.getName(),
|
||||
stacks: [],
|
||||
frames: [],
|
||||
}
|
||||
|
||||
profile.forEachFrame(f => dump.frames.push(f))
|
||||
|
||||
let lastValue = 0
|
||||
const curStack: (number | string)[] = []
|
||||
|
||||
function maybeEmit(value: number) {
|
||||
if (lastValue != value) {
|
||||
dump.stacks.push(
|
||||
curStack.map(k => `${k}`).join(';') + ` ${profile.formatValue(value - lastValue)}`,
|
||||
)
|
||||
lastValue = value
|
||||
}
|
||||
}
|
||||
|
||||
function openFrame(node: CallTreeNode, value: number) {
|
||||
maybeEmit(value)
|
||||
curStack.push(node.frame.name)
|
||||
}
|
||||
|
||||
function closeFrame(node: CallTreeNode, value: number) {
|
||||
maybeEmit(value)
|
||||
curStack.pop()
|
||||
}
|
||||
|
||||
profile.forEachCall(openFrame, closeFrame)
|
||||
|
||||
return dump
|
||||
}
|
||||
|
||||
export async function checkProfileSnapshot(filepath: string) {
|
||||
const input = fs.readFileSync(filepath, 'utf8')
|
||||
|
||||
const profileGroup = await importProfileGroup(path.basename(filepath), input)
|
||||
if (profileGroup) {
|
||||
expect(profileGroup.name).toMatchSnapshot('profileGroup.name')
|
||||
expect(profileGroup.indexToView).toMatchSnapshot('indexToView')
|
||||
|
||||
for (let profile of profileGroup.profiles) {
|
||||
expect(dumpProfile(profile)).toMatchSnapshot()
|
||||
}
|
||||
} else {
|
||||
fail('Failed to extract profile')
|
||||
return
|
||||
}
|
||||
|
||||
const profilesWithoutFilename = await importProfileGroup('unknown', input)
|
||||
if (profilesWithoutFilename) {
|
||||
expect(profilesWithoutFilename.profiles.length).toEqual(profileGroup.profiles.length)
|
||||
profilesWithoutFilename.name = profileGroup.name
|
||||
for (let i = 0; i < profileGroup.profiles.length; i++) {
|
||||
const a = profileGroup.profiles[i]
|
||||
const b = profilesWithoutFilename.profiles[i]
|
||||
b.setName(a.getName())
|
||||
}
|
||||
expect(exportProfileGroup(profileGroup)).toEqual(exportProfileGroup(profilesWithoutFilename))
|
||||
} else {
|
||||
fail('Failed to extract profile when filename was "unknown"')
|
||||
return
|
||||
}
|
||||
|
||||
const exported = exportProfileGroup(profileGroup)
|
||||
const reimportedGroup = importSpeedscopeProfiles(exported)
|
||||
|
||||
expect(reimportedGroup.name).toEqual(profileGroup.name)
|
||||
expect(reimportedGroup.profiles.length).toEqual(profileGroup.profiles.length)
|
||||
|
||||
for (let i = 0; i < profileGroup.profiles.length; i++) {
|
||||
const profile = profileGroup.profiles[i]
|
||||
const reimported = reimportedGroup.profiles[i]
|
||||
|
||||
expect(reimported.getTotalWeight()).toEqual(profile.getTotalWeight())
|
||||
expect(dumpProfile(reimported).stacks.join('\n')).toEqual(
|
||||
dumpProfile(profile).stacks.join('\n'),
|
||||
)
|
||||
}
|
||||
|
||||
const reexported = exportProfileGroup(reimportedGroup)
|
||||
expect(exported).toEqual(reexported)
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
import {connect} from 'preact-redux'
|
||||
import * as redux from 'redux'
|
||||
import {ComponentConstructor, Component} from 'preact'
|
||||
|
||||
export interface Action<TPayload> extends redux.Action<string> {
|
||||
payload: TPayload
|
||||
}
|
||||
|
||||
export interface ActionCreator<TPayload> {
|
||||
// Returns an action with a non-empty payload
|
||||
(payload: TPayload): Action<TPayload>
|
||||
|
||||
// Returns an action with an empty payload ({})
|
||||
(): Action<TPayload>
|
||||
|
||||
matches(action: Action<any>): action is Action<TPayload>
|
||||
}
|
||||
|
||||
const usedActionTypes = new Set<string>()
|
||||
|
||||
export function actionCreator(type: string): ActionCreator<void>
|
||||
export function actionCreator<TPayload>(type: string): ActionCreator<TPayload>
|
||||
export function actionCreator(type: string) {
|
||||
if (usedActionTypes.has(type)) {
|
||||
throw new Error(`Cannot re-use action type name: ${type}`)
|
||||
}
|
||||
|
||||
const creator: any = (payload = {}) => {
|
||||
return {type, payload}
|
||||
}
|
||||
|
||||
creator.matches = (action: Action<any>) => {
|
||||
return action.type === type
|
||||
}
|
||||
|
||||
return creator
|
||||
}
|
||||
|
||||
export type Reducer<T> = (state: T | undefined, action: Action<any>) => T
|
||||
export type ReducerWithActionType<T, A> = (state: T | undefined, action: Action<A>) => T
|
||||
|
||||
export function setter<T>(
|
||||
setterAction: ActionCreator<T>,
|
||||
defaultVal: T,
|
||||
): (state: T | undefined, action: Action<any>) => T {
|
||||
return (state = defaultVal, action) => {
|
||||
if (setterAction.matches(action)) {
|
||||
return action.payload
|
||||
}
|
||||
return state
|
||||
}
|
||||
}
|
||||
|
||||
export type Dispatch = redux.Dispatch<Action<any>>
|
||||
|
||||
// We make this into a single function invocation instead of the connect(map, map)(Component)
|
||||
// syntax to make better use of type inference.
|
||||
//
|
||||
// NOTE: To avoid this returning objects which do not compare shallow equal, it's the
|
||||
// responsibility of the caller to ensure that the props returned by map compare shallow
|
||||
// equal. This most importantly mean memoizing functions which wrap dispatch to avoid
|
||||
// all callback props from being regenerated on every call.
|
||||
export function createContainer<OwnProps, State, ComponentProps, ComponentType>(
|
||||
component: {
|
||||
new (props: ComponentProps): ComponentType
|
||||
},
|
||||
map: (state: State, dispatch: Dispatch, ownProps: OwnProps) => ComponentProps,
|
||||
): ComponentConstructor<OwnProps, {}> {
|
||||
const mapStateToProps = (state: State) => state
|
||||
const mapDispatchToProps = (dispatch: Dispatch) => ({dispatch})
|
||||
const mergeProps = (
|
||||
stateProps: State,
|
||||
dispatchProps: {dispatch: Dispatch},
|
||||
ownProps: OwnProps,
|
||||
) => {
|
||||
return map(stateProps, dispatchProps.dispatch, ownProps)
|
||||
}
|
||||
return connect(mapStateToProps, mapDispatchToProps, mergeProps)(component)
|
||||
}
|
||||
|
||||
export type VoidState = {
|
||||
__dummyField: void
|
||||
}
|
||||
|
||||
export abstract class StatelessComponent<P> extends Component<P, VoidState> {}
|
||||
|
||||
export function bindActionCreator<T>(
|
||||
dispatch: Dispatch,
|
||||
actionCreator: (payload: T) => Action<T>,
|
||||
): (t: T) => void {
|
||||
return (t: T) => {
|
||||
dispatch(actionCreator(t))
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,9 @@ import {
|
||||
formatPercent,
|
||||
KeyedSet,
|
||||
binarySearch,
|
||||
memoizeByReference,
|
||||
memoizeByShallowEquality,
|
||||
objectsHaveShallowEquality,
|
||||
} from './utils'
|
||||
|
||||
test('sortBy', () => {
|
||||
@@ -109,3 +112,64 @@ test('binarySearch', () => {
|
||||
expect(lo).toBeLessThan(Math.E)
|
||||
expect(hi).toBeGreaterThan(Math.E)
|
||||
})
|
||||
|
||||
test('memoizeByReference', () => {
|
||||
let hitCount = 0
|
||||
const identity = memoizeByReference((arg: number) => {
|
||||
hitCount++
|
||||
return arg
|
||||
})
|
||||
|
||||
expect(identity(3)).toBe(3)
|
||||
expect(hitCount).toBe(1)
|
||||
expect(identity(3)).toBe(3)
|
||||
expect(hitCount).toBe(1)
|
||||
|
||||
expect(identity(5)).toBe(5)
|
||||
expect(hitCount).toBe(2)
|
||||
|
||||
expect(identity(3)).toBe(3)
|
||||
expect(hitCount).toBe(3)
|
||||
})
|
||||
|
||||
test('memoizeByShallowEquality', () => {
|
||||
let hitCount = 0
|
||||
const identity = memoizeByShallowEquality((arg: {a: number; b: number}) => {
|
||||
hitCount++
|
||||
return arg
|
||||
})
|
||||
|
||||
expect(identity({a: 1, b: 2})).toEqual({a: 1, b: 2})
|
||||
expect(hitCount).toBe(1)
|
||||
expect(identity({a: 1, b: 2})).toEqual({a: 1, b: 2})
|
||||
expect(hitCount).toBe(1)
|
||||
|
||||
expect(identity({a: 2, b: 2})).toEqual({a: 2, b: 2})
|
||||
expect(hitCount).toBe(2)
|
||||
expect(identity({a: 2, b: 2})).toEqual({a: 2, b: 2})
|
||||
expect(hitCount).toBe(2)
|
||||
|
||||
expect(identity({a: 2, b: 1})).toEqual({a: 2, b: 1})
|
||||
expect(hitCount).toBe(3)
|
||||
expect(identity({a: 2, b: 1})).toEqual({a: 2, b: 1})
|
||||
expect(hitCount).toBe(3)
|
||||
|
||||
expect(identity({a: 1, b: 2})).toEqual({a: 1, b: 2})
|
||||
expect(hitCount).toBe(4)
|
||||
})
|
||||
|
||||
test('objectsHaveShallowEquality', () => {
|
||||
expect(objectsHaveShallowEquality({}, {})).toBe(true)
|
||||
expect(objectsHaveShallowEquality({a: 1, b: 2}, {a: 1, b: 2})).toBe(true)
|
||||
|
||||
expect(objectsHaveShallowEquality({a: 1, b: 2}, {a: 1, b: 3})).toBe(false)
|
||||
expect(objectsHaveShallowEquality({a: 1, b: 2}, {a: 2, b: 2})).toBe(false)
|
||||
expect(objectsHaveShallowEquality({a: 1}, {a: 1, b: 2})).toBe(false)
|
||||
expect(objectsHaveShallowEquality({a: 1, b: 2}, {b: 2})).toBe(false)
|
||||
|
||||
expect(objectsHaveShallowEquality([], [])).toBe(true)
|
||||
expect(objectsHaveShallowEquality([1, 2], [1, 2])).toBe(true)
|
||||
|
||||
expect(objectsHaveShallowEquality([1], [1, 2])).toBe(false)
|
||||
expect(objectsHaveShallowEquality([1, 2], [1])).toBe(false)
|
||||
})
|
||||
@@ -121,3 +121,49 @@ export function binarySearch(
|
||||
}
|
||||
|
||||
export function noop(...args: any[]) {}
|
||||
|
||||
export function objectsHaveShallowEquality<T extends object>(a: T, b: T): boolean {
|
||||
for (let key in a) {
|
||||
if (a[key] !== b[key]) return false
|
||||
}
|
||||
for (let key in b) {
|
||||
if (a[key] !== b[key]) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
export function memoizeByShallowEquality<T extends object, U>(cb: (t: T) => U): (t: T) => U {
|
||||
let last: {args: T; result: U} | null = null
|
||||
return (args: T) => {
|
||||
let result: U
|
||||
if (last == null) {
|
||||
result = cb(args)
|
||||
last = {args, result}
|
||||
return result
|
||||
} else if (objectsHaveShallowEquality(last.args, args)) {
|
||||
return last.result
|
||||
} else {
|
||||
last.args = args
|
||||
last.result = cb(args)
|
||||
return last.result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function memoizeByReference<T, U>(cb: (t: T) => U): (t: T) => U {
|
||||
let last: {args: T; result: U} | null = null
|
||||
return (args: T) => {
|
||||
let result: U
|
||||
if (last == null) {
|
||||
result = cb(args)
|
||||
last = {args, result}
|
||||
return result
|
||||
} else if (last.args === args) {
|
||||
return last.result
|
||||
} else {
|
||||
last.args = args
|
||||
last.result = cb(args)
|
||||
return last.result
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
import {h, render} from 'preact'
|
||||
import {createApplicationStore} from './store'
|
||||
import {Provider} from 'preact-redux'
|
||||
import {ApplicationContainer} from './views/application-container'
|
||||
|
||||
console.log(`speedscope v${require('../package.json').version}`)
|
||||
|
||||
declare const module: any
|
||||
if (module.hot) {
|
||||
module.hot.dispose(() => {
|
||||
// Force the old component go through teardown steps
|
||||
render(<div />, document.body, document.body.lastElementChild || undefined)
|
||||
})
|
||||
module.hot.accept()
|
||||
}
|
||||
|
||||
const lastStore: any = (window as any)['store']
|
||||
const store = createApplicationStore(lastStore ? lastStore.getState() : {})
|
||||
;(window as any)['store'] = store
|
||||
|
||||
render(
|
||||
<Provider store={store}>
|
||||
<ApplicationContainer />
|
||||
</Provider>,
|
||||
document.body,
|
||||
document.body.lastElementChild || undefined,
|
||||
)
|
||||
@@ -0,0 +1,69 @@
|
||||
import {actionCreator} from '../lib/typed-redux'
|
||||
import {CallTreeNode, Frame, ProfileGroup} from '../lib/profile'
|
||||
import {SortMethod} from '../views/profile-table-view'
|
||||
import {ViewMode} from '.'
|
||||
import {FlamechartID} from './flamechart-view-state'
|
||||
import {Rect, Vec2} from '../lib/math'
|
||||
import {HashParams} from '../lib/hash-params'
|
||||
import {actionCreatorWithIndex} from './profiles-state'
|
||||
|
||||
export namespace actions {
|
||||
// Set the top-level profile group from which other data will be derived
|
||||
export const setProfileGroup = actionCreator<ProfileGroup>('setProfileGroup')
|
||||
|
||||
// Set the index into the profile group to view
|
||||
export const setProfileIndexToView = actionCreator<number>('setProfileIndexToView')
|
||||
|
||||
export const setGLCanvas = actionCreator<HTMLCanvasElement | null>('setGLCanvas')
|
||||
|
||||
// Set which top-level view should be displayed
|
||||
export const setViewMode = actionCreator<ViewMode>('setViewMode')
|
||||
|
||||
// Set whether or not recursion should be flattened when viewing flamegraphs
|
||||
export const setFlattenRecursion = actionCreator<boolean>('setFlattenRecursion')
|
||||
|
||||
// Set whether a file drag is currently active. Used to indicate that the
|
||||
// application is a valid drop target.
|
||||
export const setDragActive = actionCreator<boolean>('setDragActive')
|
||||
|
||||
// Set whether the application is currently in a loading state. Used to
|
||||
// display a loading progress bar.
|
||||
export const setLoading = actionCreator<boolean>('setLoading')
|
||||
|
||||
// Set whether the application is in an errored state.
|
||||
export const setError = actionCreator<boolean>('setError')
|
||||
|
||||
// Set whether parameters defined by the URL encoded k=v pairs after the # in the URL
|
||||
export const setHashParams = actionCreator<HashParams>('setHashParams')
|
||||
|
||||
export namespace sandwichView {
|
||||
// Set the table sorting method used for the sandwich view.
|
||||
export const setTableSortMethod = actionCreator<SortMethod>('sandwichView.setTableSortMethod')
|
||||
|
||||
export const setSelectedFrame = actionCreatorWithIndex<Frame | null>(
|
||||
'sandwichView.setSelectedFarmr',
|
||||
)
|
||||
}
|
||||
|
||||
export namespace flamechart {
|
||||
export const setHoveredNode = actionCreatorWithIndex<{
|
||||
id: FlamechartID
|
||||
hover: {node: CallTreeNode; event: MouseEvent} | null
|
||||
}>('flamechart.setHoveredNode')
|
||||
|
||||
export const setSelectedNode = actionCreatorWithIndex<{
|
||||
id: FlamechartID
|
||||
selectedNode: CallTreeNode | null
|
||||
}>('flamechart.setSelectedNode')
|
||||
|
||||
export const setConfigSpaceViewportRect = actionCreatorWithIndex<{
|
||||
id: FlamechartID
|
||||
configSpaceViewportRect: Rect
|
||||
}>('flamechart.setConfigSpaceViewportRect')
|
||||
|
||||
export const setLogicalSpaceViewportSize = actionCreatorWithIndex<{
|
||||
id: FlamechartID
|
||||
logicalSpaceViewportSize: Vec2
|
||||
}>('flamechart.setLogicalSpaceViewportSpace')
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user