Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3b35d7b0f | ||
|
|
dfaefe54fd | ||
|
|
7514f4c0c9 | ||
|
|
ff447c2719 | ||
|
|
668bb032ba | ||
|
|
9ed1eb192c | ||
|
|
8620432cbc | ||
|
|
dead3f9ad9 | ||
|
|
80b747a55e | ||
|
|
351994972d | ||
|
|
ca1abfdd32 | ||
|
|
dee9e5ade4 | ||
|
|
2077a905a9 | ||
|
|
e969178e65 | ||
|
|
56f6459af9 | ||
|
|
3f79e0fe96 | ||
|
|
d30bb2ef7e | ||
|
|
fd4195da10 | ||
|
|
707462e9cf | ||
|
|
375040e892 | ||
|
|
5ae9abcf1d | ||
|
|
bdd9301c59 | ||
|
|
cc9750923a | ||
|
|
c3074b7343 | ||
|
|
b15a08b3ff | ||
|
|
68683aa054 | ||
|
|
eb0e1ce731 | ||
|
|
bd546ca893 | ||
|
|
0c1e477f35 | ||
|
|
30ca6291ca | ||
|
|
66a9e5d1cf | ||
|
|
a2022a07a2 | ||
|
|
b7806a1c5f | ||
|
|
7f19a13012 | ||
|
|
abd74be9fa | ||
|
|
c706bdfe04 | ||
|
|
cfc8fe8f6e | ||
|
|
ddc61302e8 | ||
|
|
864c065053 | ||
|
|
7cca1a76bc | ||
|
|
8c574d1c92 | ||
|
|
fbc8946caa | ||
|
|
8cddf3fe81 | ||
|
|
c15ca263d3 | ||
|
|
519847b489 | ||
|
|
6d4f3499da | ||
|
|
ad49dacb29 | ||
|
|
6562fec7a7 | ||
|
|
23d4042e04 | ||
|
|
9961ed8295 | ||
|
|
e35335fe3c | ||
|
|
86f4ba636d | ||
|
|
0fe0c454d3 | ||
|
|
4b292b2acf | ||
|
|
d78d20e005 | ||
|
|
7d0a3a2c59 | ||
|
|
3f205ec3e9 | ||
|
|
c70171836c | ||
|
|
ee0c2c5025 | ||
|
|
3ba60a424d | ||
|
|
c9ba143eb6 | ||
|
|
802fc2d358 | ||
|
|
b910a2069b | ||
|
|
a1f9755f9c | ||
|
|
2686a3ccc0 | ||
|
|
789f296c9c | ||
|
|
64e290c9fc | ||
|
|
a0eba8d434 | ||
|
|
281d9f9033 | ||
|
|
44a1f520fe | ||
|
|
b6190362b4 | ||
|
|
a09f27d816 | ||
|
|
944a6cb126 | ||
|
|
828beb7ccf | ||
|
|
82867ab234 | ||
|
|
6116371ffb | ||
|
|
da2de64d97 | ||
|
|
9c6f88a9f2 | ||
|
|
48ae79a6a7 | ||
|
|
11585fed92 | ||
|
|
f7279e088e | ||
|
|
3fc631cf79 | ||
|
|
5ab320b4cf | ||
|
|
f60ab630be | ||
|
|
453f793042 | ||
|
|
a5c3184880 | ||
|
|
3193b34c46 | ||
|
|
2df69b6713 | ||
|
|
777e605c7b | ||
|
|
100578c536 | ||
|
|
03578ea7a4 | ||
|
|
3210f8fc08 | ||
|
|
2c89cefcdc | ||
|
|
853164ebbf | ||
|
|
729d7c771b | ||
|
|
9d13d95f8d | ||
|
|
085d6298ec | ||
|
|
aa35b17d20 | ||
|
|
a22ab9301f | ||
|
|
e404053837 |
+11
-4
@@ -1,13 +1,20 @@
|
||||
module.exports = {
|
||||
parser: 'typescript-eslint-parser',
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
sourceType: 'module',
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
},
|
||||
plugins: ['prettier'],
|
||||
plugins: ['prettier', '@typescript-eslint', 'react-hooks'],
|
||||
rules: {
|
||||
'prettier/prettier': 'error',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'react-hooks/rules-of-hooks': 'error',
|
||||
'react-hooks/exhaustive-deps': [
|
||||
'error',
|
||||
{
|
||||
additionalHooks: '(useSelector|useAppSelector|useActionCreator)',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
+4
-1
@@ -1,3 +1,6 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- '9'
|
||||
- '10'
|
||||
- '12'
|
||||
- '13'
|
||||
- 'node'
|
||||
|
||||
+171
-11
@@ -1,33 +1,193 @@
|
||||
## [Unreleased]
|
||||
## Unreleased
|
||||
|
||||
## [1.8.0] - 2020-07-19
|
||||
|
||||
### Added
|
||||
|
||||
- Added search highlighting in time order & left heavy views [[#297](https://github.com/jlfwong/speedscope/pull/297)]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix performance issues for the caller/callee flamegraphs in the sandwich view [[#296](https://github.com/jlfwong/speedscope/pull/296)]
|
||||
|
||||
## [1.7.0] - 2020-07-13
|
||||
|
||||
### Added
|
||||
|
||||
- Introduced filtering via Ctrl+F/Cmd+F into the sandwich view [[#293](https://github.com/jlfwong/speedscope/pull/293)]
|
||||
|
||||
## [1.6.0] - 2020-05-30
|
||||
|
||||
### Added
|
||||
|
||||
- Improved profile/thread selection UI [[#282](https://github.com/jlfwong/speedscope/pull/282)]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Crash instead of incorrectly interpreting profiles with incorrectly ordered events [[#273](https://github.com/jlfwong/speedscope/pull/273)]
|
||||
- A large refactor to upgrade to Preact X was performed [[#267](https://github.com/jlfwong/speedscope/pull/267)]
|
||||
|
||||
## [1.5.3] - 2020-01-16
|
||||
|
||||
### Fixed
|
||||
|
||||
- Bump dependency versions to unbreak build [[#253](https://github.com/jlfwong/speedscope/pull/253)] (by [@jlfwong](https://github.com/jlfwong), with changes from [@Archerlly](https://github.com/Archerlly)'s [#215](https://github.com/jlfwong/speedscope/pull/215))
|
||||
- Trace event: Prevent event re-ordering from generating incorrect flamegraphs ([#252](https://github.com/jlfwong/speedscope/pull/252), with changes from [@hwajaywang](https://github.com/hwajaywang)'s [#249](https://github.com/jlfwong/speedscope/pull/249))
|
||||
- Make tooltip width wider [[#239](https://github.com/jlfwong/speedscope/pull/239)] (by [@miso11](https://github.com/miso11))
|
||||
|
||||
## [1.5.2] - 2019-10-10
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix emscripten remapping when symbols are hex-escaped, like `a\20b` [[#233](https://github.com/jlfwong/speedscope/pull/233)] (by [@jyc](https://github.com/jyc))
|
||||
|
||||
## [1.5.1] - 2019-06-06
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed import of trace event files which contain unmatched "E" events ([#222](https://github.com/jlfwong/speedscope/pull/222)) (by [@jlfwong](https://github.com/jlfwong))
|
||||
|
||||
## [1.5.0] - 2019-02-17
|
||||
|
||||
### Added
|
||||
|
||||
- Support importing unterminated JSON in simple cases ([#208](https://github.com/jlfwong/speedscope/pull/208)) (by [@jlfwong](https://github.com/jlfwong))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix crash when importing from stackprof without raw_timestamp_deltas ([#207](https://github.com/jlfwong/speedscope/pull/207)) (by [@jlfwong](https://github.com/jlfwong))
|
||||
- Alert instead of crash when importing a file containing no profiles ([#205](https://github.com/jlfwong/speedscope/pull/205)) (by [@jlfwong](https://github.com/jlfwong))
|
||||
- Fixed import of multithreaded profiles from Chrome 66 ([#206](https://github.com/jlfwong/speedscope/pull/206)) (by [@jlfwong](https://github.com/jlfwong))
|
||||
- Fixed import of instruments trace files with missing run number ([#203](https://github.com/jlfwong/speedscope/pull/203)) (by [@Archerlly](https://github.com/Archerlly))
|
||||
|
||||
## [1.4.1] - 2019-01-22
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix importing of Trace Event Format files with no ts field on M events [[#198](https://github.com/jlfwong/speedscope/pull/198)] (by [@jlfwong](https://github.com/jlfwong))
|
||||
|
||||
## [1.4.0] - 2019-01-22
|
||||
|
||||
### Added
|
||||
|
||||
- Import v8 cpu profile (old format) [[#177](https://github.com/jlfwong/speedscope/pull/177)] (by [@vmarchaud](https://github.com/vmarchaud))
|
||||
- Import basic "Trace Event Format" profiles [[#197](https://github.com/jlfwong/speedscope/pull/197)] (by [@jlfwong](https://github.com/jlfwong))
|
||||
|
||||
## [1.3.2] - 2018-12-03
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed import of multithreaded Chrome profiles [[#19](https://github.com/jlfwong/speedscope/pull/19)] (by [@jlfwong](https://github.com/jlfwong))
|
||||
|
||||
## [1.3.1] - 2018-11-08
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed a file import performance regression by using TextDecoder [[#188](https://github.com/jlfwong/speedscope/pull/188)] (by [@jlfwong](https://github.com/jlfwong))
|
||||
|
||||
## [1.3.0] - 2018-10-29
|
||||
|
||||
### Added
|
||||
|
||||
- Support import from Haskell GHC JSON format support [[#183](https://github.com/jlfwong/speedscope/pull/183)] (by [@trishume](https://github.com/trishume))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Make the wasd keymappings work on azerty keyboards [[#184](https://github.com/jlfwong/speedscope/pull/184)] (by [@vrischmann](https://github.com/vrischmann))
|
||||
- Fix import of binary formats via profileURL [[#179](https://github.com/jlfwong/speedscope/pull/179)] (by [@f](https://github.com/f)-hj)
|
||||
|
||||
## [1.2.0] - 2018-10-08
|
||||
|
||||
### Added
|
||||
|
||||
- Add import of v8 heap allocation profile [[#170](https://github.com/jlfwong/speedscope/pull/170)] (by [@vmarchaud](https://github.com/vmarchaud))
|
||||
|
||||
## [1.1.0] - 2018-09-26
|
||||
|
||||
### Added
|
||||
|
||||
- Add go tool pprof import support [[#165](https://github.com/jlfwong/speedscope/pull/165)]
|
||||
|
||||
## [1.0.4] - 2018-09-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix import from Chrome < 69 when there are multiple profiles [[#161](https://github.com/jlfwong/speedscope/pull/161)]
|
||||
|
||||
## [1.0.3] - 2018-09-10
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix import for Chrome 69, support leading idle time before first call [[#160](https://github.com/jlfwong/speedscope/pull/160)]
|
||||
|
||||
## [1.0.2] - 2018-09-04
|
||||
|
||||
### Fixed
|
||||
|
||||
- Allow optional CR before LF when probing collapsed stacks files [[#154](https://github.com/jlfwong/speedscope/pull/154)]
|
||||
- Fix import for Firefox 63 [[#156](https://github.com/jlfwong/speedscope/pull/156)]
|
||||
- Change time formatting for minutes from 1.50min to 1:30 [[#153](https://github.com/jlfwong/speedscope/pull/153)] (by [@Alex](https://github.com/Alex)-Diez)
|
||||
|
||||
## [1.0.1] - 2018-08-23
|
||||
|
||||
- Fixed an issue where flamegraph bounds were not always being cleared correctly, leading to visual artifacts [[#150](https://github.com/jlfwong/speedscope/pull/150)]
|
||||
|
||||
## [1.0.0] - 2018-08-23
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed rendering issues when switching between screens w/ different `devicePixelRatios` [[#147](https://github.com/jlfwong/speedscope/pull/147)]
|
||||
|
||||
## [0.7.1] - 2018-08-20
|
||||
|
||||
### Fixed
|
||||
|
||||
- Removed dependency on regl in order to allow speedscope to run in strict content-security-policy environments [[#140](https://github.com/jlfwong/speedscope/pull/140)]
|
||||
- Fixed text culling bug [[#143](https://github.com/jlfwong/speedscope/pull/143)]
|
||||
|
||||
## [0.7.0] - 2018-08-16
|
||||
|
||||
### Added
|
||||
|
||||
- Added support to import from linux `perf script` [[#135](https://github.com/jlfwong/speedscope/pull/135)]
|
||||
|
||||
## [0.6.0] - 2018-08-14
|
||||
|
||||
### Added
|
||||
|
||||
- Added support for multiple threads/processes [[#130](https://github.com/jlfwong/speedscope/pull/130)]
|
||||
- Import all runs & threads from Instruments .trace files instead of just main thread from selected run [[#130](https://github.com/jlfwong/speedscope/pull/130)]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Ensure the JSON schema has actual contents [[#133](https://github.com/jlfwong/speedscope/pull/133)]
|
||||
|
||||
## [0.5.1] - 2018-08-09
|
||||
|
||||
### Fixed
|
||||
|
||||
* Fixed broken CLI
|
||||
- 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]
|
||||
- Fix emscripten remapping when symbols contain dashes, like `527:i32s-div` [[#129](https://github.com/jlfwong/speedscope/pull/129)]
|
||||
- Improved firefox import speed and fixed bugs in it [[#128](https://github.com/jlfwong/speedscope/pull/128)]
|
||||
- Prevent non-contiguous blocks in the time ordered flamechart from appearing as a single node for selection [[#123](https://github.com/jlfwong/speedscope/pull/123)]
|
||||
- Prevent dragging from changing selection [[#122](https://github.com/jlfwong/speedscope/pull/122)]
|
||||
- Clamp zoom to prevent floating point issues [[#121](https://github.com/jlfwong/speedscope/pull/121)]
|
||||
- Preserve view state when switching tabs [[#100](https://github.com/jlfwong/speedscope/pull/100)]
|
||||
|
||||
## [0.4.0] - 2018-07-21
|
||||
|
||||
### Added
|
||||
|
||||
* Support for importing v8 logs from node [#98]
|
||||
* Optionally read from stdin via cli [#99]
|
||||
- Support for importing v8 logs from node [[#98](https://github.com/jlfwong/speedscope/pull/98)]
|
||||
- Optionally read from stdin via cli [[#99](https://github.com/jlfwong/speedscope/pull/99)]
|
||||
|
||||
## [0.3.0] - 2018-07-18
|
||||
|
||||
### Added
|
||||
|
||||
* Support for remapping profiles using a wasm symbol file [#93]
|
||||
- Support for remapping profiles using a wasm symbol file [[#93](https://github.com/jlfwong/speedscope/pull/93)]
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
# Contributor Covenant Code of Conduct:
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project
|
||||
and our community a harassment-free experience for everyone, regardless of
|
||||
age, body size, disability, ethnicity, gender identity and expression, level
|
||||
of experience, nationality, personal appearance, race, religion, or sexual
|
||||
identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of
|
||||
acceptable behavior and are expected to take appropriate and fair corrective
|
||||
action in response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an
|
||||
appointed representative at an online or offline event. Representation of a
|
||||
project may be further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting
|
||||
[jamie.lf.wong@gmail.com](mailto:jamie.lf.wong@gmail.com). All complaints
|
||||
will be reviewed and investigated and will result in a response that is
|
||||
deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an
|
||||
incident. Further details of specific enforcement policies may be posted
|
||||
separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor-Covenant][homepage],
|
||||
version 1.4, available at
|
||||
[https://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: https://contributor-covenant.org
|
||||
[version]: https://contributor-covenant.org/version/1/4/
|
||||
@@ -0,0 +1,70 @@
|
||||
# Contributing to speedscope
|
||||
|
||||
Hi! This is a short guide & set of guidelines for contributing to speedscope.
|
||||
Contributors of all skill levels are welcome to submit pull requests.
|
||||
|
||||
This project adheres to the Contributor Covenant [code of conduct](./CODE_OF_CONDUCT.md).
|
||||
All contributors are expected to uphold this code of conduct.
|
||||
|
||||
## Setting up for development
|
||||
|
||||
To start running speedscope locally, run the following:
|
||||
|
||||
git clone https://github.com/jlfwong/speedscope.git
|
||||
cd speedscope
|
||||
npm install
|
||||
npm run serve
|
||||
|
||||
This should open up a running version of speedscope in your default browser.
|
||||
|
||||
In your terminal, you should see something like this:
|
||||
|
||||
$ npm run serve
|
||||
> speedscope@0.7.1 serve /Users/jlfwong/code/speedscope
|
||||
> parcel assets/index.html --open --no-autoinstall
|
||||
|
||||
Server running at http://localhost:1234
|
||||
✨ Built in 7.30s.
|
||||
|
||||
Most of speedscope is written in TypeScript. If you're unfamiliar with
|
||||
TypeScript, then you can either just try to learn it as you go, then the
|
||||
[official TypeScript
|
||||
documentation](https://www.typescriptlang.org/docs/home.html) may be of use
|
||||
to you!
|
||||
|
||||
If you're not sure where the code you want to modify lives, the [`README.md`
|
||||
in the `src/` directory](./src/README.md) might be helpful.
|
||||
|
||||
## Code formatting
|
||||
|
||||
All TypeScript code in speedscope is automatically formatted with
|
||||
[Prettier](https://prettier.io/). This means that while you're writing your code,
|
||||
you don't have to worry about following a formatting guide, because a program will
|
||||
format your code for you!
|
||||
|
||||
The easiest way to use Prettier is via an editor integration. See the [Editor
|
||||
Integration](https://prettier.io/docs/en/editors.html) page from Prettier's
|
||||
documentation for help with that.
|
||||
|
||||
If you don't want to do that, you can alternatively run the autoformatter by
|
||||
running `npm run prettier`.
|
||||
|
||||
## Running tests
|
||||
|
||||
All TypeScript tests are written use [Jest](https://jestjs.io/). To run the
|
||||
tests, run `npm run jest`.
|
||||
|
||||
## Contributing new features
|
||||
|
||||
Before contributing code to implement a new feature, please open an issue to
|
||||
discuss it first. Large pull requests that are submitted without first getting
|
||||
maintainer buy-in are unlikely to be reviewed or merged.
|
||||
|
||||
For features that will cause a visual change, please include visual mockups of
|
||||
the change you're planning on making.
|
||||
|
||||
## Contributing bug fixes
|
||||
|
||||
If you discover a bug, please file an issue. If the code change required to
|
||||
fix it is small (< ~20 lines), then feel free to just open a PR to fix the
|
||||
issue without trying to get buy-in ahead of time.
|
||||
@@ -0,0 +1,93 @@
|
||||
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
|
||||
5. Upload a release to GitHub
|
||||
|
||||
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 && git push --tags`
|
||||
|
||||
## 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
|
||||
|
||||
This step must follow the "Publish to npm" step, since it uses assets from
|
||||
the npm publish.
|
||||
|
||||
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 populate a directory with assets pulled from npm, 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.
|
||||
|
||||
## Upload a release to GitHub
|
||||
|
||||
This step must follow the "Publish to npm" step, since it uses assets from
|
||||
the npm publish.
|
||||
|
||||
To make a zipfile suitable for uploading to GitHub as a release, run `scripts/prepare-zip-file.sh`.
|
||||
|
||||
Once that's done, you should have a zip file in `dist/release/`
|
||||
|
||||
Upload that file along with changelog notes to https://github.com/jlfwong/speedscope/releases/new
|
||||
@@ -1,6 +1,6 @@
|
||||
# 🔬speedscope
|
||||
|
||||
A fast, interactive web-based viewer for [sampling profiles][0]. An alternative viewer for [FlameGraphs][1]. Will happily display multi-megabyte profiles without crashing your browser.
|
||||
A fast, interactive web-based viewer for performance profiles. An alternative viewer for [FlameGraphs][1]. Will happily display multi-megabyte profiles without crashing your browser.
|
||||
|
||||
Given raw profiling data, speedscope allows you to interactively explore the data to get insight into what's slow in your application, or allocating all the memory, or whatever data is represented in the profiling data.
|
||||
|
||||
@@ -13,6 +13,8 @@ Given raw profiling data, speedscope allows you to interactively explore the dat
|
||||
|
||||
Visit https://www.speedscope.app, then either browse to find a profile file or drag-and-drop one onto the page. The profiles are not uploaded anywhere -- the application is totally in-browser.
|
||||
|
||||
## Command line usage
|
||||
|
||||
For offline use, or convenience in the terminal, you can also install speedscope
|
||||
via npm:
|
||||
|
||||
@@ -20,46 +22,40 @@ via npm:
|
||||
|
||||
Invoking `speedscope /path/to/profile` will load speedscope in your default browser.
|
||||
|
||||
## Self-contained directory
|
||||
|
||||
If you don't have npm or node installed, you can also download a
|
||||
self-contained version from https://github.com/jlfwong/speedscope/releases.
|
||||
After you download the zip file from a release, simply unzip it and open the
|
||||
contained `index.html` in Chrome or Firefox.
|
||||
|
||||
## Supported file formats
|
||||
|
||||
### Chrome
|
||||
speedscope is designed to ingest profiles from a variety of different profilers for different programming languages & environments. Click the links below for documentation on how to import from a specific source.
|
||||
|
||||
Both the timeline format output by Chrome developers tools (https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/reference#save) and the `.cpuprofile` format output are supported. The `.cpuprofile` format is useful for viewing flamecharts generated by Node.js applications:
|
||||
https://medium.com/@paul_irish/debugging-node-js-nightlies-with-chrome-devtools-7c4a1b95ae27
|
||||
- JavaScript
|
||||
- [Importing from Chrome](https://github.com/jlfwong/speedscope/wiki/Importing-from-Chrome)
|
||||
- [Importing from Firefox](https://github.com/jlfwong/speedscope/wiki/Importing-from-Firefox)
|
||||
- [Importing from Node.js](https://github.com/jlfwong/speedscope/wiki/Importing-from-Node.js)
|
||||
- Ruby
|
||||
- [Importing from stackprof](https://github.com/jlfwong/speedscope/wiki/Importing-from-stackprof-(ruby))
|
||||
- [Importing from rbspy](https://github.com/jlfwong/speedscope/wiki/Importing-from-rbspy-(ruby))
|
||||
- [Importing from ruby-prof](https://github.com/jlfwong/speedscope/wiki/Importing-from-ruby-prof)
|
||||
- Python
|
||||
- [Importing from py-spy](https://github.com/jlfwong/speedscope/wiki/Importing-from-py-spy-(python))
|
||||
- [pyspeedscope](https://github.com/windelbouwman/pyspeedscope)
|
||||
- Go
|
||||
- [Importing from pprof](https://github.com/jlfwong/speedscope/wiki/Importing-from-pprof-(go))
|
||||
- Rust
|
||||
- [flamescope](https://github.com/coolreader18/flamescope)
|
||||
- Native code
|
||||
- [Importing from Instruments.app](https://github.com/jlfwong/speedscope/wiki/Importing-from-Instruments.app) (macOS)
|
||||
- [Importing from `perf`](https://github.com/jlfwong/speedscope/wiki/Importing-from-perf-(linux)) (linux)
|
||||
- [Importing from .NET Core](https://github.com/jlfwong/speedscope/wiki/Importing-from-.NET-Core)
|
||||
- [Importing from GHC (Haskell)](https://github.com/jlfwong/speedscope/wiki/Importing-from-Haskell)
|
||||
- [Importing from custom sources](https://github.com/jlfwong/speedscope/wiki/Importing-from-custom-sources)
|
||||
|
||||
### Firefox
|
||||
|
||||
The `profile.json` file format output by Firefox can be saved and import into speedscope: https://developer.mozilla.org/en-US/docs/Tools/Performance
|
||||
|
||||
### Node
|
||||
|
||||
If you record profiling information like so:
|
||||
|
||||
node --prof /path/to/my/script.js
|
||||
|
||||
Then this will generate one or more `isolate*.log` files. You can open
|
||||
the resulting profile in speedscope by running the following command:
|
||||
|
||||
node --prof-process --preprocess -j isolate*.log | speedscope -
|
||||
|
||||
### Instruments.app
|
||||
|
||||
You can import call trees from OSX Instruments.app into speedscope by
|
||||
selecting a row in the "Profile" view and select "Edit -> Deep Copy" from the
|
||||
menu then pasting directly into speedscope. This data contains only aggregate
|
||||
statistics, so the "Time Order" view and the "Left Heavy" view will look very
|
||||
similar.
|
||||
|
||||
You can also import `.trace` files for time profiles by dragging them directly
|
||||
into the browser from Chrome.
|
||||
|
||||
### `stackprof` Ruby profiler
|
||||
|
||||
If the `raw: true` flag is set when recording a dump, the resulting json dump can be imported into speedscope.
|
||||
|
||||
### `perf` and `DTrace`
|
||||
|
||||
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.
|
||||
Contributions to add support for additional formats are welcome! See issues with the ["import source" tag](https://github.com/jlfwong/speedscope/issues?q=is%3Aissue+is%3Aopen+label%3A%22import+source%22).
|
||||
|
||||
## Importing via URL
|
||||
|
||||
@@ -68,26 +64,25 @@ To load a specific profile by URL, you can append a hash fragment like `#profile
|
||||
## Views
|
||||
|
||||
### 🕰Time Order
|
||||
|
||||
In the "Time Order" view (the default), the stacks are ordered left-to-right in the same order as the occurred in the input file, which is usually going to be the chronological order they were recorded in. This view is most helpful for understand the behavior of an application over time, e.g. "first the data is fetched from the database, then the data is prepared for serialization, then the data is serialized to JSON". This is the only flame graph order supported by Chrome developer tools.
|
||||
|
||||
In all flamegraph views, the horizontal axis represents the "weight" of each stack (most commonly CPU time), and the vertical axis shows you the stack active at the time of the sample.
|
||||
|
||||
If you click on one of the frames, you'll be able to see summary statistics about it.
|
||||
|
||||

|
||||
|
||||
In the "Time Order" view (the default), call stacks are ordered left-to-right in the same order as they occurred in the input file, which is usually going to be the chronological order they were recorded in. This view is most helpful for understanding the behavior of an application over time, e.g. "first the data is fetched from the database, then the data is prepared for serialization, then the data is serialized to JSON".
|
||||
|
||||
The horizontal axis represents the "weight" of each stack (most commonly CPU time), and the vertical axis shows you the stack active at the time of the sample. If you click on one of the frames, you'll be able to see summary statistics about it.
|
||||
|
||||
|
||||
### ⬅️Left Heavy
|
||||

|
||||
|
||||
In the "Left Heavy" view, identical stacks are grouped together, regardless of whether they were recorded sequentially. Then, the stacks are sorted so that the heaviest stack for each parent is on the left -- hence "left heavy". This view is useful for understanding where all the time is going in situations where there are hundreds or thousands of function calls interleaved between other call stacks.
|
||||
|
||||
### 🥪 Sandwich
|
||||

|
||||
|
||||
The Sandwich view is a table view in which you can find a list of all functions an their associated times. You can sort by self time or total time.
|
||||
It's called "Sandwich" view because if you select one of the rows in the table, you can see flamegraphs for all the callers and callees of the selected
|
||||
row.
|
||||
|
||||

|
||||
|
||||
## Navigation
|
||||
|
||||
@@ -118,3 +113,10 @@ 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
|
||||
* `t`: Open the profile/thread selector if available
|
||||
|
||||
## Contributing
|
||||
|
||||
Do you want to contribute to speedscope? Sweeeeet. Check out [CONTRIBUTING.md](./CONTRIBUTING.md) for instructions on setting up your dev environment.
|
||||
|
||||
Generated
+6349
-8048
File diff suppressed because it is too large
Load Diff
+45
-20
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "0.5.1",
|
||||
"version": "1.8.0",
|
||||
"description": "",
|
||||
"repository": "jlfwong/speedscope",
|
||||
"main": "index.js",
|
||||
@@ -12,49 +12,74 @@
|
||||
"prepack": "./scripts/build-release.sh",
|
||||
"prettier": "prettier --write 'src/**/*.ts' 'src/**/*.tsx'",
|
||||
"lint": "eslint 'src/**/*.ts' 'src/**/*.tsx'",
|
||||
"jest": "./scripts/test-setup.sh && jest",
|
||||
"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",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "./scripts/ci.sh",
|
||||
"serve": "parcel assets/index.html --open --no-autoinstall"
|
||||
},
|
||||
"files": ["bin/cli.js", "dist/release/**", "!*.map"],
|
||||
"browserslist": ["last 2 Chrome versions", "last 2 Firefox versions"],
|
||||
"files": [
|
||||
"bin/cli.js",
|
||||
"dist/release/**",
|
||||
"!*.map"
|
||||
],
|
||||
"browserslist": [
|
||||
"last 2 Chrome versions",
|
||||
"last 2 Firefox versions"
|
||||
],
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/jest": "22.2.3",
|
||||
"@types/jszip": "3.1.4",
|
||||
"@types/node": "10.1.4",
|
||||
"@types/node": "14.0.1",
|
||||
"@types/pako": "1.0.0",
|
||||
"@typescript-eslint/eslint-plugin": "2.33.0",
|
||||
"@typescript-eslint/parser": "2.33.0",
|
||||
"acorn": "7.2.0",
|
||||
"aphrodite": "2.1.0",
|
||||
"coveralls": "3.0.1",
|
||||
"eslint": "4.19.1",
|
||||
"eslint": "6.0.0",
|
||||
"eslint-plugin-prettier": "2.6.0",
|
||||
"jest": "23.0.1",
|
||||
"eslint-plugin-react-hooks": "4.0.2",
|
||||
"jest": "24.3.0",
|
||||
"jsverify": "0.8.3",
|
||||
"jszip": "3.1.5",
|
||||
"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": "3.0.1",
|
||||
"parcel-bundler": "1.12.4",
|
||||
"preact": "10.4.1",
|
||||
"prettier": "2.0.4",
|
||||
"protobufjs": "6.8.8",
|
||||
"react-redux": "^7.2.0",
|
||||
"redux": "^4.0.5",
|
||||
"ts-jest": "24.3.0",
|
||||
"typescript": "3.9.2",
|
||||
"typescript-eslint-parser": "17.0.1",
|
||||
"typescript-json-schema": "0.42.0",
|
||||
"uglify-es": "3.2.2"
|
||||
},
|
||||
"jest": {
|
||||
"transform": {
|
||||
"^.+\\.tsx?$": "ts-jest"
|
||||
},
|
||||
"setupFilesAfterEnv": [
|
||||
"./src/jest-setup.js"
|
||||
],
|
||||
"testRegex": "\\.test\\.tsx?$",
|
||||
"collectCoverageFrom": ["**/*.{ts,tsx}", "!**/*.d.{ts,tsx}"],
|
||||
"moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json"]
|
||||
"collectCoverageFrom": [
|
||||
"**/*.{ts,tsx}",
|
||||
"!**/*.d.{ts,tsx}"
|
||||
],
|
||||
"moduleFileExtensions": [
|
||||
"ts",
|
||||
"tsx",
|
||||
"js",
|
||||
"jsx",
|
||||
"json"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"opn": "5.3.0"
|
||||
"opn": "5.3.0",
|
||||
"react": "^16.13.1"
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -4,4 +4,5 @@ module.exports = {
|
||||
semi: false,
|
||||
singleQuote: true,
|
||||
trailingComma: 'all',
|
||||
};
|
||||
arrowParens: 'avoid'
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Vendored
BIN
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
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
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"head":{"functionName":"(root)","url":"","lineNumber":-1,"bailoutReason":"","id":1,"scriptId":0,"hitCount":0,"children":[{"functionName":"","url":"","lineNumber":0,"callUID":1,"bailoutReason":"","id":2,"scriptId":0,"hitCount":0,"children":[{"functionName":"a","url":"","lineNumber":0,"callUID":2,"bailoutReason":"","id":3,"scriptId":0,"hitCount":0,"children":[{"functionName":"b","url":"","lineNumber":5,"callUID":3,"bailoutReason":"","id":4,"scriptId":0,"hitCount":0,"children":[{"functionName":"d","url":"","lineNumber":13,"callUID":4,"bailoutReason":"","id":5,"scriptId":0,"hitCount":14,"children":[]}]},{"functionName":"c","url":"","lineNumber":9,"callUID":3,"bailoutReason":"","id":6,"scriptId":0,"hitCount":0,"children":[{"functionName":"d","url":"","lineNumber":13,"callUID":6,"bailoutReason":"","id":7,"scriptId":0,"hitCount":14,"children":[]}]}]}]}]},"startTime":163140,"endTime":163140,"samples":[2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7],"timestamps":[163140599286,163140610861,163140611921,163140612966,163140614236,163140615507,163140616694,163140617968,163140619238,163140620258,163140621507,163140622765,163140624037,163140625303,163140626378,163140627649,163140628923,163140630191,163140631457,163140632746,163140634032,163140635304,163140636440,163140637716,163140638990,163140640255,163140641520,163140642791,163140644063,163140645206]}
|
||||
Binary file not shown.
@@ -1 +1,81 @@
|
||||
{"version":"0.0.1","$schema":"https://www.speedscope.app/file-format-schema.json","shared":{"frames":[{"name":"a"},{"name":"b"},{"name":"c"},{"name":"d"}]},"profiles":[{"type":"evented","name":"simple.txt","unit":"none","startValue":0,"endValue":14,"events":[{"type":"O","frame":0,"at":0},{"type":"O","frame":1,"at":0},{"type":"O","frame":2,"at":0},{"type":"C","frame":2,"at":2},{"type":"O","frame":3,"at":2},{"type":"C","frame":3,"at":6},{"type":"O","frame":2,"at":6},{"type":"C","frame":2,"at":9},{"type":"C","frame":1,"at":14},{"type":"C","frame":0,"at":14}]}]}
|
||||
{
|
||||
"$schema": "https://www.speedscope.app/file-format-schema.json",
|
||||
"profiles": [
|
||||
{
|
||||
"endValue": 14,
|
||||
"events": [
|
||||
{
|
||||
"at": 0,
|
||||
"frame": 0,
|
||||
"type": "O"
|
||||
},
|
||||
{
|
||||
"at": 0,
|
||||
"frame": 1,
|
||||
"type": "O"
|
||||
},
|
||||
{
|
||||
"at": 0,
|
||||
"frame": 2,
|
||||
"type": "O"
|
||||
},
|
||||
{
|
||||
"at": 2,
|
||||
"frame": 2,
|
||||
"type": "C"
|
||||
},
|
||||
{
|
||||
"at": 2,
|
||||
"frame": 3,
|
||||
"type": "O"
|
||||
},
|
||||
{
|
||||
"at": 6,
|
||||
"frame": 3,
|
||||
"type": "C"
|
||||
},
|
||||
{
|
||||
"at": 6,
|
||||
"frame": 2,
|
||||
"type": "O"
|
||||
},
|
||||
{
|
||||
"at": 9,
|
||||
"frame": 2,
|
||||
"type": "C"
|
||||
},
|
||||
{
|
||||
"at": 14,
|
||||
"frame": 1,
|
||||
"type": "C"
|
||||
},
|
||||
{
|
||||
"at": 14,
|
||||
"frame": 0,
|
||||
"type": "C"
|
||||
}
|
||||
],
|
||||
"name": "simple.txt",
|
||||
"startValue": 0,
|
||||
"type": "evented",
|
||||
"unit": "none"
|
||||
}
|
||||
],
|
||||
"shared": {
|
||||
"frames": [
|
||||
{
|
||||
"name": "a"
|
||||
},
|
||||
{
|
||||
"name": "b"
|
||||
},
|
||||
{
|
||||
"name": "c"
|
||||
},
|
||||
{
|
||||
"name": "d"
|
||||
}
|
||||
]
|
||||
},
|
||||
"version": "0.0.1"
|
||||
}
|
||||
|
||||
@@ -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"}]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"$schema": "https://www.speedscope.app/file-format-schema.json",
|
||||
"shared": {
|
||||
"frames": [{"name": "A"}]
|
||||
},
|
||||
"profiles": [
|
||||
{
|
||||
"type": "evented",
|
||||
"name": "p1",
|
||||
"unit": "none",
|
||||
"startValue": 0,
|
||||
"endValue": 100,
|
||||
"events": [{"type": "O", "frame": 0, "at": 0}]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"$schema": "https://www.speedscope.app/file-format-schema.json",
|
||||
"shared": {
|
||||
"frames": [{"name": "A"}, {"name": "B"}]
|
||||
},
|
||||
"profiles": [
|
||||
{
|
||||
"type": "evented",
|
||||
"name": "p1",
|
||||
"unit": "none",
|
||||
"startValue": 0,
|
||||
"endValue": 100,
|
||||
"events": [
|
||||
{"type": "O", "frame": 0, "at": 0},
|
||||
{"type": "C", "frame": 0, "at": 1},
|
||||
{"type": "O", "frame": 1, "at": 2},
|
||||
{"type": "O", "frame": 0, "at": 2},
|
||||
{"type": "O", "frame": 0, "at": 3},
|
||||
{"type": "C", "frame": 0, "at": 4},
|
||||
{"type": "C", "frame": 1, "at": 4},
|
||||
{"type": "C", "frame": 0, "at": 5}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
a;b;c 1
|
||||
a;b;c 1
|
||||
a;b;d 4
|
||||
a;b;c 3
|
||||
a;b 5
|
||||
@@ -0,0 +1,22 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "M", "name": "process_name", "args": {"name": "p0"}},
|
||||
{"pid": 0, "tid": 0, "ph": "M", "name": "thread_name", "args": {"name": "p0t0"}},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "alpha", "ts": 0, "dur": 1},
|
||||
{"pid": 0, "tid": 1, "ph": "M", "name": "thread_name", "args": {"name": "p0t1"}},
|
||||
{"pid": 0, "tid": 1, "ph": "X", "name": "beta", "ts": 0, "dur": 1},
|
||||
|
||||
{"pid": 1, "tid": 0, "ph": "M", "name": "process_name", "args": {"name": "p1"}},
|
||||
{"pid": 1, "tid": 0, "ph": "M", "name": "thread_name", "args": {"name": "p1t0"}},
|
||||
{"pid": 1, "tid": 0, "ph": "X", "name": "gamma", "ts": 0, "dur": 1},
|
||||
{"pid": 1, "tid": 1, "ph": "M", "name": "thread_name", "args": {"name": "p1t1"}},
|
||||
{"pid": 1, "tid": 1, "ph": "X", "name": "delta", "ts": 0, "dur": 1},
|
||||
|
||||
{"pid": 2, "tid": 0, "ph": "M", "name": "thread_name", "args": {"name": "p2t0"}},
|
||||
{"pid": 2, "tid": 0, "ph": "X", "name": "epsilon", "ts": 0, "dur": 1},
|
||||
{"pid": 2, "tid": 1, "ph": "M", "name": "thread_name", "args": {"name": "p2t1"}},
|
||||
{"pid": 2, "tid": 1, "ph": "X", "name": "phi", "ts": 0, "dur": 1},
|
||||
|
||||
{"pid": 3, "tid": 0, "ph": "M", "name": "process_name", "args": {"name": "p3"}},
|
||||
{"pid": 3, "tid": 0, "ph": "X", "name": "zeta", "ts": 0, "dur": 1},
|
||||
{"pid": 3, "tid": 1, "ph": "X", "name": "eta", "ts": 0, "dur": 1}
|
||||
]
|
||||
@@ -0,0 +1,16 @@
|
||||
[
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "A", "ts": 0},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "B", "ts": 0},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "C", "ts": 0},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "C", "ts": 1},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "B", "ts": 2},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "A", "ts": 3},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "A", "ts": 4},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "B", "ts": 5},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "C", "ts": 6},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "C", "ts": 7},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "B", "ts": 7},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "A", "ts": 7},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "X", "ts": 7},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "X", "ts": 10}
|
||||
]
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"traceEvents": [
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "beta", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "ts": 7, "tdur": 4},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 13},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 14}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "beta", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "gamma", "ts": 2, "dur": 5, "args": {"detail": "foobar"}},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "epsilon", "ts": 7, "tdur": 4},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 13},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 14},
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "beta", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "gamma", "ts": 2, "dur": 5, "args": {"detail": "foobar"}},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "epsilon", "ts": 7, "tdur": 4},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 13},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 14},
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "beta", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "gamma", "ts": 2, "dur": 5, "args": {"detail": "foobar"}},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "epsilon", "ts": 7, "tdur": 4},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 13},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 14}
|
||||
@@ -0,0 +1,8 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "beta", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "gamma", "ts": 2, "dur": 5, "args": {"detail": "foobar"}},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "epsilon", "ts": 7, "tdur": 4},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 13},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 14}
|
||||
]
|
||||
@@ -0,0 +1,8 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "beta", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 13},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 14},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "gamma", "ts": 5},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "delta", "ts": 5}
|
||||
]
|
||||
@@ -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,2 @@
|
||||
simple
|
||||
server
|
||||
@@ -0,0 +1,15 @@
|
||||
.PHONY: all clean linux-perf
|
||||
|
||||
all: simple server
|
||||
|
||||
clean:
|
||||
rm -f simple server
|
||||
|
||||
simple: simple.go
|
||||
go build $<
|
||||
|
||||
server: server.go
|
||||
go build $<
|
||||
|
||||
simple.prof: simple
|
||||
./$< -cpuprofile=$@
|
||||
@@ -0,0 +1,71 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
import _ "net/http/pprof"
|
||||
|
||||
// See https://golang.org/pkg/net/http/pprof/ for details
|
||||
|
||||
func alpha() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
}
|
||||
|
||||
func beta() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
}
|
||||
|
||||
func delta() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
alpha()
|
||||
beta()
|
||||
}
|
||||
|
||||
func gamma() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func main() {
|
||||
// we need a webserver to get the pprof webserver
|
||||
go func() {
|
||||
log.Println(http.ListenAndServe("localhost:6060", nil))
|
||||
}()
|
||||
fmt.Println("hello world")
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(1)
|
||||
go leakyFunction(wg)
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func leakyFunction(wg sync.WaitGroup) {
|
||||
defer wg.Done()
|
||||
s := make([]string, 3)
|
||||
for i:= 0; i < 10000000; i++{
|
||||
alpha()
|
||||
beta()
|
||||
delta()
|
||||
gamma()
|
||||
s = append(s, "magical pandas")
|
||||
if (i % 100000) == 0 {
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package main
|
||||
|
||||
import "flag"
|
||||
import "runtime/pprof"
|
||||
import "os"
|
||||
|
||||
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
|
||||
|
||||
func alpha() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
}
|
||||
|
||||
func beta() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
}
|
||||
|
||||
func delta() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
alpha()
|
||||
beta()
|
||||
}
|
||||
|
||||
func gamma() {
|
||||
z := 3
|
||||
for i := 0; i < 100000; i++ {
|
||||
z *= 3
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
if *cpuprofile != "" {
|
||||
f, _ := os.Create(*cpuprofile)
|
||||
pprof.StartCPUProfile(f)
|
||||
defer pprof.StopCPUProfile()
|
||||
}
|
||||
|
||||
for i := 0; i < 10000; i++ {
|
||||
alpha()
|
||||
beta()
|
||||
delta()
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* This script is used to reconstruct an cpu profile from chrome with an old format
|
||||
* still used in nodejs with v8-profiler
|
||||
*/
|
||||
const fs = require('fs')
|
||||
|
||||
const data = JSON.parse(fs.readFileSync('../../profiles/Chrome/65/simple.cpuprofile').toString())
|
||||
|
||||
const _convertTimeDeltas = (profile) => {
|
||||
if (!profile.timeDeltas) return null
|
||||
let lastTimeUsec = profile.startTime
|
||||
const timestamps = new Array(profile.timeDeltas.length + 1)
|
||||
for (let i = 0; i < profile.timeDeltas.length; ++i) {
|
||||
timestamps[i] = lastTimeUsec
|
||||
lastTimeUsec += profile.timeDeltas[i]
|
||||
}
|
||||
timestamps[profile.timeDeltas.length] = lastTimeUsec
|
||||
return timestamps
|
||||
}
|
||||
|
||||
const reformatNode = node => {
|
||||
if (!node.children) node.children = []
|
||||
|
||||
node.children = node.children.map(childID => {
|
||||
if (typeof childID !== 'number') return childID
|
||||
const childNode = data.nodes.find(node => node.id === childID)
|
||||
if (typeof childNode !== 'object') return null
|
||||
childNode.callUID = node.id
|
||||
return childNode
|
||||
})
|
||||
return {
|
||||
functionName: node.callFrame.functionName,
|
||||
url: node.callFrame.url,
|
||||
lineNumber: node.callFrame.lineNumber,
|
||||
callUID: node.callUID,
|
||||
bailoutReason: '',
|
||||
id: node.id,
|
||||
scriptId: 0,
|
||||
hitCount: node.hitCount,
|
||||
children: node.children.map(reformatNode)
|
||||
}
|
||||
}
|
||||
|
||||
// reformat then only keep the root as top level node
|
||||
const nodes = data.nodes
|
||||
.map(reformatNode)
|
||||
.filter(node => node.functionName === '(root)')[0]
|
||||
|
||||
// since it can be undefined, create an array so execution still works
|
||||
if (!data.timeDeltas) {
|
||||
data.timeDeltas = []
|
||||
}
|
||||
|
||||
fs.writeFileSync('./new.cpuprofile', JSON.stringify({
|
||||
head: nodes,
|
||||
startTime: Math.floor(data.startTime / 1000000),
|
||||
endTime: Math.floor(data.endTime / 1000000),
|
||||
samples: data.samples,
|
||||
timestamps: _convertTimeDeltas(data)
|
||||
}))
|
||||
@@ -25,8 +25,4 @@ function gamma() {
|
||||
return prod
|
||||
}
|
||||
|
||||
console.profile('simple')
|
||||
alpha()
|
||||
setTimeout(() => {
|
||||
console.profileEnd('simple')
|
||||
}, 0)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
<script>
|
||||
function banana() {
|
||||
let prod = 1
|
||||
for (let i = 1; i < 1000; i++) {
|
||||
prod *= i
|
||||
}
|
||||
return prod
|
||||
}
|
||||
|
||||
function apple() {
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
banana()
|
||||
}
|
||||
}
|
||||
|
||||
let bounces = 0
|
||||
|
||||
const worker = new Worker('./worker.js')
|
||||
|
||||
worker.onmessage = function() {
|
||||
apple()
|
||||
if (bounces++ < 10) {
|
||||
worker.postMessage('ping')
|
||||
}
|
||||
}
|
||||
|
||||
worker.postMessage('ping')
|
||||
</script>
|
||||
@@ -0,0 +1,18 @@
|
||||
function gamma() {
|
||||
let prod = 1
|
||||
for (let i = 1; i < 1000; i++) {
|
||||
prod *= i
|
||||
}
|
||||
return prod
|
||||
}
|
||||
|
||||
function alpha() {
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
|
||||
onmessage = function(e) {
|
||||
alpha()
|
||||
postMessage('pong')
|
||||
}
|
||||
@@ -1,18 +1,22 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Fail on first error
|
||||
set -e
|
||||
set -euxo pipefail
|
||||
|
||||
OUTDIR=`pwd`/dist/release
|
||||
|
||||
# Typecheck
|
||||
node_modules/.bin/tsc --noEmit
|
||||
|
||||
# Run unit tests
|
||||
npm run jest
|
||||
|
||||
# Clean out the release directory
|
||||
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
|
||||
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
npm run typecheck
|
||||
npm run lint
|
||||
npm run coverage
|
||||
node scripts/generate-file-format-schema-json.js > /dev/null
|
||||
+20
-14
@@ -1,27 +1,28 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# type check, do a release build, then do a shallow clone of the
|
||||
# repository into a temporary directory and copy the release build
|
||||
# artifacts into there to commit & push to the gh-pages branch
|
||||
# Do a shallow clone of the repository into a temporary directory and copy the
|
||||
# artifacts pulled from npm into the shallow clone to commit & push to the
|
||||
# gh-pages branch.
|
||||
|
||||
# Fail on first error
|
||||
set -e
|
||||
set -euxo pipefail
|
||||
|
||||
OUTDIR=`pwd`/dist/release
|
||||
echo $OUTDIR
|
||||
SRCDIR=`pwd`
|
||||
OUTDIR=`mktemp -d -t speedscope-unpacked`
|
||||
|
||||
./scripts/build-release.sh
|
||||
# Untar the package
|
||||
pushd "$OUTDIR"
|
||||
PACKEDNAME=`npm pack speedscope | tail -n1`
|
||||
tar -xvvf "$PACKEDNAME"
|
||||
|
||||
# Create a shallow clone of the repository
|
||||
TMPDIR=`mktemp -d -t speedscope-release`
|
||||
echo "Entering $TMPDIR"
|
||||
TMPDIR=`mktemp -d -t speedscope-deploy`
|
||||
pushd "$TMPDIR"
|
||||
git clone --depth 1 git@github.com:jlfwong/speedscope.git -b gh-pages
|
||||
|
||||
# Copy the build artifacts into the shallow clone
|
||||
pushd speedscope
|
||||
rm -rf *
|
||||
cp -R "$OUTDIR"/* .
|
||||
cp -R "$OUTDIR"/package/dist/release/** .
|
||||
|
||||
# Set the CNAME record
|
||||
echo www.speedscope.app > CNAME
|
||||
@@ -29,24 +30,28 @@ 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
|
||||
git commit -m 'Release'
|
||||
git commit -m "Deploy $PACKEDNAME"
|
||||
git push origin HEAD:gh-pages
|
||||
popd
|
||||
rm -rf "$TMPDIR"
|
||||
exit 0
|
||||
else
|
||||
set +x
|
||||
echo "Aborting release."
|
||||
popd
|
||||
set -x
|
||||
rm -rf "$TMPDIR"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Start a local server for verification of the build
|
||||
set +x
|
||||
echo
|
||||
echo
|
||||
echo "Build complete. Starting server on http://localhost:4444/"
|
||||
@@ -54,3 +59,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 ./src/lib/file-format-spec.ts',
|
||||
'node_modules/.bin/typescript-json-schema ./src/lib/file-format-spec.ts --titles --required --topRef "*"',
|
||||
{
|
||||
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
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Create a zip file containing a standalone copy of speedscope
|
||||
# based on the contents of the package published to npm
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
SRCDIR=`pwd`
|
||||
TMPDIR=`mktemp -d -t speedscope-test-installation`
|
||||
|
||||
# Untar the package
|
||||
pushd "$TMPDIR"
|
||||
PACKEDNAME=`npm pack speedscope | tail -n1`
|
||||
tar -xvvf "$PACKEDNAME"
|
||||
|
||||
# Zip the parts we care about
|
||||
ZIPNAME=`basename $PACKEDNAME .tgz`.zip
|
||||
mkdir speedscope
|
||||
mv package/dist/release/** speedscope
|
||||
cp "$SRCDIR"/LICENSE speedscope
|
||||
echo "This is a self-contained release of https://github.com/jlfwong/speedscope." > speedscope/README
|
||||
echo "To use it, open index.html in Chrome or Firefox." >> speedscope/README
|
||||
|
||||
zip "$ZIPNAME" speedscope/**
|
||||
|
||||
# Switch back to the repository root
|
||||
popd
|
||||
mv "$TMPDIR"/"$ZIPNAME" dist/release/"$ZIPNAME"
|
||||
|
||||
# Clean up
|
||||
rm -rf "$TMPDIR"
|
||||
|
||||
set +x
|
||||
echo "Created dist/release/$ZIPNAME"
|
||||
@@ -0,0 +1,13 @@
|
||||
# Speedscope TypeScript source
|
||||
|
||||
This directory contains the bulk of speedscope's source code.
|
||||
|
||||
## Subdirectories
|
||||
|
||||
* `gl/`: WebGL code. This includes e.g. the code to render flamecharts.
|
||||
* `import/`: Code to import profiles from varous profilers into speedscope. This include e.g. the code to import Chrome performance profiles.
|
||||
* `lib/`: Mostly dependency-less utilities. This includes e.g. an LRU cache implementation, basic linear algebra classes,
|
||||
and the definition of speedscope's file format.
|
||||
* `store/`: Speedscope's application state management. Implemented using [`redux`](https://redux.js.org/).
|
||||
* `typings/`: [TypeScript definition files](https://basarat.gitbooks.io/typescript/docs/types/ambient/d.ts.html)
|
||||
* `views/`: View code to generate the HTML & CSS used to construct the UI. Implemented using [`preact`](https://preactjs.com/) and [`aphrodite`](https://github.com/Khan/aphrodite). Also contains code mapping from the `redux` store to views using [`preact-redux`](https://github.com/developit/preact-redux)
|
||||
+41
-156
@@ -1,105 +1,38 @@
|
||||
import regl from 'regl'
|
||||
import {
|
||||
RectangleBatchRenderer,
|
||||
RectangleBatch,
|
||||
RectangleBatchRendererProps,
|
||||
} from './rectangle-batch-renderer'
|
||||
import {
|
||||
ViewportRectangleRenderer,
|
||||
ViewportRectangleRendererProps,
|
||||
} from './overlay-rectangle-renderer'
|
||||
import {
|
||||
TextureCachedRenderer,
|
||||
TextureRenderer,
|
||||
TextureRendererProps,
|
||||
} from './texture-cached-renderer'
|
||||
import {StatsPanel} from '../lib/stats'
|
||||
|
||||
import {Vec2, Rect} from '../lib/math'
|
||||
import {
|
||||
FlamechartColorPassRenderer,
|
||||
FlamechartColorPassRenderProps,
|
||||
} from './flamechart-color-pass-renderer'
|
||||
import {Graphics, WebGL} from './graphics'
|
||||
import {RectangleBatchRenderer} from './rectangle-batch-renderer'
|
||||
import {TextureRenderer} from './texture-renderer'
|
||||
import {Rect, Vec2} from '../lib/math'
|
||||
import {ViewportRectangleRenderer} from './overlay-rectangle-renderer'
|
||||
import {FlamechartColorPassRenderer} from './flamechart-color-pass-renderer'
|
||||
|
||||
type FrameCallback = () => void
|
||||
|
||||
interface SetViewportScopeProps {
|
||||
physicalBounds: Rect
|
||||
}
|
||||
|
||||
export class CanvasContext {
|
||||
public gl: regl.Instance
|
||||
private rectangleBatchRenderer: RectangleBatchRenderer
|
||||
private viewportRectangleRenderer: ViewportRectangleRenderer
|
||||
private textureRenderer: TextureRenderer
|
||||
private flamechartColorPassRenderer: FlamechartColorPassRenderer
|
||||
private setViewportScope: regl.Command<{physicalBounds: Rect}>
|
||||
private setScissor: regl.Command<{}>
|
||||
public readonly gl: WebGL.Context
|
||||
public readonly rectangleBatchRenderer: RectangleBatchRenderer
|
||||
public readonly textureRenderer: TextureRenderer
|
||||
public readonly viewportRectangleRenderer: ViewportRectangleRenderer
|
||||
public readonly flamechartColorPassRenderer: FlamechartColorPassRenderer
|
||||
|
||||
constructor(canvas: HTMLCanvasElement) {
|
||||
this.gl = regl({
|
||||
canvas: canvas,
|
||||
attributes: {
|
||||
antialias: false,
|
||||
},
|
||||
extensions: ['ANGLE_instanced_arrays', 'WEBGL_depth_texture'],
|
||||
optionalExtensions: ['EXT_disjoint_timer_query'],
|
||||
profile: true,
|
||||
})
|
||||
|
||||
console.log(
|
||||
`WebGL initialized. renderer: ${this.gl.limits.renderer}, vendor: ${
|
||||
this.gl.limits.vendor
|
||||
}, version: ${this.gl.limits.version}`,
|
||||
)
|
||||
;(window as any)['CanvasContext'] = this
|
||||
|
||||
this.gl = new WebGL.Context(canvas)
|
||||
this.rectangleBatchRenderer = new RectangleBatchRenderer(this.gl)
|
||||
this.viewportRectangleRenderer = new ViewportRectangleRenderer(this.gl)
|
||||
this.textureRenderer = new TextureRenderer(this.gl)
|
||||
this.viewportRectangleRenderer = new ViewportRectangleRenderer(this.gl)
|
||||
this.flamechartColorPassRenderer = new FlamechartColorPassRenderer(this.gl)
|
||||
this.setScissor = this.gl({scissor: {enable: true}})
|
||||
this.setViewportScope = this.gl<SetViewportScopeProps>({
|
||||
context: {
|
||||
viewportX: (context: regl.Context, props: SetViewportScopeProps) => {
|
||||
return props.physicalBounds.left()
|
||||
},
|
||||
viewportY: (context: regl.Context, props: SetViewportScopeProps) => {
|
||||
return props.physicalBounds.top()
|
||||
},
|
||||
},
|
||||
viewport: (context, props) => {
|
||||
const {physicalBounds} = props
|
||||
return {
|
||||
x: physicalBounds.left(),
|
||||
y:
|
||||
window.devicePixelRatio * window.innerHeight -
|
||||
physicalBounds.top() -
|
||||
physicalBounds.height(),
|
||||
width: physicalBounds.width(),
|
||||
height: physicalBounds.height(),
|
||||
}
|
||||
},
|
||||
scissor: (context, props) => {
|
||||
const {physicalBounds} = props
|
||||
return {
|
||||
enable: true,
|
||||
box: {
|
||||
x: physicalBounds.left(),
|
||||
y:
|
||||
window.devicePixelRatio * window.innerHeight -
|
||||
physicalBounds.top() -
|
||||
physicalBounds.height(),
|
||||
width: physicalBounds.width(),
|
||||
height: physicalBounds.height(),
|
||||
},
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
const webGLInfo = this.gl.getWebGLInfo()
|
||||
if (webGLInfo) {
|
||||
console.log(
|
||||
`WebGL initialized. renderer: ${webGLInfo.renderer}, vendor: ${webGLInfo.vendor}, version: ${webGLInfo.version}`,
|
||||
)
|
||||
}
|
||||
;(window as any)['testContextLoss'] = () => {
|
||||
this.gl.testContextLoss()
|
||||
}
|
||||
}
|
||||
|
||||
private tick: regl.Tick | null = null
|
||||
private tickNeeded: boolean = false
|
||||
private animationFrameRequest: number | null = null
|
||||
private beforeFrameHandlers = new Set<FrameCallback>()
|
||||
addBeforeFrameHandler(callback: FrameCallback) {
|
||||
this.beforeFrameHandlers.add(callback)
|
||||
@@ -108,86 +41,38 @@ export class CanvasContext {
|
||||
this.beforeFrameHandlers.delete(callback)
|
||||
}
|
||||
requestFrame() {
|
||||
this.tickNeeded = true
|
||||
if (!this.tick) {
|
||||
this.tick = this.gl.frame(this.onBeforeFrame)
|
||||
if (!this.animationFrameRequest) {
|
||||
this.animationFrameRequest = requestAnimationFrame(this.onBeforeFrame)
|
||||
}
|
||||
}
|
||||
private onBeforeFrame = () => {
|
||||
this.animationFrameRequest = null
|
||||
this.gl.setViewport(0, 0, this.gl.renderTargetWidthInPixels, this.gl.renderTargetHeightInPixels)
|
||||
this.gl.clear(new Graphics.Color(1, 1, 1, 1))
|
||||
|
||||
private perfDebug = window.location.href.indexOf('perf-debug=1') !== -1
|
||||
private statsPanel: StatsPanel | null = this.perfDebug ? new StatsPanel() : null
|
||||
|
||||
private onBeforeFrame = (context: regl.Context) => {
|
||||
this.setScissor(() => {
|
||||
this.gl.clear({color: [0, 0, 0, 0]})
|
||||
})
|
||||
|
||||
this.tickNeeded = false
|
||||
|
||||
this.statsPanel && this.statsPanel.begin()
|
||||
for (const handler of this.beforeFrameHandlers) {
|
||||
handler()
|
||||
}
|
||||
this.statsPanel && this.statsPanel.end()
|
||||
|
||||
if (this.tick && !this.tickNeeded) {
|
||||
if (!this.perfDebug) {
|
||||
this.tick.cancel()
|
||||
this.tick = null
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(jlfwong): It would be really nice to have GPU
|
||||
// stats here, but I can't figure out how to interpret
|
||||
// the gpuTime. I suspect this is caused by executing the same
|
||||
// program multiple times without flushing.
|
||||
// I'll investigate this at some point and report a bug to regl.
|
||||
}
|
||||
|
||||
drawRectangleBatch(props: RectangleBatchRendererProps) {
|
||||
this.rectangleBatchRenderer.render(props)
|
||||
setViewport(physicalBounds: Rect, cb: () => void): void {
|
||||
const {origin, size} = physicalBounds
|
||||
let viewportBefore = this.gl.viewport
|
||||
this.gl.setViewport(origin.x, origin.y, size.x, size.y)
|
||||
|
||||
cb()
|
||||
|
||||
let {x, y, width, height} = viewportBefore
|
||||
this.gl.setViewport(x, y, width, height)
|
||||
}
|
||||
|
||||
drawTexture(props: TextureRendererProps) {
|
||||
this.textureRenderer.render(props)
|
||||
}
|
||||
|
||||
drawFlamechartColorPass(props: FlamechartColorPassRenderProps) {
|
||||
this.flamechartColorPassRenderer.render(props)
|
||||
}
|
||||
|
||||
createRectangleBatch(): RectangleBatch {
|
||||
return new RectangleBatch(this.gl)
|
||||
}
|
||||
|
||||
createTextureCachedRenderer<T>(options: {
|
||||
render(t: T): void
|
||||
shouldUpdate(oldProps: T, newProps: T): boolean
|
||||
}): TextureCachedRenderer<T> {
|
||||
return new TextureCachedRenderer(this.gl, {
|
||||
...options,
|
||||
textureRenderer: this.textureRenderer,
|
||||
})
|
||||
}
|
||||
|
||||
drawViewportRectangle(props: ViewportRectangleRendererProps) {
|
||||
this.viewportRectangleRenderer.render(props)
|
||||
}
|
||||
|
||||
renderInto(el: Element, cb: (context: regl.Context) => void) {
|
||||
renderBehind(el: Element, cb: () => void) {
|
||||
const bounds = el.getBoundingClientRect()
|
||||
const physicalBounds = new Rect(
|
||||
new Vec2(bounds.left * window.devicePixelRatio, bounds.top * window.devicePixelRatio),
|
||||
new Vec2(bounds.width * window.devicePixelRatio, bounds.height * window.devicePixelRatio),
|
||||
)
|
||||
this.setViewportScope({physicalBounds}, cb)
|
||||
}
|
||||
|
||||
setViewport(physicalBounds: Rect, cb: (context: regl.Context) => void) {
|
||||
this.setViewportScope({physicalBounds}, cb)
|
||||
}
|
||||
|
||||
getMaxTextureSize() {
|
||||
return this.gl.limits.maxTextureSize
|
||||
this.setViewport(physicalBounds, cb)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,165 +1,165 @@
|
||||
import regl from 'regl'
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
import {Graphics} from './graphics'
|
||||
import {setUniformAffineTransform} from './utils'
|
||||
|
||||
const vertexFormat = new Graphics.VertexFormat()
|
||||
vertexFormat.add('position', Graphics.AttributeType.FLOAT, 2)
|
||||
vertexFormat.add('uv', Graphics.AttributeType.FLOAT, 2)
|
||||
|
||||
const vert = `
|
||||
uniform mat3 uvTransform;
|
||||
uniform mat3 positionTransform;
|
||||
|
||||
attribute vec2 position;
|
||||
attribute vec2 uv;
|
||||
varying vec2 vUv;
|
||||
|
||||
void main() {
|
||||
vUv = (uvTransform * vec3(uv, 1)).xy;
|
||||
gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);
|
||||
}
|
||||
`
|
||||
|
||||
const frag = `
|
||||
precision mediump float;
|
||||
|
||||
uniform vec2 uvSpacePixelSize;
|
||||
uniform float renderOutlines;
|
||||
|
||||
varying vec2 vUv;
|
||||
uniform sampler2D colorTexture;
|
||||
|
||||
// https://en.wikipedia.org/wiki/HSL_and_HSV#From_luma/chroma/hue
|
||||
vec3 hcl2rgb(float H, float C, float L) {
|
||||
float hPrime = H / 60.0;
|
||||
float X = C * (1.0 - abs(mod(hPrime, 2.0) - 1.0));
|
||||
vec3 RGB =
|
||||
hPrime < 1.0 ? vec3(C, X, 0) :
|
||||
hPrime < 2.0 ? vec3(X, C, 0) :
|
||||
hPrime < 3.0 ? vec3(0, C, X) :
|
||||
hPrime < 4.0 ? vec3(0, X, C) :
|
||||
hPrime < 5.0 ? vec3(X, 0, C) :
|
||||
vec3(C, 0, X);
|
||||
|
||||
float m = L - dot(RGB, vec3(0.30, 0.59, 0.11));
|
||||
return RGB + vec3(m, m, m);
|
||||
}
|
||||
|
||||
float triangle(float x) {
|
||||
return 2.0 * abs(fract(x) - 0.5) - 1.0;
|
||||
}
|
||||
|
||||
vec3 colorForBucket(float t) {
|
||||
float x = triangle(30.0 * t);
|
||||
float H = 360.0 * (0.9 * t);
|
||||
float C = 0.25 + 0.2 * x;
|
||||
float L = 0.80 - 0.15 * x;
|
||||
return hcl2rgb(H, C, L);
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec4 here = texture2D(colorTexture, vUv);
|
||||
|
||||
if (here.z == 0.0) {
|
||||
// Background color
|
||||
gl_FragColor = vec4(0, 0, 0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Sample the 4 surrounding pixels in the depth texture to determine
|
||||
// if we should draw a boundary here or not.
|
||||
vec4 N = texture2D(colorTexture, vUv + vec2(0, uvSpacePixelSize.y));
|
||||
vec4 E = texture2D(colorTexture, vUv + vec2(uvSpacePixelSize.x, 0));
|
||||
vec4 S = texture2D(colorTexture, vUv + vec2(0, -uvSpacePixelSize.y));
|
||||
vec4 W = texture2D(colorTexture, vUv + vec2(-uvSpacePixelSize.x, 0));
|
||||
|
||||
// NOTE: For outline checks, we intentionally check both the right
|
||||
// and the left to determine if we're an edge. If a rectangle is a single
|
||||
// pixel wide, we don't want to render it as an outline, so this method
|
||||
// of checking ensures that we don't outline single physical-space
|
||||
// pixel width rectangles.
|
||||
if (
|
||||
renderOutlines > 0.0 &&
|
||||
(
|
||||
here.y == N.y && here.y != S.y || // Top edge
|
||||
here.y == S.y && here.y != N.y || // Bottom edge
|
||||
here.x == E.x && here.x != W.x || // Left edge
|
||||
here.x == W.x && here.x != E.x
|
||||
)
|
||||
) {
|
||||
// We're on an edge! Draw transparent.
|
||||
gl_FragColor = vec4(0, 0, 0, 0);
|
||||
} else {
|
||||
// Not on an edge. Draw the appropriate color.
|
||||
gl_FragColor = vec4(colorForBucket(here.z), here.a);
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
export interface FlamechartColorPassRenderProps {
|
||||
rectInfoTexture: regl.Texture
|
||||
rectInfoTexture: Graphics.Texture
|
||||
renderOutlines: boolean
|
||||
srcRect: Rect
|
||||
dstRect: Rect
|
||||
}
|
||||
|
||||
export class FlamechartColorPassRenderer {
|
||||
private command: regl.Command<FlamechartColorPassRenderProps>
|
||||
constructor(gl: regl.Instance) {
|
||||
this.command = gl({
|
||||
vert: `
|
||||
uniform mat3 uvTransform;
|
||||
uniform mat3 positionTransform;
|
||||
private material: Graphics.Material
|
||||
private buffer: Graphics.VertexBuffer
|
||||
|
||||
attribute vec2 position;
|
||||
attribute vec2 uv;
|
||||
varying vec2 vUv;
|
||||
constructor(private gl: Graphics.Context) {
|
||||
const vertices = [
|
||||
{pos: [-1, 1], uv: [0, 1]},
|
||||
{pos: [1, 1], uv: [1, 1]},
|
||||
{pos: [-1, -1], uv: [0, 0]},
|
||||
{pos: [1, -1], uv: [1, 0]},
|
||||
]
|
||||
const floats: number[] = []
|
||||
for (let v of vertices) {
|
||||
floats.push(v.pos[0])
|
||||
floats.push(v.pos[1])
|
||||
floats.push(v.uv[0])
|
||||
floats.push(v.uv[1])
|
||||
}
|
||||
|
||||
void main() {
|
||||
vUv = (uvTransform * vec3(uv, 1)).xy;
|
||||
gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);
|
||||
}
|
||||
`,
|
||||
|
||||
frag: `
|
||||
precision mediump float;
|
||||
|
||||
uniform vec2 uvSpacePixelSize;
|
||||
uniform float renderOutlines;
|
||||
|
||||
varying vec2 vUv;
|
||||
uniform sampler2D colorTexture;
|
||||
|
||||
// https://en.wikipedia.org/wiki/HSL_and_HSV#From_luma/chroma/hue
|
||||
vec3 hcl2rgb(float H, float C, float L) {
|
||||
float hPrime = H / 60.0;
|
||||
float X = C * (1.0 - abs(mod(hPrime, 2.0) - 1.0));
|
||||
vec3 RGB =
|
||||
hPrime < 1.0 ? vec3(C, X, 0) :
|
||||
hPrime < 2.0 ? vec3(X, C, 0) :
|
||||
hPrime < 3.0 ? vec3(0, C, X) :
|
||||
hPrime < 4.0 ? vec3(0, X, C) :
|
||||
hPrime < 5.0 ? vec3(X, 0, C) :
|
||||
vec3(C, 0, X);
|
||||
|
||||
float m = L - dot(RGB, vec3(0.30, 0.59, 0.11));
|
||||
return RGB + vec3(m, m, m);
|
||||
}
|
||||
|
||||
float triangle(float x) {
|
||||
return 2.0 * abs(fract(x) - 0.5) - 1.0;
|
||||
}
|
||||
|
||||
vec3 colorForBucket(float t) {
|
||||
float x = triangle(30.0 * t);
|
||||
float H = 360.0 * (0.9 * t);
|
||||
float C = 0.25 + 0.2 * x;
|
||||
float L = 0.80 - 0.15 * x;
|
||||
return hcl2rgb(H, C, L);
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec4 here = texture2D(colorTexture, vUv);
|
||||
|
||||
if (here.z == 0.0) {
|
||||
// Background color
|
||||
gl_FragColor = vec4(0, 0, 0, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
// Sample the 4 surrounding pixels in the depth texture to determine
|
||||
// if we should draw a boundary here or not.
|
||||
vec4 N = texture2D(colorTexture, vUv + vec2(0, uvSpacePixelSize.y));
|
||||
vec4 E = texture2D(colorTexture, vUv + vec2(uvSpacePixelSize.x, 0));
|
||||
vec4 S = texture2D(colorTexture, vUv + vec2(0, -uvSpacePixelSize.y));
|
||||
vec4 W = texture2D(colorTexture, vUv + vec2(-uvSpacePixelSize.x, 0));
|
||||
|
||||
// NOTE: For outline checks, we intentionally check both the right
|
||||
// and the left to determine if we're an edge. If a rectangle is a single
|
||||
// pixel wide, we don't want to render it as an outline, so this method
|
||||
// of checking ensures that we don't outline single physical-space
|
||||
// pixel width rectangles.
|
||||
if (
|
||||
renderOutlines > 0.0 &&
|
||||
(
|
||||
here.y == N.y && here.y != S.y || // Top edge
|
||||
here.y == S.y && here.y != N.y || // Bottom edge
|
||||
here.x == E.x && here.x != W.x || // Left edge
|
||||
here.x == W.x && here.x != E.x
|
||||
)
|
||||
) {
|
||||
// We're on an edge! Draw transparent.
|
||||
gl_FragColor = vec4(0, 0, 0, 0);
|
||||
} else {
|
||||
// Not on an edge. Draw the appropriate color;
|
||||
gl_FragColor = vec4(colorForBucket(here.z), here.a);
|
||||
}
|
||||
}
|
||||
`,
|
||||
|
||||
depth: {
|
||||
enable: false,
|
||||
},
|
||||
|
||||
attributes: {
|
||||
// Cover full canvas with a rectangle
|
||||
// with 2 triangles using a triangle
|
||||
// strip.
|
||||
//
|
||||
// 0 +--+ 1
|
||||
// | /|
|
||||
// |/ |
|
||||
// 2 +--+ 3
|
||||
position: gl.buffer([[-1, 1], [1, 1], [-1, -1], [1, -1]]),
|
||||
uv: gl.buffer([[0, 1], [1, 1], [0, 0], [1, 0]]),
|
||||
},
|
||||
|
||||
count: 4,
|
||||
|
||||
primitive: 'triangle strip',
|
||||
|
||||
uniforms: {
|
||||
colorTexture: (context, props) => props.rectInfoTexture,
|
||||
uvTransform: (context, props) => {
|
||||
const {srcRect, rectInfoTexture} = props
|
||||
const physicalToUV = AffineTransform.withTranslation(new Vec2(0, 1))
|
||||
.times(AffineTransform.withScale(new Vec2(1, -1)))
|
||||
.times(
|
||||
AffineTransform.betweenRects(
|
||||
new Rect(Vec2.zero, new Vec2(rectInfoTexture.width, rectInfoTexture.height)),
|
||||
Rect.unit,
|
||||
),
|
||||
)
|
||||
const uvRect = physicalToUV.transformRect(srcRect)
|
||||
return AffineTransform.betweenRects(Rect.unit, uvRect).flatten()
|
||||
},
|
||||
renderOutlines: (context, props) => {
|
||||
return props.renderOutlines ? 1.0 : 0.0
|
||||
},
|
||||
uvSpacePixelSize: (context, props) => {
|
||||
return Vec2.unit
|
||||
.dividedByPointwise(new Vec2(props.rectInfoTexture.width, props.rectInfoTexture.height))
|
||||
.flatten()
|
||||
},
|
||||
positionTransform: (context, props) => {
|
||||
const {dstRect} = props
|
||||
const viewportSize = new Vec2(context.viewportWidth, context.viewportHeight)
|
||||
|
||||
const physicalToNDC = AffineTransform.withScale(new Vec2(1, -1)).times(
|
||||
AffineTransform.betweenRects(new Rect(Vec2.zero, viewportSize), Rect.NDC),
|
||||
)
|
||||
const ndcRect = physicalToNDC.transformRect(dstRect)
|
||||
return AffineTransform.betweenRects(Rect.NDC, ndcRect).flatten()
|
||||
},
|
||||
},
|
||||
})
|
||||
this.buffer = gl.createVertexBuffer(vertexFormat.stride * vertices.length)
|
||||
this.buffer.uploadFloats(floats)
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag)
|
||||
}
|
||||
|
||||
render(props: FlamechartColorPassRenderProps) {
|
||||
this.command(props)
|
||||
const {srcRect, rectInfoTexture} = props
|
||||
const physicalToUV = AffineTransform.withTranslation(new Vec2(0, 1))
|
||||
.times(AffineTransform.withScale(new Vec2(1, -1)))
|
||||
.times(
|
||||
AffineTransform.betweenRects(
|
||||
new Rect(Vec2.zero, new Vec2(rectInfoTexture.width, rectInfoTexture.height)),
|
||||
Rect.unit,
|
||||
),
|
||||
)
|
||||
const uvRect = physicalToUV.transformRect(srcRect)
|
||||
const uvTransform = AffineTransform.betweenRects(Rect.unit, uvRect)
|
||||
|
||||
const {dstRect} = props
|
||||
const viewportSize = new Vec2(this.gl.viewport.width, this.gl.viewport.height)
|
||||
|
||||
const physicalToNDC = AffineTransform.withScale(new Vec2(1, -1)).times(
|
||||
AffineTransform.betweenRects(new Rect(Vec2.zero, viewportSize), Rect.NDC),
|
||||
)
|
||||
const ndcRect = physicalToNDC.transformRect(dstRect)
|
||||
const positionTransform = AffineTransform.betweenRects(Rect.NDC, ndcRect)
|
||||
|
||||
const uvSpacePixelSize = Vec2.unit.dividedByPointwise(
|
||||
new Vec2(props.rectInfoTexture.width, props.rectInfoTexture.height),
|
||||
)
|
||||
|
||||
this.material.setUniformSampler('colorTexture', props.rectInfoTexture, 0)
|
||||
setUniformAffineTransform(this.material, 'uvTransform', uvTransform)
|
||||
this.material.setUniformFloat('renderOutlines', props.renderOutlines ? 1.0 : 0.0)
|
||||
this.material.setUniformVec2('uvSpacePixelSize', uvSpacePixelSize.x, uvSpacePixelSize.y)
|
||||
setUniformAffineTransform(this.material, 'positionTransform', positionTransform)
|
||||
|
||||
this.gl.setUnpremultipliedBlendState()
|
||||
this.gl.draw(Graphics.Primitive.TRIANGLE_STRIP, this.material, this.buffer)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
import regl from 'regl'
|
||||
import {Flamechart} from '../lib/flamechart'
|
||||
import {RectangleBatch} from './rectangle-batch-renderer'
|
||||
import {CanvasContext} from './canvas-context'
|
||||
import {RectangleBatch, RectangleBatchRenderer} from './rectangle-batch-renderer'
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
import {Color} from '../lib/color'
|
||||
import {KeyedSet} from '../lib/utils'
|
||||
import {RowAtlas} from './row-atlas'
|
||||
import {Graphics} from './graphics'
|
||||
import {FlamechartColorPassRenderer} from './flamechart-color-pass-renderer'
|
||||
import {renderInto} from './utils'
|
||||
|
||||
const MAX_BATCH_SIZE = 10000
|
||||
|
||||
@@ -23,9 +24,7 @@ class RangeTreeLeafNode implements RangeTreeNode {
|
||||
private batch: RectangleBatch,
|
||||
private bounds: Rect,
|
||||
private numPrecedingRectanglesInRow: number,
|
||||
) {
|
||||
batch.uploadToGPU()
|
||||
}
|
||||
) {}
|
||||
|
||||
getBatch() {
|
||||
return this.batch
|
||||
@@ -127,13 +126,13 @@ export interface FlamechartRendererOptions {
|
||||
|
||||
export class FlamechartRenderer {
|
||||
private layers: RangeTreeNode[] = []
|
||||
private rectInfoTexture: regl.Texture
|
||||
private framebuffer: regl.Framebuffer
|
||||
|
||||
constructor(
|
||||
private canvasContext: CanvasContext,
|
||||
private gl: Graphics.Context,
|
||||
private rowAtlas: RowAtlas<FlamechartRowAtlasKey>,
|
||||
private flamechart: Flamechart,
|
||||
private rectangleBatchRenderer: RectangleBatchRenderer,
|
||||
private colorPassRenderer: FlamechartColorPassRenderer,
|
||||
private options: FlamechartRendererOptions = {inverted: false},
|
||||
) {
|
||||
const nLayers = flamechart.getLayers().length
|
||||
@@ -143,7 +142,7 @@ export class FlamechartRenderer {
|
||||
|
||||
let minLeft = Infinity
|
||||
let maxRight = -Infinity
|
||||
let batch = canvasContext.createRectangleBatch()
|
||||
let batch = new RectangleBatch(this.gl)
|
||||
|
||||
let rectCount = 0
|
||||
|
||||
@@ -161,7 +160,7 @@ export class FlamechartRenderer {
|
||||
)
|
||||
minLeft = Infinity
|
||||
maxRight = -Infinity
|
||||
batch = canvasContext.createRectangleBatch()
|
||||
batch = new RectangleBatch(this.gl)
|
||||
}
|
||||
const configSpaceBounds = new Rect(
|
||||
new Vec2(frame.start, y),
|
||||
@@ -176,8 +175,8 @@ export class FlamechartRenderer {
|
||||
// and the blue channel to indicate the color bucket to render.
|
||||
// We add one to each so we have zero reserved for the background color.
|
||||
const color = new Color(
|
||||
(1 + i % 255) / 256,
|
||||
(1 + stackDepth % 255) / 256,
|
||||
(1 + (i % 255)) / 256,
|
||||
(1 + (stackDepth % 255)) / 256,
|
||||
(1 + this.flamechart.getColorBucketForFrame(frame.node.frame)) / 256,
|
||||
)
|
||||
batch.addRect(configSpaceBounds, color)
|
||||
@@ -198,10 +197,47 @@ export class FlamechartRenderer {
|
||||
// range than a tree of always-height-two might make this run faster
|
||||
this.layers.push(new RangeTreeInteriorNode(leafNodes))
|
||||
}
|
||||
this.rectInfoTexture = this.canvasContext.gl.texture({width: 1, height: 1})
|
||||
this.framebuffer = this.canvasContext.gl.framebuffer({
|
||||
color: [this.rectInfoTexture],
|
||||
})
|
||||
}
|
||||
|
||||
private rectInfoTexture: Graphics.Texture | null = null
|
||||
getRectInfoTexture(width: number, height: number): Graphics.Texture {
|
||||
if (this.rectInfoTexture) {
|
||||
const texture = this.rectInfoTexture
|
||||
if (texture.width != width || texture.height != height) {
|
||||
texture.resize(width, height)
|
||||
}
|
||||
} else {
|
||||
this.rectInfoTexture = this.gl.createTexture(
|
||||
Graphics.TextureFormat.NEAREST_CLAMP,
|
||||
width,
|
||||
height,
|
||||
)
|
||||
}
|
||||
return this.rectInfoTexture
|
||||
}
|
||||
|
||||
private rectInfoRenderTarget: Graphics.RenderTarget | null = null
|
||||
getRectInfoRenderTarget(width: number, height: number): Graphics.RenderTarget {
|
||||
const texture = this.getRectInfoTexture(width, height)
|
||||
if (this.rectInfoRenderTarget) {
|
||||
if (this.rectInfoRenderTarget.texture != texture) {
|
||||
this.rectInfoRenderTarget.texture.free()
|
||||
this.rectInfoRenderTarget.setColor(texture)
|
||||
}
|
||||
}
|
||||
if (!this.rectInfoRenderTarget) {
|
||||
this.rectInfoRenderTarget = this.gl.createRenderTarget(texture)
|
||||
}
|
||||
return this.rectInfoRenderTarget
|
||||
}
|
||||
|
||||
free() {
|
||||
if (this.rectInfoRenderTarget) {
|
||||
this.rectInfoRenderTarget.free()
|
||||
}
|
||||
if (this.rectInfoTexture) {
|
||||
this.rectInfoTexture.free()
|
||||
}
|
||||
}
|
||||
|
||||
private atlasKeys = new KeyedSet<FlamechartRowAtlasKey>()
|
||||
@@ -252,10 +288,10 @@ export class FlamechartRenderer {
|
||||
const configSpaceContentWidth = this.flamechart.getTotalWeight()
|
||||
const numAtlasEntriesPerLayer = Math.pow(2, zoomLevel)
|
||||
const left = Math.floor(
|
||||
numAtlasEntriesPerLayer * configSpaceSrcRect.left() / configSpaceContentWidth,
|
||||
(numAtlasEntriesPerLayer * configSpaceSrcRect.left()) / configSpaceContentWidth,
|
||||
)
|
||||
const right = Math.ceil(
|
||||
numAtlasEntriesPerLayer * configSpaceSrcRect.right() / configSpaceContentWidth,
|
||||
(numAtlasEntriesPerLayer * configSpaceSrcRect.right()) / configSpaceContentWidth,
|
||||
)
|
||||
|
||||
const nLayers = this.flamechart.getLayers().length
|
||||
@@ -274,6 +310,11 @@ export class FlamechartRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(jlfwong): When I switched the GL backend from regl to the port from
|
||||
// evanw/sky, rendering uncached even for massive documents seemed fast
|
||||
// enough. It's possible that the row cache is now unnecessary, but I'll
|
||||
// leave it around for now since it's not causing issues.
|
||||
|
||||
const cacheCapacity = this.rowAtlas.getCapacity()
|
||||
const keysToRenderCached = atlasKeysToRender.slice(0, cacheCapacity)
|
||||
const keysToRenderUncached = atlasKeysToRender.slice(cacheCapacity)
|
||||
@@ -282,24 +323,26 @@ export class FlamechartRenderer {
|
||||
this.rowAtlas.writeToAtlasIfNeeded(keysToRenderCached, (textureDstRect, key) => {
|
||||
const configSpaceBounds = this.configSpaceBoundsForKey(key)
|
||||
this.layers[key.stackDepth].forEachLeafNodeWithinBounds(configSpaceBounds, leaf => {
|
||||
this.canvasContext.drawRectangleBatch({
|
||||
this.rectangleBatchRenderer.render({
|
||||
batch: leaf.getBatch(),
|
||||
configSpaceSrcRect: configSpaceBounds,
|
||||
physicalSpaceDstRect: textureDstRect,
|
||||
parityMin: key.stackDepth % 2 == 0 ? 2 : 0,
|
||||
parityOffset: leaf.getParity(),
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
this.framebuffer.resize(physicalSpaceDstRect.width(), physicalSpaceDstRect.height())
|
||||
this.framebuffer.use(context => {
|
||||
this.canvasContext.gl.clear({color: [0, 0, 0, 0]})
|
||||
const renderTarget = this.getRectInfoRenderTarget(
|
||||
physicalSpaceDstRect.width(),
|
||||
physicalSpaceDstRect.height(),
|
||||
)
|
||||
|
||||
renderInto(this.gl, renderTarget, () => {
|
||||
this.gl.clear(new Graphics.Color(0, 0, 0, 0))
|
||||
|
||||
const viewportRect = new Rect(
|
||||
Vec2.zero,
|
||||
new Vec2(context.viewportWidth, context.viewportHeight),
|
||||
new Vec2(this.gl.viewport.width, this.gl.viewport.height),
|
||||
)
|
||||
|
||||
const configToViewport = AffineTransform.betweenRects(configSpaceSrcRect, viewportRect)
|
||||
|
||||
// Render from the cache
|
||||
@@ -313,34 +356,25 @@ export class FlamechartRenderer {
|
||||
const configSpaceBounds = this.configSpaceBoundsForKey(key)
|
||||
const physicalBounds = configToViewport.transformRect(configSpaceBounds)
|
||||
this.layers[key.stackDepth].forEachLeafNodeWithinBounds(configSpaceBounds, leaf => {
|
||||
this.canvasContext.drawRectangleBatch({
|
||||
this.rectangleBatchRenderer.render({
|
||||
batch: leaf.getBatch(),
|
||||
configSpaceSrcRect,
|
||||
configSpaceSrcRect: configSpaceBounds,
|
||||
physicalSpaceDstRect: physicalBounds,
|
||||
parityMin: key.stackDepth % 2 == 0 ? 2 : 0,
|
||||
parityOffset: leaf.getParity(),
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
this.canvasContext.drawFlamechartColorPass({
|
||||
rectInfoTexture: this.rectInfoTexture,
|
||||
srcRect: new Rect(
|
||||
Vec2.zero,
|
||||
new Vec2(this.rectInfoTexture.width, this.rectInfoTexture.height),
|
||||
),
|
||||
const rectInfoTexture = this.getRectInfoTexture(
|
||||
physicalSpaceDstRect.width(),
|
||||
physicalSpaceDstRect.height(),
|
||||
)
|
||||
|
||||
this.colorPassRenderer.render({
|
||||
rectInfoTexture,
|
||||
srcRect: new Rect(Vec2.zero, new Vec2(rectInfoTexture.width, rectInfoTexture.height)),
|
||||
dstRect: physicalSpaceDstRect,
|
||||
renderOutlines: props.renderOutlines,
|
||||
})
|
||||
|
||||
// Overlay the atlas on top of the canvas for debugging
|
||||
/*
|
||||
this.canvasContext.drawTexture({
|
||||
texture: this.rowAtlas.texture,
|
||||
srcRect: new Rect(Vec2.zero, new Vec2(this.rowAtlas.texture.width, this.rowAtlas.texture.height)),
|
||||
dstRect: new Rect(Vec2.zero, new Vec2(800, 800))
|
||||
})
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
+1379
File diff suppressed because it is too large
Load Diff
@@ -1,126 +1,108 @@
|
||||
import regl from 'regl'
|
||||
import {AffineTransform, Rect} from '../lib/math'
|
||||
import {Graphics} from './graphics'
|
||||
import {setUniformAffineTransform, setUniformVec2} from './utils'
|
||||
|
||||
export interface ViewportRectangleRendererProps {
|
||||
configSpaceToPhysicalViewSpace: AffineTransform
|
||||
configSpaceViewportRect: Rect
|
||||
}
|
||||
|
||||
const vertexFormat = new Graphics.VertexFormat()
|
||||
vertexFormat.add('position', Graphics.AttributeType.FLOAT, 2)
|
||||
|
||||
const vert = `
|
||||
attribute vec2 position;
|
||||
|
||||
void main() {
|
||||
gl_Position = vec4(position, 0, 1);
|
||||
}
|
||||
`
|
||||
|
||||
const frag = `
|
||||
precision mediump float;
|
||||
|
||||
uniform mat3 configSpaceToPhysicalViewSpace;
|
||||
uniform vec2 physicalSize;
|
||||
uniform vec2 physicalOrigin;
|
||||
uniform vec2 configSpaceViewportOrigin;
|
||||
uniform vec2 configSpaceViewportSize;
|
||||
uniform float framebufferHeight;
|
||||
|
||||
void main() {
|
||||
vec2 origin = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportOrigin, 1.0)).xy;
|
||||
vec2 size = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportSize, 0.0)).xy;
|
||||
|
||||
vec2 halfSize = physicalSize / 2.0;
|
||||
|
||||
float borderWidth = 2.0;
|
||||
|
||||
origin = floor(origin * halfSize) / halfSize + borderWidth * vec2(1.0, 1.0);
|
||||
size = floor(size * halfSize) / halfSize - 2.0 * borderWidth * vec2(1.0, 1.0);
|
||||
|
||||
vec2 coord = gl_FragCoord.xy;
|
||||
coord.x = coord.x - physicalOrigin.x;
|
||||
coord.y = framebufferHeight - coord.y - physicalOrigin.y;
|
||||
vec2 clamped = clamp(coord, origin, origin + size);
|
||||
vec2 gap = clamped - coord;
|
||||
float maxdist = max(abs(gap.x), abs(gap.y));
|
||||
|
||||
// TOOD(jlfwong): Could probably optimize this to use mix somehow.
|
||||
if (maxdist == 0.0) {
|
||||
// Inside viewport rectangle
|
||||
gl_FragColor = vec4(0, 0, 0, 0);
|
||||
} else if (maxdist < borderWidth) {
|
||||
// Inside viewport rectangle at border
|
||||
gl_FragColor = vec4(0.7, 0.7, 0.7, 0.8);
|
||||
} else {
|
||||
// Outside viewport rectangle
|
||||
gl_FragColor = vec4(0.7, 0.7, 0.7, 0.5);
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
export class ViewportRectangleRenderer {
|
||||
private command: regl.Command<ViewportRectangleRendererProps>
|
||||
constructor(regl: regl.Instance) {
|
||||
this.command = regl<ViewportRectangleRendererProps>({
|
||||
vert: `
|
||||
attribute vec2 position;
|
||||
private material: Graphics.Material
|
||||
private buffer: Graphics.VertexBuffer
|
||||
|
||||
void main() {
|
||||
gl_Position = vec4(position, 0, 1);
|
||||
}
|
||||
`,
|
||||
|
||||
frag: `
|
||||
precision mediump float;
|
||||
|
||||
uniform mat3 configSpaceToPhysicalViewSpace;
|
||||
uniform vec2 physicalSize;
|
||||
uniform vec2 physicalOrigin;
|
||||
uniform vec2 configSpaceViewportOrigin;
|
||||
uniform vec2 configSpaceViewportSize;
|
||||
uniform float framebufferHeight;
|
||||
|
||||
void main() {
|
||||
vec2 origin = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportOrigin, 1.0)).xy;
|
||||
vec2 size = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportSize, 0.0)).xy;
|
||||
|
||||
vec2 halfSize = physicalSize / 2.0;
|
||||
|
||||
float borderWidth = 2.0;
|
||||
|
||||
origin = floor(origin * halfSize) / halfSize + borderWidth * vec2(1.0, 1.0);
|
||||
size = floor(size * halfSize) / halfSize - 2.0 * borderWidth * vec2(1.0, 1.0);
|
||||
|
||||
vec2 coord = gl_FragCoord.xy;
|
||||
coord.x = coord.x - physicalOrigin.x;
|
||||
coord.y = framebufferHeight - coord.y - physicalOrigin.y;
|
||||
vec2 clamped = clamp(coord, origin, origin + size);
|
||||
vec2 gap = clamped - coord;
|
||||
float maxdist = max(abs(gap.x), abs(gap.y));
|
||||
|
||||
// TOOD(jlfwong): Could probably optimize this to use mix somehow.
|
||||
if (maxdist == 0.0) {
|
||||
// Inside viewport rectangle
|
||||
gl_FragColor = vec4(0, 0, 0, 0);
|
||||
} else if (maxdist < borderWidth) {
|
||||
// Inside viewport rectangle at border
|
||||
gl_FragColor = vec4(0.7, 0.7, 0.7, 0.8);
|
||||
} else {
|
||||
// Outside viewport rectangle
|
||||
gl_FragColor = vec4(0.7, 0.7, 0.7, 0.5);
|
||||
}
|
||||
}
|
||||
`,
|
||||
|
||||
blend: {
|
||||
enable: true,
|
||||
func: {
|
||||
srcRGB: 'src alpha',
|
||||
srcAlpha: 'one',
|
||||
dstRGB: 'one minus src alpha',
|
||||
dstAlpha: 'one',
|
||||
},
|
||||
},
|
||||
|
||||
depth: {
|
||||
enable: false,
|
||||
},
|
||||
|
||||
attributes: {
|
||||
// Cover full canvas with a rectangle
|
||||
// with 2 triangles using a triangle
|
||||
// strip.
|
||||
//
|
||||
// 0 +--+ 1
|
||||
// | /|
|
||||
// |/ |
|
||||
// 2 +--+ 3
|
||||
position: [[-1, 1], [1, 1], [-1, -1], [1, -1]],
|
||||
},
|
||||
|
||||
uniforms: {
|
||||
configSpaceToPhysicalViewSpace: (context, props) => {
|
||||
return props.configSpaceToPhysicalViewSpace.flatten()
|
||||
},
|
||||
configSpaceViewportOrigin: (context, props) => {
|
||||
return props.configSpaceViewportRect.origin.flatten()
|
||||
},
|
||||
configSpaceViewportSize: (context, props) => {
|
||||
return props.configSpaceViewportRect.size.flatten()
|
||||
},
|
||||
physicalSize: (context, props) => {
|
||||
return [context.viewportWidth, context.viewportHeight]
|
||||
},
|
||||
physicalOrigin: (context, props) => {
|
||||
return [context.viewportX, context.viewportY]
|
||||
},
|
||||
framebufferHeight: (context, props) => {
|
||||
return context.framebufferHeight
|
||||
},
|
||||
},
|
||||
|
||||
primitive: 'triangle strip',
|
||||
|
||||
count: 4,
|
||||
})
|
||||
constructor(private gl: Graphics.Context) {
|
||||
const vertices = [
|
||||
[-1, 1],
|
||||
[1, 1],
|
||||
[-1, -1],
|
||||
[1, -1],
|
||||
]
|
||||
const floats: number[] = []
|
||||
for (let v of vertices) {
|
||||
floats.push(v[0])
|
||||
floats.push(v[1])
|
||||
}
|
||||
this.buffer = gl.createVertexBuffer(vertexFormat.stride * vertices.length)
|
||||
this.buffer.upload(new Uint8Array(new Float32Array(floats).buffer))
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag)
|
||||
}
|
||||
|
||||
render(props: ViewportRectangleRendererProps) {
|
||||
this.command(props)
|
||||
}
|
||||
setUniformAffineTransform(
|
||||
this.material,
|
||||
'configSpaceToPhysicalViewSpace',
|
||||
props.configSpaceToPhysicalViewSpace,
|
||||
)
|
||||
|
||||
resetStats() {
|
||||
return Object.assign(this.command.stats, {cpuTime: 0, gpuTime: 0, count: 0})
|
||||
}
|
||||
stats() {
|
||||
return this.command.stats
|
||||
// TODO(jlfwong): Pack these into a Vec4 instead
|
||||
setUniformVec2(this.material, 'configSpaceViewportOrigin', props.configSpaceViewportRect.origin)
|
||||
setUniformVec2(this.material, 'configSpaceViewportSize', props.configSpaceViewportRect.size)
|
||||
// TODO(jlfwong): Pack these into a Vec4 instead
|
||||
|
||||
const viewport = this.gl.viewport
|
||||
this.material.setUniformVec2('physicalOrigin', viewport.x, viewport.y)
|
||||
this.material.setUniformVec2('physicalSize', viewport.width, viewport.height)
|
||||
|
||||
this.material.setUniformFloat('framebufferHeight', this.gl.renderTargetHeightInPixels)
|
||||
|
||||
this.gl.setBlendState(
|
||||
Graphics.BlendOperation.SOURCE_ALPHA,
|
||||
Graphics.BlendOperation.INVERSE_SOURCE_ALPHA,
|
||||
)
|
||||
this.gl.draw(Graphics.Primitive.TRIANGLE_STRIP, this.material, this.buffer)
|
||||
}
|
||||
}
|
||||
|
||||
+109
-172
@@ -1,73 +1,106 @@
|
||||
import regl from 'regl'
|
||||
import {Rect, Vec2, AffineTransform} from '../lib/math'
|
||||
import {Color} from '../lib/color'
|
||||
import {Graphics} from './graphics'
|
||||
import {setUniformAffineTransform} from './utils'
|
||||
|
||||
const vertexFormat = new Graphics.VertexFormat()
|
||||
vertexFormat.add('configSpacePos', Graphics.AttributeType.FLOAT, 2)
|
||||
vertexFormat.add('color', Graphics.AttributeType.FLOAT, 3)
|
||||
|
||||
const vert = `
|
||||
uniform mat3 configSpaceToNDC;
|
||||
|
||||
attribute vec2 configSpacePos;
|
||||
attribute vec3 color;
|
||||
varying vec3 vColor;
|
||||
|
||||
void main() {
|
||||
vColor = color;
|
||||
vec2 position = (configSpaceToNDC * vec3(configSpacePos, 1)).xy;
|
||||
gl_Position = vec4(position, 1, 1);
|
||||
}
|
||||
`
|
||||
|
||||
const frag = `
|
||||
precision mediump float;
|
||||
varying vec3 vColor;
|
||||
|
||||
void main() {
|
||||
gl_FragColor = vec4(vColor.rgb, 1);
|
||||
}
|
||||
`
|
||||
|
||||
export class RectangleBatch {
|
||||
private rectCapacity = 1000
|
||||
private rectCount = 0
|
||||
|
||||
private configSpaceOffsets = new Float32Array(this.rectCapacity * 2)
|
||||
private configSpaceSizes = new Float32Array(this.rectCapacity * 2)
|
||||
private colors = new Float32Array(this.rectCapacity * 3)
|
||||
|
||||
constructor(private gl: regl.Instance) {}
|
||||
private rects: Rect[] = []
|
||||
private colors: Color[] = []
|
||||
constructor(private gl: Graphics.Context) {}
|
||||
|
||||
getRectCount() {
|
||||
return this.rectCount
|
||||
return this.rects.length
|
||||
}
|
||||
|
||||
private configSpaceOffsetBuffer: regl.Buffer | null = null
|
||||
getConfigSpaceOffsetBuffer() {
|
||||
if (!this.configSpaceOffsetBuffer)
|
||||
this.configSpaceOffsetBuffer = this.gl.buffer(this.configSpaceOffsets)
|
||||
return this.configSpaceOffsetBuffer
|
||||
}
|
||||
private buffer: Graphics.VertexBuffer | null = null
|
||||
getBuffer(): Graphics.VertexBuffer {
|
||||
if (this.buffer) {
|
||||
return this.buffer
|
||||
}
|
||||
|
||||
private configSpaceSizeBuffer: regl.Buffer | null = null
|
||||
getConfigSpaceSizeBuffer() {
|
||||
if (!this.configSpaceSizeBuffer)
|
||||
this.configSpaceSizeBuffer = this.gl.buffer(this.configSpaceSizes)
|
||||
return this.configSpaceSizeBuffer
|
||||
}
|
||||
const corners = [
|
||||
[0, 0],
|
||||
[1, 0],
|
||||
[0, 1],
|
||||
[1, 0],
|
||||
[0, 1],
|
||||
[1, 1],
|
||||
]
|
||||
|
||||
private colorBuffer: regl.Buffer | null = null
|
||||
getColorBuffer() {
|
||||
if (!this.colorBuffer) this.colorBuffer = this.gl.buffer(this.colors)
|
||||
return this.colorBuffer
|
||||
}
|
||||
const bytes = new Uint8Array(vertexFormat.stride * corners.length * this.rects.length)
|
||||
const floats = new Float32Array(bytes.buffer)
|
||||
let idx = 0
|
||||
|
||||
uploadToGPU() {
|
||||
this.getConfigSpaceOffsetBuffer()
|
||||
this.getConfigSpaceSizeBuffer()
|
||||
this.getColorBuffer()
|
||||
for (let i = 0; i < this.rects.length; i++) {
|
||||
const rect = this.rects[i]
|
||||
const color = this.colors[i]
|
||||
|
||||
// TODO(jlfwong): In the conversion from regl to graphics.ts, I lost the
|
||||
// ability to do instanced drawing. This is a pretty significant hit to
|
||||
// the performance here since I need 6x the memory to allocate these
|
||||
// things. Adding instanced drawing to graphics.ts is non-trivial, so I'm
|
||||
// just going to try this for now.
|
||||
for (let corner of corners) {
|
||||
floats[idx++] = rect.origin.x + corner[0] * rect.size.x
|
||||
floats[idx++] = rect.origin.y + corner[1] * rect.size.y
|
||||
|
||||
floats[idx++] = color.r
|
||||
floats[idx++] = color.g
|
||||
floats[idx++] = color.b
|
||||
}
|
||||
}
|
||||
|
||||
if (idx !== floats.length) {
|
||||
throw new Error("Buffer expected to be full but wasn't")
|
||||
}
|
||||
|
||||
this.buffer = this.gl.createVertexBuffer(bytes.length)
|
||||
this.buffer.upload(bytes)
|
||||
return this.buffer
|
||||
}
|
||||
|
||||
addRect(rect: Rect, color: Color) {
|
||||
const index = this.rectCount++
|
||||
if (index >= this.rectCapacity) {
|
||||
// Not enough capacity, time to resize! We'll double the capacity each time.
|
||||
this.rectCapacity *= 2
|
||||
const configSpaceOffsets = new Float32Array(this.rectCapacity * 2)
|
||||
const configSpaceSizes = new Float32Array(this.rectCapacity * 2)
|
||||
const colors = new Float32Array(this.rectCapacity * 3)
|
||||
this.rects.push(rect)
|
||||
this.colors.push(color)
|
||||
|
||||
configSpaceOffsets.set(this.configSpaceOffsets)
|
||||
configSpaceSizes.set(this.configSpaceSizes)
|
||||
colors.set(this.colors)
|
||||
|
||||
this.configSpaceOffsets = configSpaceOffsets
|
||||
this.configSpaceSizes = configSpaceSizes
|
||||
this.colors = colors
|
||||
if (this.buffer) {
|
||||
this.buffer.free()
|
||||
this.buffer = null
|
||||
}
|
||||
this.configSpaceOffsets[index * 2] = rect.origin.x
|
||||
this.configSpaceOffsets[index * 2 + 1] = rect.origin.y
|
||||
}
|
||||
|
||||
this.configSpaceSizes[index * 2] = rect.size.x
|
||||
this.configSpaceSizes[index * 2 + 1] = rect.size.y
|
||||
|
||||
this.colors[index * 3] = color.r
|
||||
this.colors[index * 3 + 1] = color.g
|
||||
this.colors[index * 3 + 2] = color.b
|
||||
free() {
|
||||
if (this.buffer) {
|
||||
this.buffer.free()
|
||||
this.buffer = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,131 +108,35 @@ export interface RectangleBatchRendererProps {
|
||||
batch: RectangleBatch
|
||||
configSpaceSrcRect: Rect
|
||||
physicalSpaceDstRect: Rect
|
||||
parityMin?: number
|
||||
parityOffset?: number
|
||||
}
|
||||
|
||||
export class RectangleBatchRenderer {
|
||||
private command: regl.Command<RectangleBatchRendererProps>
|
||||
constructor(gl: regl.Instance) {
|
||||
// We draw the parity / 5 into the depth channel so it can be used in a
|
||||
// post-processing step to draw boundaries between rectangles. We use 5
|
||||
// different values (2 per row) + one for the background, so we can
|
||||
// distingish both between adjacent rectangles on a row and between rows!
|
||||
this.command = gl({
|
||||
vert: `
|
||||
uniform mat3 configSpaceToNDC;
|
||||
|
||||
// Non-instanced
|
||||
attribute vec2 corner;
|
||||
|
||||
// Instanced
|
||||
attribute vec2 configSpaceOffset;
|
||||
attribute vec2 configSpaceSize;
|
||||
attribute vec3 color;
|
||||
attribute float index;
|
||||
|
||||
varying vec3 vColor;
|
||||
|
||||
void main() {
|
||||
vColor = color;
|
||||
vec2 configSpacePos = configSpaceOffset + corner * configSpaceSize;
|
||||
vec2 position = (configSpaceToNDC * vec3(configSpacePos, 1)).xy;
|
||||
gl_Position = vec4(position, 1, 1);
|
||||
}
|
||||
`,
|
||||
|
||||
depth: {
|
||||
enable: false,
|
||||
},
|
||||
|
||||
frag: `
|
||||
precision mediump float;
|
||||
varying vec3 vColor;
|
||||
varying float vParity;
|
||||
|
||||
void main() {
|
||||
gl_FragColor = vec4(vColor.rgb, 1);
|
||||
}
|
||||
`,
|
||||
|
||||
attributes: {
|
||||
// Non-instanced attributes
|
||||
corner: gl.buffer([[0, 0], [1, 0], [0, 1], [1, 1]]),
|
||||
|
||||
// Instanced attributes
|
||||
configSpaceOffset: (context, props) => {
|
||||
return {
|
||||
buffer: props.batch.getConfigSpaceOffsetBuffer(),
|
||||
offset: 0,
|
||||
stride: 2 * 4,
|
||||
size: 2,
|
||||
divisor: 1,
|
||||
}
|
||||
},
|
||||
configSpaceSize: (context, props) => {
|
||||
return {
|
||||
buffer: props.batch.getConfigSpaceSizeBuffer(),
|
||||
offset: 0,
|
||||
stride: 2 * 4,
|
||||
size: 2,
|
||||
divisor: 1,
|
||||
}
|
||||
},
|
||||
color: (context, props) => {
|
||||
return {
|
||||
buffer: props.batch.getColorBuffer(),
|
||||
offset: 0,
|
||||
stride: 3 * 4,
|
||||
size: 3,
|
||||
divisor: 1,
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
uniforms: {
|
||||
configSpaceToNDC: (context, props) => {
|
||||
const configToPhysical = AffineTransform.betweenRects(
|
||||
props.configSpaceSrcRect,
|
||||
props.physicalSpaceDstRect,
|
||||
)
|
||||
|
||||
const viewportSize = new Vec2(context.viewportWidth, context.viewportHeight)
|
||||
|
||||
const physicalToNDC = AffineTransform.withTranslation(new Vec2(-1, 1)).times(
|
||||
AffineTransform.withScale(new Vec2(2, -2).dividedByPointwise(viewportSize)),
|
||||
)
|
||||
|
||||
return physicalToNDC.times(configToPhysical).flatten()
|
||||
},
|
||||
|
||||
parityOffset: (context, props) => {
|
||||
return props.parityOffset == null ? 0 : props.parityOffset
|
||||
},
|
||||
|
||||
parityMin: (context, props) => {
|
||||
return props.parityMin == null ? 0 : 1 + props.parityMin
|
||||
},
|
||||
},
|
||||
|
||||
instances: (context, props) => {
|
||||
return props.batch.getRectCount()
|
||||
},
|
||||
|
||||
count: 4,
|
||||
|
||||
primitive: 'triangle strip',
|
||||
})
|
||||
material: Graphics.Material
|
||||
constructor(private gl: Graphics.Context) {
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag)
|
||||
}
|
||||
|
||||
render(props: RectangleBatchRendererProps) {
|
||||
this.command(props)
|
||||
}
|
||||
setUniformAffineTransform(
|
||||
this.material,
|
||||
'configSpaceToNDC',
|
||||
(() => {
|
||||
const configToPhysical = AffineTransform.betweenRects(
|
||||
props.configSpaceSrcRect,
|
||||
props.physicalSpaceDstRect,
|
||||
)
|
||||
|
||||
resetStats() {
|
||||
return Object.assign(this.command.stats, {cpuTime: 0, gpuTime: 0, count: 0})
|
||||
}
|
||||
stats() {
|
||||
return this.command.stats
|
||||
const viewportSize = new Vec2(this.gl.viewport.width, this.gl.viewport.height)
|
||||
|
||||
const physicalToNDC = AffineTransform.withTranslation(new Vec2(-1, 1)).times(
|
||||
AffineTransform.withScale(new Vec2(2, -2).dividedByPointwise(viewportSize)),
|
||||
)
|
||||
|
||||
return physicalToNDC.times(configToPhysical)
|
||||
})(),
|
||||
)
|
||||
|
||||
this.gl.setUnpremultipliedBlendState()
|
||||
this.gl.draw(Graphics.Primitive.TRIANGLES, this.material, props.batch.getBuffer())
|
||||
}
|
||||
}
|
||||
|
||||
+24
-21
@@ -1,31 +1,34 @@
|
||||
import regl from 'regl'
|
||||
import {LRUCache} from '../lib/lru-cache'
|
||||
import {RectangleBatch} from './rectangle-batch-renderer'
|
||||
import {CanvasContext} from './canvas-context'
|
||||
import {RectangleBatch, RectangleBatchRenderer} from './rectangle-batch-renderer'
|
||||
import {Rect, Vec2} from '../lib/math'
|
||||
import {Color} from '../lib/color'
|
||||
import {Graphics} from './graphics'
|
||||
import {TextureRenderer} from './texture-renderer'
|
||||
import {renderInto} from './utils'
|
||||
|
||||
export class RowAtlas<K> {
|
||||
texture: regl.Texture
|
||||
private framebuffer: regl.Framebuffer
|
||||
private renderToFramebuffer: regl.Command<{}>
|
||||
private texture: Graphics.Texture
|
||||
private renderTarget: Graphics.RenderTarget
|
||||
private rowCache: LRUCache<K, number>
|
||||
private clearLineBatch: RectangleBatch
|
||||
|
||||
constructor(private canvasContext: CanvasContext) {
|
||||
this.texture = canvasContext.gl.texture({
|
||||
width: Math.min(canvasContext.getMaxTextureSize(), 4096),
|
||||
height: Math.min(canvasContext.getMaxTextureSize(), 4096),
|
||||
wrapS: 'clamp',
|
||||
wrapT: 'clamp',
|
||||
})
|
||||
this.framebuffer = canvasContext.gl.framebuffer({color: [this.texture]})
|
||||
constructor(
|
||||
private gl: Graphics.Context,
|
||||
private rectangleBatchRenderer: RectangleBatchRenderer,
|
||||
private textureRenderer: TextureRenderer,
|
||||
) {
|
||||
this.texture = gl.createTexture(Graphics.TextureFormat.NEAREST_CLAMP, 4096, 4096)
|
||||
this.renderTarget = gl.createRenderTarget(this.texture)
|
||||
this.rowCache = new LRUCache(this.texture.height)
|
||||
this.renderToFramebuffer = canvasContext.gl({
|
||||
framebuffer: this.framebuffer,
|
||||
})
|
||||
this.clearLineBatch = canvasContext.createRectangleBatch()
|
||||
this.clearLineBatch = new RectangleBatch(gl)
|
||||
this.clearLineBatch.addRect(Rect.unit, new Color(0, 0, 0, 0))
|
||||
|
||||
// All of the cached data is stored GPU-side, and we don't retain a copy of
|
||||
// it client-side. This means when we get a context loss event, the data is
|
||||
// totally gone. So let's clear our CPU-side cache to reflect that fact.
|
||||
gl.addContextResetHandler(() => {
|
||||
this.rowCache.clear()
|
||||
})
|
||||
}
|
||||
|
||||
has(key: K) {
|
||||
@@ -53,7 +56,7 @@ export class RowAtlas<K> {
|
||||
}
|
||||
|
||||
writeToAtlasIfNeeded(keys: K[], render: (textureDstRect: Rect, key: K) => void) {
|
||||
this.renderToFramebuffer((context: regl.Context) => {
|
||||
renderInto(this.gl, this.renderTarget, () => {
|
||||
for (let key of keys) {
|
||||
let row = this.rowCache.get(key)
|
||||
if (row != null) {
|
||||
@@ -64,7 +67,7 @@ export class RowAtlas<K> {
|
||||
row = this.allocateLine(key)
|
||||
|
||||
const textureRect = new Rect(new Vec2(0, row), new Vec2(this.texture.width, 1))
|
||||
this.canvasContext.drawRectangleBatch({
|
||||
this.rectangleBatchRenderer.render({
|
||||
batch: this.clearLineBatch,
|
||||
configSpaceSrcRect: Rect.unit,
|
||||
physicalSpaceDstRect: textureRect,
|
||||
@@ -84,7 +87,7 @@ export class RowAtlas<K> {
|
||||
|
||||
// At this point, we have the row in cache, and we can
|
||||
// paint directly from it into the framebuffer.
|
||||
this.canvasContext.drawTexture({
|
||||
this.textureRenderer.render({
|
||||
texture: this.texture,
|
||||
srcRect: textureRect,
|
||||
dstRect: dstRect,
|
||||
|
||||
@@ -1,183 +0,0 @@
|
||||
import regl from 'regl'
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
|
||||
export interface TextureRendererProps {
|
||||
texture: regl.Texture
|
||||
srcRect: Rect
|
||||
dstRect: Rect
|
||||
}
|
||||
|
||||
export class TextureRenderer {
|
||||
private command: regl.Command<TextureRendererProps>
|
||||
constructor(gl: regl.Instance) {
|
||||
this.command = gl({
|
||||
vert: `
|
||||
uniform mat3 uvTransform;
|
||||
uniform mat3 positionTransform;
|
||||
|
||||
attribute vec2 position;
|
||||
attribute vec2 uv;
|
||||
varying vec2 vUv;
|
||||
|
||||
void main() {
|
||||
vUv = (uvTransform * vec3(uv, 1)).xy;
|
||||
gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);
|
||||
}
|
||||
`,
|
||||
frag: `
|
||||
precision mediump float;
|
||||
|
||||
varying vec2 vUv;
|
||||
uniform sampler2D texture;
|
||||
|
||||
void main() {
|
||||
gl_FragColor = texture2D(texture, vUv);
|
||||
}
|
||||
`,
|
||||
|
||||
depth: {
|
||||
enable: false,
|
||||
},
|
||||
|
||||
attributes: {
|
||||
// Cover full canvas with a rectangle
|
||||
// with 2 triangles using a triangle
|
||||
// strip.
|
||||
//
|
||||
// 0 +--+ 1
|
||||
// | /|
|
||||
// |/ |
|
||||
// 2 +--+ 3
|
||||
position: gl.buffer([[-1, 1], [1, 1], [-1, -1], [1, -1]]),
|
||||
uv: gl.buffer([[0, 1], [1, 1], [0, 0], [1, 0]]),
|
||||
},
|
||||
|
||||
uniforms: {
|
||||
texture: (context, props) => props.texture,
|
||||
uvTransform: (context, props) => {
|
||||
const {srcRect, texture} = props
|
||||
const physicalToUV = AffineTransform.withTranslation(new Vec2(0, 1))
|
||||
.times(AffineTransform.withScale(new Vec2(1, -1)))
|
||||
.times(
|
||||
AffineTransform.betweenRects(
|
||||
new Rect(Vec2.zero, new Vec2(texture.width, texture.height)),
|
||||
Rect.unit,
|
||||
),
|
||||
)
|
||||
const uvRect = physicalToUV.transformRect(srcRect)
|
||||
return AffineTransform.betweenRects(Rect.unit, uvRect).flatten()
|
||||
},
|
||||
positionTransform: (context, props) => {
|
||||
const {dstRect} = props
|
||||
|
||||
const viewportSize = new Vec2(context.viewportWidth, context.viewportHeight)
|
||||
|
||||
const physicalToNDC = AffineTransform.withScale(new Vec2(1, -1)).times(
|
||||
AffineTransform.betweenRects(new Rect(Vec2.zero, viewportSize), Rect.NDC),
|
||||
)
|
||||
const ndcRect = physicalToNDC.transformRect(dstRect)
|
||||
return AffineTransform.betweenRects(Rect.NDC, ndcRect).flatten()
|
||||
},
|
||||
},
|
||||
|
||||
primitive: 'triangle strip',
|
||||
|
||||
count: 4,
|
||||
})
|
||||
}
|
||||
|
||||
render(props: TextureRendererProps) {
|
||||
this.command(props)
|
||||
}
|
||||
|
||||
resetStats() {
|
||||
return Object.assign(this.command.stats, {cpuTime: 0, gpuTime: 0, count: 0})
|
||||
}
|
||||
stats() {
|
||||
return this.command.stats
|
||||
}
|
||||
}
|
||||
|
||||
export interface TextureCachedRendererOptions<T> {
|
||||
textureRenderer: TextureRenderer
|
||||
render(t: T): void
|
||||
shouldUpdate(oldProps: T, newProps: T): boolean
|
||||
}
|
||||
|
||||
export class TextureCachedRenderer<T> {
|
||||
private renderUncached: (t: T) => void
|
||||
private shouldUpdate: (oldProps: T, newProps: T) => boolean
|
||||
private texture: regl.Texture
|
||||
private framebuffer: regl.Framebuffer
|
||||
private textureRenderer: TextureRenderer
|
||||
private withContext: regl.Command<{}>
|
||||
|
||||
constructor(private gl: regl.Instance, options: TextureCachedRendererOptions<T>) {
|
||||
this.renderUncached = options.render
|
||||
this.shouldUpdate = options.shouldUpdate
|
||||
this.textureRenderer = options.textureRenderer
|
||||
|
||||
this.texture = gl.texture(1, 1)
|
||||
this.framebuffer = gl.framebuffer({color: [this.texture]})
|
||||
this.withContext = gl({})
|
||||
}
|
||||
|
||||
private lastRenderProps: T | null = null
|
||||
|
||||
private dirty: boolean = false
|
||||
setDirty() {
|
||||
this.dirty = true
|
||||
}
|
||||
|
||||
render(props: T) {
|
||||
this.withContext((context: regl.Context) => {
|
||||
let needsRender = false
|
||||
if (
|
||||
this.texture.width !== context.viewportWidth ||
|
||||
this.texture.height !== context.viewportHeight
|
||||
) {
|
||||
// TODO(jlfwong): Can probably just use this.framebuffer.resize
|
||||
this.texture({width: context.viewportWidth, height: context.viewportHeight})
|
||||
this.framebuffer({color: [this.texture]})
|
||||
needsRender = true
|
||||
} else if (this.lastRenderProps == null) {
|
||||
needsRender = true
|
||||
} else if (this.shouldUpdate(this.lastRenderProps, props)) {
|
||||
needsRender = true
|
||||
} else if (this.dirty) {
|
||||
needsRender = true
|
||||
}
|
||||
|
||||
if (needsRender) {
|
||||
this.gl({
|
||||
viewport: (context, props) => {
|
||||
return {
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: context.viewportWidth,
|
||||
height: context.viewportHeight,
|
||||
}
|
||||
},
|
||||
framebuffer: this.framebuffer,
|
||||
})(() => {
|
||||
this.gl.clear({color: [0, 0, 0, 0]})
|
||||
this.renderUncached(props)
|
||||
})
|
||||
}
|
||||
|
||||
const glViewportRect = new Rect(
|
||||
Vec2.zero,
|
||||
new Vec2(context.viewportWidth, context.viewportHeight),
|
||||
)
|
||||
|
||||
// Render from texture
|
||||
this.textureRenderer.render({
|
||||
texture: this.texture,
|
||||
srcRect: glViewportRect,
|
||||
dstRect: glViewportRect,
|
||||
})
|
||||
this.lastRenderProps = props
|
||||
this.dirty = false
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
import {Graphics} from './graphics'
|
||||
import {setUniformAffineTransform} from './utils'
|
||||
|
||||
export interface TextureRendererProps {
|
||||
texture: Graphics.Texture
|
||||
srcRect: Rect
|
||||
dstRect: Rect
|
||||
}
|
||||
|
||||
const vert = `
|
||||
uniform mat3 uvTransform;
|
||||
uniform mat3 positionTransform;
|
||||
|
||||
attribute vec2 position;
|
||||
attribute vec2 uv;
|
||||
varying vec2 vUv;
|
||||
|
||||
void main() {
|
||||
vUv = (uvTransform * vec3(uv, 1)).xy;
|
||||
gl_Position = vec4((positionTransform * vec3(position, 1)).xy, 0, 1);
|
||||
}
|
||||
`
|
||||
|
||||
const frag = `
|
||||
precision mediump float;
|
||||
|
||||
varying vec2 vUv;
|
||||
uniform sampler2D texture;
|
||||
|
||||
void main() {
|
||||
gl_FragColor = texture2D(texture, vUv);
|
||||
}
|
||||
`
|
||||
|
||||
export interface TextureRendererProps {
|
||||
texture: Graphics.Texture
|
||||
srcRect: Rect
|
||||
dstRect: Rect
|
||||
}
|
||||
|
||||
export class TextureRenderer {
|
||||
private buffer: Graphics.VertexBuffer
|
||||
private material: Graphics.Material
|
||||
|
||||
constructor(private gl: Graphics.Context) {
|
||||
const vertexFormat = new Graphics.VertexFormat()
|
||||
vertexFormat.add('position', Graphics.AttributeType.FLOAT, 2)
|
||||
vertexFormat.add('uv', Graphics.AttributeType.FLOAT, 2)
|
||||
|
||||
const vertices = [
|
||||
{pos: [-1, 1], uv: [0, 1]},
|
||||
{pos: [1, 1], uv: [1, 1]},
|
||||
{pos: [-1, -1], uv: [0, 0]},
|
||||
{pos: [1, -1], uv: [1, 0]},
|
||||
]
|
||||
const floats: number[] = []
|
||||
for (let v of vertices) {
|
||||
floats.push(v.pos[0])
|
||||
floats.push(v.pos[1])
|
||||
floats.push(v.uv[0])
|
||||
floats.push(v.uv[1])
|
||||
}
|
||||
|
||||
this.buffer = gl.createVertexBuffer(vertexFormat.stride * vertices.length)
|
||||
this.buffer.upload(new Uint8Array(new Float32Array(floats).buffer))
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag)
|
||||
}
|
||||
|
||||
render(props: TextureRendererProps) {
|
||||
this.material.setUniformSampler('texture', props.texture, 0)
|
||||
setUniformAffineTransform(
|
||||
this.material,
|
||||
'uvTransform',
|
||||
(() => {
|
||||
const {srcRect, texture} = props
|
||||
const physicalToUV = AffineTransform.withTranslation(new Vec2(0, 1))
|
||||
.times(AffineTransform.withScale(new Vec2(1, -1)))
|
||||
.times(
|
||||
AffineTransform.betweenRects(
|
||||
new Rect(Vec2.zero, new Vec2(texture.width, texture.height)),
|
||||
Rect.unit,
|
||||
),
|
||||
)
|
||||
const uvRect = physicalToUV.transformRect(srcRect)
|
||||
return AffineTransform.betweenRects(Rect.unit, uvRect)
|
||||
})(),
|
||||
)
|
||||
setUniformAffineTransform(
|
||||
this.material,
|
||||
'positionTransform',
|
||||
(() => {
|
||||
const {dstRect} = props
|
||||
|
||||
const {viewport} = this.gl
|
||||
const viewportSize = new Vec2(viewport.width, viewport.height)
|
||||
|
||||
const physicalToNDC = AffineTransform.withScale(new Vec2(1, -1)).times(
|
||||
AffineTransform.betweenRects(new Rect(Vec2.zero, viewportSize), Rect.NDC),
|
||||
)
|
||||
const ndcRect = physicalToNDC.transformRect(dstRect)
|
||||
return AffineTransform.betweenRects(Rect.NDC, ndcRect)
|
||||
})(),
|
||||
)
|
||||
|
||||
this.gl.setUnpremultipliedBlendState()
|
||||
this.gl.draw(Graphics.Primitive.TRIANGLE_STRIP, this.material, this.buffer)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import {Graphics} from './graphics'
|
||||
import {AffineTransform, Vec2} from '../lib/math'
|
||||
|
||||
export function setUniformAffineTransform(
|
||||
material: Graphics.Material,
|
||||
name: string,
|
||||
transform: AffineTransform,
|
||||
) {
|
||||
let {m00, m01, m02, m10, m11, m12} = transform
|
||||
material.setUniformMat3(name, m00, m01, m02, m10, m11, m12, 0, 0, 1)
|
||||
}
|
||||
export function setUniformVec2(material: Graphics.Material, name: string, vec: Vec2) {
|
||||
material.setUniformVec2(name, vec.x, vec.y)
|
||||
}
|
||||
|
||||
export function renderInto(gl: Graphics.Context, target: Graphics.RenderTarget, cb: () => void) {
|
||||
gl.setRenderTarget(target)
|
||||
gl.setViewport(0, 0, target.texture.width, target.texture.height)
|
||||
cb()
|
||||
gl.setRenderTarget(null)
|
||||
}
|
||||
@@ -40,6 +40,7 @@ Object {
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "simple.txt",
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
@@ -48,3 +49,61 @@ Object {
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromBGFlameGraph with CRLF 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "a",
|
||||
"line": undefined,
|
||||
"name": "a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "b",
|
||||
"line": undefined,
|
||||
"name": "b",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "c",
|
||||
"line": undefined,
|
||||
"name": "c",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "d",
|
||||
"line": undefined,
|
||||
"name": "d",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "simple-crlf.txt",
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
"a;b;c 3",
|
||||
"a;b 5",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromBGFlameGraph with CRLF: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph with CRLF: profileGroup.name 1`] = `"simple-crlf.txt"`;
|
||||
|
||||
exports[`importFromBGFlameGraph: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph: profileGroup.name 1`] = `"simple.txt"`;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -40,7 +40,9 @@ Object {
|
||||
"totalWeight": 11.021373999974458,
|
||||
},
|
||||
],
|
||||
"name": "simple-firefox.json",
|
||||
"stacks": Array [
|
||||
" 2.04ms",
|
||||
"a;b;d 989.53µs",
|
||||
"a;c;d 1.02ms",
|
||||
"a;b;d 982.04µs",
|
||||
@@ -58,6 +60,71 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromFirefox ignore self-hosted 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:1",
|
||||
"key": "alpha (http://localhost:8000/simple.js:1:14)",
|
||||
"line": 14,
|
||||
"name": "alpha",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 26.983816999942064,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:14",
|
||||
"key": "delta (http://localhost:8000/simple.js:14:14)",
|
||||
"line": 14,
|
||||
"name": "delta",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 11.946324001066387,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:20",
|
||||
"key": "gamma (http://localhost:8000/simple.js:20:14)",
|
||||
"line": 14,
|
||||
"name": "gamma",
|
||||
"selfWeight": 26.983816999942064,
|
||||
"totalWeight": 26.983816999942064,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:8",
|
||||
"key": "beta (http://localhost:8000/simple.js:8:13)",
|
||||
"line": 13,
|
||||
"name": "beta",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 15.037492998875678,
|
||||
},
|
||||
],
|
||||
"name": "simple-firefox.json",
|
||||
"stacks": Array [
|
||||
" 4.61ms",
|
||||
"alpha;delta;gamma 999.57µs",
|
||||
"alpha;beta;gamma 2.01ms",
|
||||
"alpha;delta;gamma 1.00ms",
|
||||
"alpha;beta;gamma 995.68µs",
|
||||
"alpha;delta;gamma 996.27µs",
|
||||
"alpha;beta;gamma 4.01ms",
|
||||
"alpha;delta;gamma 2.02ms",
|
||||
"alpha;beta;gamma 959.44µs",
|
||||
"alpha;delta;gamma 2.01ms",
|
||||
"alpha;beta;gamma 4.01ms",
|
||||
"alpha;delta;gamma 959.28µs",
|
||||
"alpha;beta;gamma 2.03ms",
|
||||
"alpha;delta;gamma 3.96ms",
|
||||
"alpha;beta;gamma 1.02ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromFirefox ignore self-hosted: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromFirefox ignore self-hosted: profileGroup.name 1`] = `"simple-firefox.json"`;
|
||||
|
||||
exports[`importFromFirefox recursion 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -107,7 +174,9 @@ Object {
|
||||
"totalWeight": 9.954629999992903,
|
||||
},
|
||||
],
|
||||
"name": "recursion.json",
|
||||
"stacks": Array [
|
||||
" 1.71ms",
|
||||
"main;alpha;beta;alpha;beta;alpha;beta;alpha;delta;gamma 998.89µs",
|
||||
"main 1.19ms",
|
||||
"main;alpha;beta;alpha;delta;gamma 1.83ms",
|
||||
@@ -120,3 +189,11 @@ Object {
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
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"`;
|
||||
|
||||
@@ -0,0 +1,864 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importFromHaskell 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 144,
|
||||
"line": undefined,
|
||||
"name": "MAIN.MAIN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 798,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 56,
|
||||
"line": undefined,
|
||||
"name": "GHC.Conc.Signal.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 73,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 75,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.Iconv.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 84,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Handle.FD.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 119,
|
||||
"line": undefined,
|
||||
"name": "Text.Printf.CAF",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 26,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta1_r6nI",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(21,1)-(38,42)",
|
||||
"key": 19,
|
||||
"line": undefined,
|
||||
"name": "Main.main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 733,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(56,1)-(57,42)",
|
||||
"key": 4,
|
||||
"line": undefined,
|
||||
"name": "Main.check",
|
||||
"selfWeight": 320,
|
||||
"totalWeight": 320,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:31:9-29",
|
||||
"key": 16,
|
||||
"line": undefined,
|
||||
"name": "Main.main.long",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 28,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta_r6nG",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 35,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:io1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 27,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl2_r6nH",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(61,1)-(63,26)",
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "Main.make",
|
||||
"selfWeight": 406,
|
||||
"totalWeight": 409,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:19-26",
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "Main.make.d2",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:9-16",
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "Main.make.i2",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 24,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl4_r6nL",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 22,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl8_r6nP",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 21,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 29,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main11",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:27:9-35",
|
||||
"key": 15,
|
||||
"line": undefined,
|
||||
"name": "Main.main.c",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 8,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 30,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main12",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 23,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main5",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 31,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main7",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 25,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main9",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-12",
|
||||
"key": 33,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_maxN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-35",
|
||||
"key": 13,
|
||||
"line": undefined,
|
||||
"name": "Main.main.maxN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9",
|
||||
"key": 34,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9-14",
|
||||
"key": 12,
|
||||
"line": undefined,
|
||||
"name": "Main.main.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-16",
|
||||
"key": 32,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_stretchN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-27",
|
||||
"key": 14,
|
||||
"line": undefined,
|
||||
"name": "Main.main.stretchN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-4",
|
||||
"key": 36,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-8",
|
||||
"key": 9,
|
||||
"line": undefined,
|
||||
"name": "Main.minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 146,
|
||||
"line": undefined,
|
||||
"name": "GC.GC",
|
||||
"selfWeight": 46,
|
||||
"totalWeight": 46,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 147,
|
||||
"line": undefined,
|
||||
"name": "PROFILING.OVERHEAD_of",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 145,
|
||||
"line": undefined,
|
||||
"name": "SYSTEM.SYSTEM",
|
||||
"selfWeight": 19,
|
||||
"totalWeight": 19,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:35:26-54",
|
||||
"key": 18,
|
||||
"line": undefined,
|
||||
"name": "Main.main.\\\\",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:19:1-56",
|
||||
"key": 8,
|
||||
"line": undefined,
|
||||
"name": "Main.io",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:34:9-28",
|
||||
"key": 17,
|
||||
"line": undefined,
|
||||
"name": "Main.main.vs",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 721,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(42,1)-(45,38)",
|
||||
"key": 11,
|
||||
"line": undefined,
|
||||
"name": "Main.depth",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 721,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(49,1)-(52,31)",
|
||||
"key": 7,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 721,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:51:9-31",
|
||||
"key": 6,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.a",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 369,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:52:9-31",
|
||||
"key": 5,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.b",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 352,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:45:9-38",
|
||||
"key": 10,
|
||||
"line": undefined,
|
||||
"name": "Main.depth.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
],
|
||||
"name": "binary-trees time",
|
||||
"stacks": Array [
|
||||
"MAIN.MAIN;Main.CAF:eta1_r6nI;Main.main;Main.check 1.00ms",
|
||||
"MAIN.MAIN;Main.CAF:lvl2_r6nH;Main.main;Main.main.long;Main.make 3.00ms",
|
||||
"MAIN.MAIN;Main.CAF:main11;Main.main;Main.main.c;Main.check 4.00ms",
|
||||
"MAIN.MAIN;Main.CAF:main12;Main.main;Main.main.c;Main.make 4.00ms",
|
||||
"MAIN.MAIN;GC.GC 46.00ms",
|
||||
"MAIN.MAIN;SYSTEM.SYSTEM 19.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.check 153.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make;Main.make.d2 2.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make;Main.make.i2 1.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make 210.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a 3.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.check 162.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.make 189.00ms",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b 1.00ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromHaskell 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 144,
|
||||
"line": undefined,
|
||||
"name": "MAIN.MAIN",
|
||||
"selfWeight": 648,
|
||||
"totalWeight": 1921672664,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 56,
|
||||
"line": undefined,
|
||||
"name": "GHC.Conc.Signal.CAF",
|
||||
"selfWeight": 640,
|
||||
"totalWeight": 640,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 73,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.CAF",
|
||||
"selfWeight": 2768,
|
||||
"totalWeight": 2768,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 75,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Encoding.Iconv.CAF",
|
||||
"selfWeight": 200,
|
||||
"totalWeight": 200,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 84,
|
||||
"line": undefined,
|
||||
"name": "GHC.IO.Handle.FD.CAF",
|
||||
"selfWeight": 34704,
|
||||
"totalWeight": 34704,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 119,
|
||||
"line": undefined,
|
||||
"name": "Text.Printf.CAF",
|
||||
"selfWeight": 528,
|
||||
"totalWeight": 528,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 26,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta1_r6nI",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2097152,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(21,1)-(38,42)",
|
||||
"key": 19,
|
||||
"line": undefined,
|
||||
"name": "Main.main",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 1921591544,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(56,1)-(57,42)",
|
||||
"key": 4,
|
||||
"line": undefined,
|
||||
"name": "Main.check",
|
||||
"selfWeight": 406149056,
|
||||
"totalWeight": 406149056,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:31:9-29",
|
||||
"key": 16,
|
||||
"line": undefined,
|
||||
"name": "Main.main.long",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 7864112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 28,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:eta_r6nG",
|
||||
"selfWeight": 1096,
|
||||
"totalWeight": 1096,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 35,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:io1",
|
||||
"selfWeight": 1888,
|
||||
"totalWeight": 1888,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 27,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl2_r6nH",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 7864112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(61,1)-(63,26)",
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "Main.make",
|
||||
"selfWeight": 1512575520,
|
||||
"totalWeight": 1512575520,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:19-26",
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "Main.make.d2",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:63:9-16",
|
||||
"key": 2,
|
||||
"line": undefined,
|
||||
"name": "Main.make.i2",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 24,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl4_r6nL",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 22,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:lvl8_r6nP",
|
||||
"selfWeight": 520,
|
||||
"totalWeight": 520,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 21,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main1",
|
||||
"selfWeight": 16,
|
||||
"totalWeight": 16,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 29,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main11",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4194304,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:27:9-35",
|
||||
"key": 15,
|
||||
"line": undefined,
|
||||
"name": "Main.main.c",
|
||||
"selfWeight": 64,
|
||||
"totalWeight": 19922736,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 30,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main12",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 15728432,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 23,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main5",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 31,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main7",
|
||||
"selfWeight": 880,
|
||||
"totalWeight": 880,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 25,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main9",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-12",
|
||||
"key": 33,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_maxN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:23:9-35",
|
||||
"key": 13,
|
||||
"line": undefined,
|
||||
"name": "Main.main.maxN",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9",
|
||||
"key": 34,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:22:9-14",
|
||||
"key": 12,
|
||||
"line": undefined,
|
||||
"name": "Main.main.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-16",
|
||||
"key": 32,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:main_stretchN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:24:9-27",
|
||||
"key": 14,
|
||||
"line": undefined,
|
||||
"name": "Main.main.stretchN",
|
||||
"selfWeight": 32,
|
||||
"totalWeight": 32,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-4",
|
||||
"key": 36,
|
||||
"line": undefined,
|
||||
"name": "Main.CAF:minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:17:1-8",
|
||||
"key": 9,
|
||||
"line": undefined,
|
||||
"name": "Main.minN",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 146,
|
||||
"line": undefined,
|
||||
"name": "GC.GC",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 147,
|
||||
"line": undefined,
|
||||
"name": "PROFILING.OVERHEAD_of",
|
||||
"selfWeight": 2496,
|
||||
"totalWeight": 2496,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": 145,
|
||||
"line": undefined,
|
||||
"name": "SYSTEM.SYSTEM",
|
||||
"selfWeight": 34736,
|
||||
"totalWeight": 34736,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:35:26-54",
|
||||
"key": 18,
|
||||
"line": undefined,
|
||||
"name": "Main.main.\\\\",
|
||||
"selfWeight": 2224,
|
||||
"totalWeight": 46672,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:19:1-56",
|
||||
"key": 8,
|
||||
"line": undefined,
|
||||
"name": "Main.io",
|
||||
"selfWeight": 67912,
|
||||
"totalWeight": 67912,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:34:9-28",
|
||||
"key": 17,
|
||||
"line": undefined,
|
||||
"name": "Main.main.vs",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1891637344,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(42,1)-(45,38)",
|
||||
"key": 11,
|
||||
"line": undefined,
|
||||
"name": "Main.depth",
|
||||
"selfWeight": 1120,
|
||||
"totalWeight": 1891637344,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:(49,1)-(52,31)",
|
||||
"key": 7,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1891636224,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:51:9-31",
|
||||
"key": 6,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.a",
|
||||
"selfWeight": 1397760,
|
||||
"totalWeight": 945818112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:52:9-31",
|
||||
"key": 5,
|
||||
"line": undefined,
|
||||
"name": "Main.sumT.b",
|
||||
"selfWeight": 1397760,
|
||||
"totalWeight": 945818112,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "src/Main.hs:45:9-38",
|
||||
"key": 10,
|
||||
"line": undefined,
|
||||
"name": "Main.depth.n",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
],
|
||||
"name": "binary-trees allocation",
|
||||
"stacks": Array [
|
||||
"MAIN.MAIN;GHC.Conc.Signal.CAF 640 B",
|
||||
"MAIN.MAIN;GHC.IO.Encoding.CAF 2.70 KB",
|
||||
"MAIN.MAIN;GHC.IO.Encoding.Iconv.CAF 200 B",
|
||||
"MAIN.MAIN;GHC.IO.Handle.FD.CAF 33.89 KB",
|
||||
"MAIN.MAIN;Text.Printf.CAF 528 B",
|
||||
"MAIN.MAIN;Main.CAF:eta1_r6nI;Main.main;Main.check 2.00 MB",
|
||||
"MAIN.MAIN;Main.CAF:eta1_r6nI;Main.main 32 B",
|
||||
"MAIN.MAIN;Main.CAF:eta_r6nG 1.07 KB",
|
||||
"MAIN.MAIN;Main.CAF:io1 1.84 KB",
|
||||
"MAIN.MAIN;Main.CAF:lvl2_r6nH;Main.main;Main.main.long;Main.make 7.50 MB",
|
||||
"MAIN.MAIN;Main.CAF:lvl2_r6nH;Main.main;Main.main.long 32 B",
|
||||
"MAIN.MAIN;Main.CAF:lvl8_r6nP 520 B",
|
||||
"MAIN.MAIN;Main.CAF:main1 16 B",
|
||||
"MAIN.MAIN;Main.CAF:main11;Main.main;Main.main.c;Main.check 4.00 MB",
|
||||
"MAIN.MAIN;Main.CAF:main11;Main.main;Main.main.c 32 B",
|
||||
"MAIN.MAIN;Main.CAF:main12;Main.main;Main.main.c;Main.make 15.00 MB",
|
||||
"MAIN.MAIN;Main.CAF:main12;Main.main;Main.main.c 32 B",
|
||||
"MAIN.MAIN;Main.CAF:main7 880 B",
|
||||
"MAIN.MAIN;Main.CAF:main_maxN;Main.main;Main.main.maxN 32 B",
|
||||
"MAIN.MAIN;Main.CAF:main_stretchN;Main.main;Main.main.stretchN 32 B",
|
||||
"MAIN.MAIN;PROFILING.OVERHEAD_of 2.44 KB",
|
||||
"MAIN.MAIN;SYSTEM.SYSTEM 33.92 KB",
|
||||
"MAIN.MAIN;Main.main;Main.main.\\\\;Main.io 43.41 KB",
|
||||
"MAIN.MAIN;Main.main;Main.main.\\\\ 2.17 KB",
|
||||
"MAIN.MAIN;Main.main;Main.io 22.91 KB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.check 190.67 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a;Main.make 710.00 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.a 1.33 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.check 190.67 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b;Main.make 710.00 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth;Main.sumT;Main.sumT.b 1.33 MB",
|
||||
"MAIN.MAIN;Main.main;Main.main.vs;Main.depth 1.09 KB",
|
||||
"MAIN.MAIN 648 B",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromHaskell: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromHaskell: profileGroup.name 1`] = `"binary-trees"`;
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,249 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importAsPprofProfile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.main:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 136,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/jlfwong/code/speedscope/sample/programs/go/simple.go",
|
||||
"key": "main.main:/Users/jlfwong/code/speedscope/sample/programs/go/simple.go:0",
|
||||
"line": 0,
|
||||
"name": "main.main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 136,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/jlfwong/code/speedscope/sample/programs/go/simple.go",
|
||||
"key": "main.delta:/Users/jlfwong/code/speedscope/sample/programs/go/simple.go:0",
|
||||
"line": 0,
|
||||
"name": "main.delta",
|
||||
"selfWeight": 22,
|
||||
"totalWeight": 58,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/jlfwong/code/speedscope/sample/programs/go/simple.go",
|
||||
"key": "main.beta:/Users/jlfwong/code/speedscope/sample/programs/go/simple.go:0",
|
||||
"line": 0,
|
||||
"name": "main.beta",
|
||||
"selfWeight": 39,
|
||||
"totalWeight": 39,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/jlfwong/code/speedscope/sample/programs/go/simple.go",
|
||||
"key": "main.alpha:/Users/jlfwong/code/speedscope/sample/programs/go/simple.go:0",
|
||||
"line": 0,
|
||||
"name": "main.alpha",
|
||||
"selfWeight": 48,
|
||||
"totalWeight": 48,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/jlfwong/code/speedscope/sample/programs/go/simple.go",
|
||||
"key": "main.gamma:/Users/jlfwong/code/speedscope/sample/programs/go/simple.go:0",
|
||||
"line": 0,
|
||||
"name": "main.gamma",
|
||||
"selfWeight": 27,
|
||||
"totalWeight": 27,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/asm_amd64.s",
|
||||
"key": "runtime.morestack:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/asm_amd64.s:0",
|
||||
"line": 0,
|
||||
"name": "runtime.morestack",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 11,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/stack.go",
|
||||
"key": "runtime.newstack:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/stack.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.newstack",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 11,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/duff_amd64.s",
|
||||
"key": "runtime.duffcopy:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/duff_amd64.s:0",
|
||||
"line": 0,
|
||||
"name": "runtime.duffcopy",
|
||||
"selfWeight": 11,
|
||||
"totalWeight": 11,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/time.go",
|
||||
"key": "runtime.timerproc:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/time.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.timerproc",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/time.go",
|
||||
"key": "runtime.goroutineReady:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/time.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.goroutineReady",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.goready:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.goready",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/asm_amd64.s",
|
||||
"key": "runtime.systemstack:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/asm_amd64.s:0",
|
||||
"line": 0,
|
||||
"name": "runtime.systemstack",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.goready.func1:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.goready.func1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.ready:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.ready",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.wakep:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.wakep",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.startm:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.startm",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/lock_sema.go",
|
||||
"key": "runtime.notewakeup:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/lock_sema.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.notewakeup",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/os_darwin.go",
|
||||
"key": "runtime.semawakeup:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/os_darwin.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.semawakeup",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/os_darwin.go",
|
||||
"key": "runtime.mach_semrelease:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/os_darwin.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.mach_semrelease",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/sys_darwin_amd64.s",
|
||||
"key": "runtime.mach_semaphore_signal:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/sys_darwin_amd64.s:0",
|
||||
"line": 0,
|
||||
"name": "runtime.mach_semaphore_signal",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.mstart:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.mstart",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.mstart1:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.mstart1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go",
|
||||
"key": "runtime.sysmon:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/proc.go:0",
|
||||
"line": 0,
|
||||
"name": "runtime.sysmon",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/usr/local/Cellar/go/1.10.1/libexec/src/runtime/sys_darwin_amd64.s",
|
||||
"key": "runtime.usleep:/usr/local/Cellar/go/1.10.1/libexec/src/runtime/sys_darwin_amd64.s:0",
|
||||
"line": 0,
|
||||
"name": "runtime.usleep",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
],
|
||||
"name": "simple.prof",
|
||||
"stacks": Array [
|
||||
"runtime.main;main.main;main.delta;main.beta 14",
|
||||
"runtime.main;main.main;main.alpha 26",
|
||||
"runtime.main;main.main;main.gamma 27",
|
||||
"runtime.morestack;runtime.newstack;runtime.duffcopy 11",
|
||||
"runtime.main;main.main;main.beta 25",
|
||||
"runtime.main;main.main;main.delta 22",
|
||||
"runtime.main;main.main;main.delta;main.alpha 22",
|
||||
"runtime.timerproc;runtime.goroutineReady;runtime.goready;runtime.systemstack;runtime.goready.func1;runtime.ready;runtime.wakep;runtime.startm;runtime.notewakeup;runtime.semawakeup;runtime.mach_semrelease;runtime.mach_semaphore_signal 1",
|
||||
"runtime.mstart;runtime.mstart1;runtime.sysmon;runtime.usleep 2",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importAsPprofProfile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importAsPprofProfile: profileGroup.name 1`] = `"simple.prof"`;
|
||||
@@ -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"`;
|
||||
|
||||
@@ -0,0 +1,528 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importTraceEvents bad E events 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 12,
|
||||
"totalWeight": 12,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 12.00µs",
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents bad E events: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents bad E events: profileGroup.name 1`] = `"too-many-end-events.json"`;
|
||||
|
||||
exports[`importTraceEvents event re-ordering 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A",
|
||||
"line": undefined,
|
||||
"name": "A",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "B",
|
||||
"line": undefined,
|
||||
"name": "B",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "C",
|
||||
"line": undefined,
|
||||
"name": "C",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "X",
|
||||
"line": undefined,
|
||||
"name": "X",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 1",
|
||||
"stacks": Array [
|
||||
"A;B;C 1.00µs",
|
||||
"A;B 1.00µs",
|
||||
"A 1.00µs",
|
||||
" 1.00µs",
|
||||
"A 1.00µs",
|
||||
"A;B 1.00µs",
|
||||
"A;B;C 1.00µs",
|
||||
"X 3.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents event re-ordering: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents event re-ordering: profileGroup.name 1`] = `"must-retain-original-order.json"`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p0 (pid 0), p0t0 (tid 0)",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p0 (pid 0), p0t1 (tid 1)",
|
||||
"stacks": Array [
|
||||
"beta 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 3`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma",
|
||||
"line": undefined,
|
||||
"name": "gamma",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p1 (pid 1), p1t0 (tid 0)",
|
||||
"stacks": Array [
|
||||
"gamma 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 4`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "delta",
|
||||
"line": undefined,
|
||||
"name": "delta",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p1 (pid 1), p1t1 (tid 1)",
|
||||
"stacks": Array [
|
||||
"delta 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 5`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "epsilon",
|
||||
"line": undefined,
|
||||
"name": "epsilon",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p2t0 (pid 2, tid 0)",
|
||||
"stacks": Array [
|
||||
"epsilon 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 6`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "phi",
|
||||
"line": undefined,
|
||||
"name": "phi",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p2t1 (pid 2, tid 1)",
|
||||
"stacks": Array [
|
||||
"phi 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 7`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "zeta",
|
||||
"line": undefined,
|
||||
"name": "zeta",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p3 (pid 3, tid 0)",
|
||||
"stacks": Array [
|
||||
"zeta 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 8`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "eta",
|
||||
"line": undefined,
|
||||
"name": "eta",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "p3 (pid 3, tid 1)",
|
||||
"stacks": Array [
|
||||
"eta 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents multiprocess: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents multiprocess: profileGroup.name 1`] = `"multiprocess.json"`;
|
||||
|
||||
exports[`importTraceEvents partial json import 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 12,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"line": undefined,
|
||||
"name": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "epsilon",
|
||||
"line": undefined,
|
||||
"name": "epsilon",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha;beta;gamma {\\"detail\\":\\"foobar\\"} 5.00µs",
|
||||
"alpha;beta;epsilon 4.00µs",
|
||||
"alpha;beta 2.00µs",
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents partial json import trailing comma 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 12,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"line": undefined,
|
||||
"name": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "epsilon",
|
||||
"line": undefined,
|
||||
"name": "epsilon",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha;beta;gamma {\\"detail\\":\\"foobar\\"} 5.00µs",
|
||||
"alpha;beta;epsilon 4.00µs",
|
||||
"alpha;beta 2.00µs",
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents partial json import trailing comma: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents partial json import trailing comma: profileGroup.name 1`] = `"simple-partial-trailing-comma.json"`;
|
||||
|
||||
exports[`importTraceEvents partial json import whitespace padding 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 12,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"line": undefined,
|
||||
"name": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "epsilon",
|
||||
"line": undefined,
|
||||
"name": "epsilon",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha;beta;gamma {\\"detail\\":\\"foobar\\"} 5.00µs",
|
||||
"alpha;beta;epsilon 4.00µs",
|
||||
"alpha;beta 2.00µs",
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents partial json import whitespace padding: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents partial json import whitespace padding: profileGroup.name 1`] = `"simple-partial-whitespace.json"`;
|
||||
|
||||
exports[`importTraceEvents partial json import: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents partial json import: profileGroup.name 1`] = `"simple-partial.json"`;
|
||||
|
||||
exports[`importTraceEvents simple 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 12,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"line": undefined,
|
||||
"name": "gamma {\\"detail\\":\\"foobar\\"}",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "epsilon",
|
||||
"line": undefined,
|
||||
"name": "epsilon",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha;beta;gamma {\\"detail\\":\\"foobar\\"} 5.00µs",
|
||||
"alpha;beta;epsilon 4.00µs",
|
||||
"alpha;beta 2.00µs",
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents simple object 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 8,
|
||||
"totalWeight": 12,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "(unnamed)",
|
||||
"line": undefined,
|
||||
"name": "(unnamed)",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 6.00µs",
|
||||
"alpha;beta;(unnamed) 4.00µs",
|
||||
"alpha;beta 2.00µs",
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents simple object: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents simple object: profileGroup.name 1`] = `"simple-object.json"`;
|
||||
|
||||
exports[`importTraceEvents simple: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents simple: profileGroup.name 1`] = `"simple.json"`;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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"`;
|
||||
|
||||
@@ -3,3 +3,7 @@ import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
test('importFromBGFlameGraph', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple.txt')
|
||||
})
|
||||
|
||||
test('importFromBGFlameGraph with CRLF', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple-crlf.txt')
|
||||
})
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -7,3 +7,19 @@ test('importFromChromeCPUProfile', async () => {
|
||||
test('importFromChromeTimeline', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/65/simple-timeline.json')
|
||||
})
|
||||
|
||||
test('importFromChromeTimeline Chrome 69', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/69/simple.json')
|
||||
})
|
||||
|
||||
test('importFromV8Profiler Node 10', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/node/10.11.0/example.cpuprofile')
|
||||
})
|
||||
|
||||
test('importFromChromeTimeline Workers Chrome 66', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/66/worker.json')
|
||||
})
|
||||
|
||||
test('importFromChromeTimeline Workers Chrome 70', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/70/worker.json')
|
||||
})
|
||||
|
||||
+157
-30
@@ -1,6 +1,9 @@
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder} from '../lib/profile'
|
||||
import {getOrInsert, lastOf} from '../lib/utils'
|
||||
import {Profile, FrameInfo, CallTreeProfileBuilder, ProfileGroup} from '../lib/profile'
|
||||
import {getOrInsert, lastOf, sortBy, itForEach} from '../lib/utils'
|
||||
import {TimeFormatter} from '../lib/value-formatters'
|
||||
import {chromeTreeToNodes, OldCPUProfile} from './v8cpuFormatter'
|
||||
|
||||
// See: https://github.com/v8/v8/blob/master/src/inspector/js_protocol.json
|
||||
|
||||
interface TimelineEvent {
|
||||
pid: number
|
||||
@@ -13,6 +16,7 @@ interface TimelineEvent {
|
||||
tdur: number
|
||||
tts: number
|
||||
args: {[key: string]: any}
|
||||
id?: string
|
||||
}
|
||||
|
||||
interface PositionTickInfo {
|
||||
@@ -28,7 +32,7 @@ interface CPUProfileCallFrame {
|
||||
url: string
|
||||
}
|
||||
|
||||
interface CPUProfileNode {
|
||||
export interface CPUProfileNode {
|
||||
callFrame: CPUProfileCallFrame
|
||||
hitCount: number
|
||||
id: number
|
||||
@@ -37,7 +41,7 @@ interface CPUProfileNode {
|
||||
parent?: CPUProfileNode
|
||||
}
|
||||
|
||||
interface CPUProfile {
|
||||
export interface CPUProfile {
|
||||
startTime: number
|
||||
endTime: number
|
||||
nodes: CPUProfileNode[]
|
||||
@@ -45,16 +49,120 @@ interface CPUProfile {
|
||||
timeDeltas: number[]
|
||||
}
|
||||
|
||||
export function importFromChromeTimeline(events: TimelineEvent[]): Profile {
|
||||
export function isChromeTimeline(rawProfile: any): boolean {
|
||||
if (!Array.isArray(rawProfile)) return false
|
||||
if (rawProfile.length < 1) return false
|
||||
const first = rawProfile[0]
|
||||
if (!('pid' in first && 'tid' in first && 'ph' in first && 'cat' in first)) return false
|
||||
if (
|
||||
!rawProfile.find(
|
||||
e => e.name === 'CpuProfile' || e.name === 'Profile' || e.name === 'ProfileChunk',
|
||||
)
|
||||
)
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
||||
export function importFromChromeTimeline(events: TimelineEvent[], fileName: string): ProfileGroup {
|
||||
// It seems like sometimes Chrome timeline files contain multiple CpuProfiles?
|
||||
// For now, choose the first one in the list.
|
||||
|
||||
const cpuProfileByID = new Map<string, CPUProfile>()
|
||||
|
||||
// Maps profile IDs (like "0x3") to pid/tid pairs formatted as `${pid}:${tid}`
|
||||
const pidTidById = new Map<string, string>()
|
||||
|
||||
// Maps pid/tid pairs to thread names
|
||||
const threadNameByPidTid = new Map<string, string>()
|
||||
|
||||
// The events aren't necessarily recorded in chronological order. Sort them so
|
||||
// that they are.
|
||||
sortBy(events, e => e.ts)
|
||||
|
||||
for (let event of events) {
|
||||
if (event.name == 'CpuProfile') {
|
||||
const chromeProfile = event.args.data.cpuProfile as CPUProfile
|
||||
return importFromChromeCPUProfile(chromeProfile)
|
||||
if (event.name === 'CpuProfile') {
|
||||
const pidTid = `${event.pid}:${event.tid}`
|
||||
const id = event.id || pidTid
|
||||
cpuProfileByID.set(id, event.args.data.cpuProfile as CPUProfile)
|
||||
pidTidById.set(id, pidTid)
|
||||
}
|
||||
|
||||
if (event.name === 'Profile') {
|
||||
const pidTid = `${event.pid}:${event.tid}`
|
||||
cpuProfileByID.set(event.id || pidTid, {
|
||||
startTime: 0,
|
||||
endTime: 0,
|
||||
nodes: [],
|
||||
samples: [],
|
||||
timeDeltas: [],
|
||||
...event.args.data,
|
||||
})
|
||||
|
||||
if (event.id) {
|
||||
pidTidById.set(event.id, `${event.pid}:${event.tid}`)
|
||||
}
|
||||
}
|
||||
|
||||
if (event.name === 'thread_name') {
|
||||
threadNameByPidTid.set(`${event.pid}:${event.tid}`, event.args.name)
|
||||
}
|
||||
|
||||
if (event.name === 'ProfileChunk') {
|
||||
const pidTid = `${event.pid}:${event.tid}`
|
||||
const cpuProfile = cpuProfileByID.get(event.id || pidTid)
|
||||
if (cpuProfile) {
|
||||
const chunk = event.args.data
|
||||
if (chunk.cpuProfile) {
|
||||
if (chunk.cpuProfile.nodes) {
|
||||
cpuProfile.nodes = cpuProfile.nodes.concat(chunk.cpuProfile.nodes)
|
||||
}
|
||||
if (chunk.cpuProfile.samples) {
|
||||
cpuProfile.samples = cpuProfile.samples.concat(chunk.cpuProfile.samples)
|
||||
}
|
||||
}
|
||||
if (chunk.timeDeltas) {
|
||||
cpuProfile.timeDeltas = cpuProfile.timeDeltas.concat(chunk.timeDeltas)
|
||||
}
|
||||
if (chunk.startTime != null) {
|
||||
cpuProfile.startTime = chunk.startTime
|
||||
}
|
||||
if (chunk.endTime != null) {
|
||||
cpuProfile.endTime = chunk.endTime
|
||||
}
|
||||
} else {
|
||||
console.warn(`Ignoring ProfileChunk for undeclared Profile with id ${event.id || pidTid}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new Error('Could not find CPU profile in Timeline')
|
||||
|
||||
if (cpuProfileByID.size > 0) {
|
||||
const profiles: Profile[] = []
|
||||
let indexToView = 0
|
||||
|
||||
itForEach(cpuProfileByID.keys(), profileId => {
|
||||
let threadName: string | null = null
|
||||
let pidTid = pidTidById.get(profileId)
|
||||
if (pidTid) {
|
||||
threadName = threadNameByPidTid.get(pidTid) || null
|
||||
if (threadName) {
|
||||
}
|
||||
}
|
||||
const profile = importFromChromeCPUProfile(cpuProfileByID.get(profileId)!)
|
||||
if (threadName && cpuProfileByID.size > 1) {
|
||||
profile.setName(`${fileName} - ${threadName}`)
|
||||
if (threadName === 'CrRendererMain') {
|
||||
indexToView = profiles.length
|
||||
}
|
||||
} else {
|
||||
profile.setName(`${fileName}`)
|
||||
}
|
||||
profiles.push(profile)
|
||||
})
|
||||
|
||||
return {name: fileName, indexToView, profiles}
|
||||
} else {
|
||||
throw new Error('Could not find CPU profile in Timeline')
|
||||
}
|
||||
}
|
||||
|
||||
const callFrameToFrameInfo = new Map<CPUProfileCallFrame, FrameInfo>()
|
||||
@@ -74,7 +182,14 @@ function frameInfoForCallFrame(callFrame: CPUProfileCallFrame) {
|
||||
})
|
||||
}
|
||||
|
||||
function shouldIgnoreFunction(functionName: string) {
|
||||
function shouldIgnoreFunction(callFrame: CPUProfileCallFrame) {
|
||||
const {functionName, url} = callFrame
|
||||
if (url === 'native dummy.js') {
|
||||
// I'm not really sure what this is about, but this seems to be used
|
||||
// as a way of avoiding edge cases in V8's implementation.
|
||||
// See: https://github.com/v8/v8/blob/b8626ca4/tools/js2c.py#L419-L424
|
||||
return true
|
||||
}
|
||||
return functionName === '(root)' || functionName === '(idle)'
|
||||
}
|
||||
|
||||
@@ -90,6 +205,10 @@ export function importFromChromeCPUProfile(chromeProfile: CPUProfile): Profile {
|
||||
nodeById.set(node.id, node)
|
||||
}
|
||||
for (let node of chromeProfile.nodes) {
|
||||
if (typeof node.parent === 'number') {
|
||||
node.parent = nodeById.get(node.parent)
|
||||
}
|
||||
|
||||
if (!node.children) continue
|
||||
for (let childId of node.children) {
|
||||
const child = nodeById.get(childId)
|
||||
@@ -99,9 +218,12 @@ export function importFromChromeCPUProfile(chromeProfile: CPUProfile): Profile {
|
||||
}
|
||||
|
||||
const samples: number[] = []
|
||||
const timeDeltas: number[] = []
|
||||
const sampleTimes: number[] = []
|
||||
|
||||
// The first delta is relative to the profile startTime.
|
||||
// Ref: https://github.com/v8/v8/blob/44bd8fd7/src/inspector/js_protocol.json#L1485
|
||||
let elapsed = chromeProfile.timeDeltas[0]
|
||||
|
||||
let elapsed = 0
|
||||
let lastNodeId = NaN
|
||||
|
||||
// The chrome CPU profile format doesn't collapse identical samples. We'll do that
|
||||
@@ -110,29 +232,31 @@ export function importFromChromeCPUProfile(chromeProfile: CPUProfile): Profile {
|
||||
const nodeId = chromeProfile.samples[i]
|
||||
if (nodeId != lastNodeId) {
|
||||
samples.push(nodeId)
|
||||
timeDeltas.push(elapsed)
|
||||
elapsed = 0
|
||||
sampleTimes.push(elapsed)
|
||||
}
|
||||
|
||||
let timeDelta = chromeProfile.timeDeltas[i]
|
||||
if (timeDelta < 0) {
|
||||
console.warn('Substituting zero for unexpected time delta:', timeDelta, 'at index', i)
|
||||
timeDelta = 0
|
||||
}
|
||||
if (i === chromeProfile.samples.length - 1) {
|
||||
if (!isNaN(lastNodeId)) {
|
||||
samples.push(lastNodeId)
|
||||
sampleTimes.push(elapsed)
|
||||
}
|
||||
} else {
|
||||
let timeDelta = chromeProfile.timeDeltas[i + 1]
|
||||
if (timeDelta < 0) {
|
||||
// This is super noisy, but can be helpful when debugging strange data
|
||||
// console.warn('Substituting zero for unexpected time delta:', timeDelta, 'at index', i)
|
||||
timeDelta = 0
|
||||
}
|
||||
|
||||
elapsed += timeDelta
|
||||
lastNodeId = nodeId
|
||||
}
|
||||
if (!isNaN(lastNodeId)) {
|
||||
samples.push(lastNodeId)
|
||||
timeDeltas.push(elapsed)
|
||||
elapsed += timeDelta
|
||||
lastNodeId = nodeId
|
||||
}
|
||||
}
|
||||
|
||||
let prevStack: CPUProfileNode[] = []
|
||||
|
||||
let value = 0
|
||||
for (let i = 0; i < samples.length; i++) {
|
||||
const timeDelta = timeDeltas[i + 1] || 0
|
||||
const value = sampleTimes[i]
|
||||
const nodeId = samples[i]
|
||||
let stackTop = nodeById.get(nodeId)
|
||||
if (!stackTop) continue
|
||||
@@ -161,7 +285,7 @@ export function importFromChromeCPUProfile(chromeProfile: CPUProfile): Profile {
|
||||
const toOpen: CPUProfileNode[] = []
|
||||
for (
|
||||
let node: CPUProfileNode | null = stackTop;
|
||||
node && node != lca && !shouldIgnoreFunction(node.callFrame.functionName);
|
||||
node && node != lca && !shouldIgnoreFunction(node.callFrame);
|
||||
// Place Chrome internal functions on top of the previous call stack
|
||||
node = shouldPlaceOnTopOfPreviousStack(node.callFrame.functionName)
|
||||
? lastOf(prevStack)
|
||||
@@ -176,14 +300,17 @@ export function importFromChromeCPUProfile(chromeProfile: CPUProfile): Profile {
|
||||
}
|
||||
|
||||
prevStack = prevStack.concat(toOpen)
|
||||
value += timeDelta
|
||||
}
|
||||
|
||||
// Close frames that are open at the end of the trace
|
||||
for (let i = prevStack.length - 1; i >= 0; i--) {
|
||||
profile.leaveFrame(frameInfoForCallFrame(prevStack[i].callFrame), value)
|
||||
profile.leaveFrame(frameInfoForCallFrame(prevStack[i].callFrame), lastOf(sampleTimes)!)
|
||||
}
|
||||
|
||||
profile.setValueFormatter(new TimeFormatter('microseconds'))
|
||||
return profile.build()
|
||||
}
|
||||
|
||||
export function importFromOldV8CPUProfile(content: OldCPUProfile): Profile {
|
||||
return importFromChromeCPUProfile(chromeTreeToNodes(content))
|
||||
}
|
||||
|
||||
@@ -7,3 +7,7 @@ test('importFromFirefox', async () => {
|
||||
test('importFromFirefox recursion', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Firefox/61/recursion.json')
|
||||
})
|
||||
|
||||
test('importFromFirefox ignore self-hosted', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Firefox/63/simple-firefox.json')
|
||||
})
|
||||
|
||||
@@ -180,7 +180,11 @@ export function importFromFirefox(firefoxProfile: FirefoxProfile): Profile {
|
||||
|
||||
if (!match) return null
|
||||
|
||||
if (match[2].startsWith('resource:') || match[2] === 'self-hosted') {
|
||||
if (
|
||||
match[2].startsWith('resource:') ||
|
||||
match[2] === 'self-hosted' ||
|
||||
match[2].startsWith('self-hosted:')
|
||||
) {
|
||||
// Ignore Firefox-internals stuff
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromHaskell', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/haskell/simple.prof')
|
||||
})
|
||||
@@ -0,0 +1,98 @@
|
||||
import {ProfileGroup, FrameInfo, CallTreeProfileBuilder} from '../lib/profile'
|
||||
import {TimeFormatter, ByteFormatter} from '../lib/value-formatters'
|
||||
|
||||
// See https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/profiling.html#json-profile-format
|
||||
// for information on the GHC profiler JSON output format.
|
||||
|
||||
interface CostCentre {
|
||||
id: number
|
||||
label: string
|
||||
module: string
|
||||
src_loc: string
|
||||
is_caf: boolean
|
||||
}
|
||||
|
||||
interface ProfileTree {
|
||||
id: number
|
||||
entries: number
|
||||
alloc: number
|
||||
ticks: number
|
||||
children: ProfileTree[]
|
||||
}
|
||||
|
||||
interface HaskellProfile {
|
||||
program: string
|
||||
arguments: string[]
|
||||
rts_arguments: string[]
|
||||
end_time: string
|
||||
initial_capabilities: number
|
||||
total_time: number
|
||||
total_ticks: number
|
||||
tick_interval: number
|
||||
total_alloc: number
|
||||
cost_centres: CostCentre[]
|
||||
profile: ProfileTree
|
||||
}
|
||||
|
||||
// The profiler already collapses recursion before output so using the JS stack here should be fine
|
||||
function addToProfile(
|
||||
tree: ProfileTree,
|
||||
startVal: number,
|
||||
profile: CallTreeProfileBuilder,
|
||||
infos: Map<number, FrameInfo>,
|
||||
attribute: (tree: ProfileTree) => number,
|
||||
): number {
|
||||
// If the expression never did anything we don't care about it
|
||||
if (tree.ticks === 0 && tree.entries === 0 && tree.alloc === 0 && tree.children.length === 0)
|
||||
return startVal
|
||||
|
||||
let curVal = startVal
|
||||
let frameInfo = infos.get(tree.id)!
|
||||
|
||||
profile.enterFrame(frameInfo, curVal)
|
||||
|
||||
for (let child of tree.children) {
|
||||
curVal = addToProfile(child, curVal, profile, infos, attribute)
|
||||
}
|
||||
|
||||
curVal += attribute(tree)
|
||||
|
||||
profile.leaveFrame(frameInfo, curVal)
|
||||
|
||||
return curVal
|
||||
}
|
||||
|
||||
export function importFromHaskell(haskellProfile: HaskellProfile): ProfileGroup {
|
||||
const idToFrameInfo = new Map<number, FrameInfo>()
|
||||
for (let centre of haskellProfile.cost_centres) {
|
||||
const frameInfo: FrameInfo = {
|
||||
key: centre.id,
|
||||
name: `${centre.module}.${centre.label}`,
|
||||
}
|
||||
|
||||
// Ignore things like <entire-module> and <no location info>
|
||||
if (!centre.src_loc.startsWith('<')) {
|
||||
// This also contains line and column information, but sometimes it contains ranges,
|
||||
// and in varying formats, so it's a better experience just to leave it as is
|
||||
frameInfo.file = centre.src_loc
|
||||
}
|
||||
|
||||
idToFrameInfo.set(centre.id, frameInfo)
|
||||
}
|
||||
|
||||
const timeProfile = new CallTreeProfileBuilder(haskellProfile.total_ticks)
|
||||
addToProfile(haskellProfile.profile, 0, timeProfile, idToFrameInfo, tree => tree.ticks)
|
||||
timeProfile.setValueFormatter(new TimeFormatter('milliseconds'))
|
||||
timeProfile.setName(`${haskellProfile.program} time`)
|
||||
|
||||
const allocProfile = new CallTreeProfileBuilder(haskellProfile.total_ticks)
|
||||
addToProfile(haskellProfile.profile, 0, allocProfile, idToFrameInfo, tree => tree.alloc)
|
||||
allocProfile.setValueFormatter(new ByteFormatter())
|
||||
allocProfile.setName(`${haskellProfile.program} allocation`)
|
||||
|
||||
return {
|
||||
name: haskellProfile.program,
|
||||
indexToView: 0,
|
||||
profiles: [timeProfile.build(), allocProfile.build()],
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import {importProfileGroupFromText} from '.'
|
||||
|
||||
test('importProfileGroup', async () => {
|
||||
// Importing garbage should return null
|
||||
expect(await importProfileGroupFromText('unknown', '')).toBe(null)
|
||||
expect(await importProfileGroupFromText('unknown', 'Hello world')).toBe(null)
|
||||
expect(await importProfileGroupFromText('unknown', 'Hello\n\nWorld')).toBe(null)
|
||||
|
||||
// Importing from a version of stackprof which was missing raw_timestamp_deltas should return null
|
||||
const oldStackprof = `{"version":1.2,"mode":"wall","interval":1000,"samples":0,"gc_samples":0,"missed_samples":0,"frames":{}}`
|
||||
expect(await importProfileGroupFromText('unknown', oldStackprof)).toBe(null)
|
||||
})
|
||||
+139
-39
@@ -1,80 +1,174 @@
|
||||
import {Profile} from '../lib/profile'
|
||||
import {Profile, ProfileGroup} from '../lib/profile'
|
||||
import {FileSystemDirectoryEntry} from './file-system-entry'
|
||||
|
||||
import {importFromChromeCPUProfile, importFromChromeTimeline} from './chrome'
|
||||
import {
|
||||
importFromChromeCPUProfile,
|
||||
importFromChromeTimeline,
|
||||
isChromeTimeline,
|
||||
importFromOldV8CPUProfile,
|
||||
} from './chrome'
|
||||
import {importFromStackprof} from './stackprof'
|
||||
import {importFromInstrumentsDeepCopy, importFromInstrumentsTrace} from './instruments'
|
||||
import {importFromBGFlameGraph} from './bg-flamegraph'
|
||||
import {importFromFirefox} from './firefox'
|
||||
import {importSpeedscopeProfiles} from '../lib/file-format'
|
||||
import {FileFormat} from '../lib/file-format-spec'
|
||||
import {importFromV8ProfLog} from './v8proflog'
|
||||
import {importFromLinuxPerf} from './linux-tools-perf'
|
||||
import {importFromHaskell} from './haskell'
|
||||
import {ProfileDataSource, TextProfileDataSource, MaybeCompressedDataReader} from './utils'
|
||||
import {importAsPprofProfile} from './pprof'
|
||||
import {decodeBase64} from '../lib/utils'
|
||||
import {importFromChromeHeapProfile} from './v8heapalloc'
|
||||
import {isTraceEventFormatted, importTraceEvents} from './trace-event'
|
||||
|
||||
export async function importProfile(fileName: string, contents: string): Promise<Profile | null> {
|
||||
const profile = await _importProfile(fileName, contents)
|
||||
if (profile && !profile.getName()) {
|
||||
profile.setName(fileName)
|
||||
}
|
||||
return profile
|
||||
export async function importProfileGroupFromText(
|
||||
fileName: string,
|
||||
contents: string,
|
||||
): Promise<ProfileGroup | null> {
|
||||
return await importProfileGroup(new TextProfileDataSource(fileName, contents))
|
||||
}
|
||||
|
||||
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]
|
||||
export async function importProfileGroupFromBase64(
|
||||
fileName: string,
|
||||
b64contents: string,
|
||||
): Promise<ProfileGroup | null> {
|
||||
return await importProfileGroup(
|
||||
MaybeCompressedDataReader.fromArrayBuffer(fileName, decodeBase64(b64contents).buffer),
|
||||
)
|
||||
}
|
||||
|
||||
async function _importProfile(fileName: string, contents: string): Promise<Profile | null> {
|
||||
export async function importProfilesFromFile(file: File): Promise<ProfileGroup | null> {
|
||||
return importProfileGroup(MaybeCompressedDataReader.fromFile(file))
|
||||
}
|
||||
|
||||
export async function importProfilesFromArrayBuffer(
|
||||
fileName: string,
|
||||
buffer: ArrayBuffer,
|
||||
): Promise<ProfileGroup | null> {
|
||||
return importProfileGroup(MaybeCompressedDataReader.fromArrayBuffer(fileName, buffer))
|
||||
}
|
||||
|
||||
async function importProfileGroup(dataSource: ProfileDataSource): Promise<ProfileGroup | null> {
|
||||
const fileName = await dataSource.name()
|
||||
|
||||
const profileGroup = await _importProfileGroup(dataSource)
|
||||
if (profileGroup) {
|
||||
if (!profileGroup.name) {
|
||||
profileGroup.name = fileName
|
||||
}
|
||||
for (let profile of profileGroup.profiles) {
|
||||
if (profile && !profile.getName()) {
|
||||
profile.setName(fileName)
|
||||
}
|
||||
}
|
||||
return profileGroup
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function toGroup(profile: Profile | null): ProfileGroup | null {
|
||||
if (!profile) return null
|
||||
return {name: profile.getName(), indexToView: 0, profiles: [profile]}
|
||||
}
|
||||
|
||||
function fixUpJSON(content: string): string {
|
||||
// This code is similar to the code from here:
|
||||
// https://github.com/catapult-project/catapult/blob/27e047e0494df162022be6aa8a8862742a270232/tracing/tracing/extras/importer/trace_event_importer.html#L197-L208
|
||||
//
|
||||
// If the event data begins with a [, then we know it should end with a ]. The
|
||||
// reason we check for this is because some tracing implementations cannot
|
||||
// guarantee that a ']' gets written to the trace file. So, we are forgiving
|
||||
// and if this is obviously the case, we fix it up before throwing the string
|
||||
// at JSON.parse.
|
||||
//
|
||||
content = content.trim()
|
||||
if (content[0] === '[') {
|
||||
content = content.replace(/,\s*$/, '')
|
||||
if (content[content.length - 1] !== ']') {
|
||||
content += ']'
|
||||
}
|
||||
}
|
||||
return content
|
||||
}
|
||||
|
||||
async function _importProfileGroup(dataSource: ProfileDataSource): Promise<ProfileGroup | null> {
|
||||
const fileName = await dataSource.name()
|
||||
|
||||
const buffer = await dataSource.readAsArrayBuffer()
|
||||
|
||||
{
|
||||
const profile = importAsPprofProfile(buffer)
|
||||
if (profile) {
|
||||
console.log('Importing as protobuf encoded pprof file')
|
||||
return toGroup(profile)
|
||||
}
|
||||
}
|
||||
|
||||
const contents = await dataSource.readAsText()
|
||||
|
||||
// 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))
|
||||
} else if (fileName.endsWith('.cpuprofile')) {
|
||||
console.log('Importing as Chrome CPU Profile')
|
||||
return importFromChromeCPUProfile(JSON.parse(contents))
|
||||
return importSpeedscopeProfiles(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 importFromChromeTimeline(JSON.parse(contents), fileName)
|
||||
} 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)))
|
||||
} else if (fileName.endsWith('.heapprofile')) {
|
||||
console.log('Importing as Chrome Heap Profile')
|
||||
return toGroup(importFromChromeHeapProfile(JSON.parse(contents)))
|
||||
}
|
||||
|
||||
// Second pass: Try to guess what file format it is based on structure
|
||||
let parsed: any
|
||||
try {
|
||||
parsed = JSON.parse(contents)
|
||||
parsed = JSON.parse(fixUpJSON(contents))
|
||||
} catch (e) {}
|
||||
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)
|
||||
} else if (Array.isArray(parsed) && parsed[parsed.length - 1].name === 'CpuProfile') {
|
||||
console.log('Importing as Chrome CPU Profile')
|
||||
return importFromChromeTimeline(parsed)
|
||||
} else if ('nodes' in parsed && 'samples' in parsed && 'timeDeltas' in parsed) {
|
||||
return toGroup(importFromFirefox(parsed))
|
||||
} else if (isChromeTimeline(parsed)) {
|
||||
console.log('Importing as Chrome Timeline')
|
||||
return importFromChromeCPUProfile(parsed)
|
||||
} else if ('mode' in parsed && 'frames' in parsed) {
|
||||
return importFromChromeTimeline(parsed, fileName)
|
||||
} else if ('nodes' in parsed && 'samples' in parsed && 'timeDeltas' in parsed) {
|
||||
console.log('Importing as Chrome CPU Profile')
|
||||
return toGroup(importFromChromeCPUProfile(parsed))
|
||||
} else if (isTraceEventFormatted(parsed)) {
|
||||
console.log('Importing as Trace Event Format profile')
|
||||
return importTraceEvents(parsed)
|
||||
} else if ('head' in parsed && 'samples' in parsed && 'timestamps' in parsed) {
|
||||
console.log('Importing as Chrome CPU Profile (old format)')
|
||||
return toGroup(importFromOldV8CPUProfile(parsed))
|
||||
} else if ('mode' in parsed && 'frames' in parsed && 'raw_timestamp_deltas' 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 if ('head' in parsed && 'selfSize' in parsed['head']) {
|
||||
console.log('Importing as Chrome Heap Profile')
|
||||
return toGroup(importFromChromeHeapProfile(JSON.parse(contents)))
|
||||
} else if ('rts_arguments' in parsed && 'initial_capabilities' in parsed) {
|
||||
console.log('Importing as Haskell GHC JSON Profile')
|
||||
return importFromHaskell(parsed)
|
||||
}
|
||||
} else {
|
||||
// Format is not JSON
|
||||
@@ -83,15 +177,21 @@ 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
|
||||
// the collapsed stack format.
|
||||
const lineCount = contents.split(/\n/).length
|
||||
if (lineCount >= 1 && lineCount === contents.split(/ \d+\n/).length) {
|
||||
if (lineCount >= 1 && lineCount === contents.split(/ \d+\r?\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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -97,4 +98,7 @@ describe('importFromInstrumentsTrace', () => {
|
||||
test('Instruments 9.3.1', async () => {
|
||||
await importFromTrace('./sample/profiles/Instruments/9.3.1/simple-time-profile.trace.zip')
|
||||
})
|
||||
test('Instruments 10.0', async () => {
|
||||
await importFromTrace('./sample/profiles/Instruments/10.0/simple-time-profile.trace.zip')
|
||||
})
|
||||
})
|
||||
|
||||
+132
-101
@@ -1,11 +1,17 @@
|
||||
// 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 '../lib/profile'
|
||||
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 '../lib/value-formatters'
|
||||
import {FileSystemDirectoryEntry, FileSystemEntry, FileSystemFileEntry} from './file-system-entry'
|
||||
import {MaybeCompressedDataReader} from './utils'
|
||||
|
||||
function parseTSV<T>(contents: string): T[] {
|
||||
const lines = contents.split('\n').map(l => l.split('\t'))
|
||||
@@ -177,56 +183,12 @@ async function extractDirectoryTree(entry: FileSystemDirectoryEntry): Promise<Tr
|
||||
return node
|
||||
}
|
||||
|
||||
class MaybeCompressedFileReader {
|
||||
private fileData: Promise<ArrayBuffer>
|
||||
|
||||
constructor(file: File) {
|
||||
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)
|
||||
})
|
||||
}
|
||||
|
||||
private async getUncompressed(): Promise<ArrayBuffer> {
|
||||
const fileData = await this.fileData
|
||||
try {
|
||||
const result = pako.inflate(new Uint8Array(fileData)).buffer
|
||||
return result
|
||||
} catch (e) {
|
||||
return fileData
|
||||
}
|
||||
}
|
||||
|
||||
async readAsArrayBuffer(): Promise<ArrayBuffer> {
|
||||
return await this.getUncompressed()
|
||||
}
|
||||
|
||||
async readAsText(): Promise<string> {
|
||||
const buffer = await this.getUncompressed()
|
||||
let ret: string = ''
|
||||
|
||||
// JavaScript strings are UTF-16 encoded, but this data is coming
|
||||
// from a UTF-8 encoded file.
|
||||
const array = new Uint8Array(buffer)
|
||||
for (let i = 0; i < array.length; i++) {
|
||||
ret += String.fromCharCode(array[i])
|
||||
}
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
function readAsArrayBuffer(file: File): Promise<ArrayBuffer> {
|
||||
return new MaybeCompressedFileReader(file).readAsArrayBuffer()
|
||||
return MaybeCompressedDataReader.fromFile(file).readAsArrayBuffer()
|
||||
}
|
||||
|
||||
function readAsText(file: File): Promise<string> {
|
||||
return new MaybeCompressedFileReader(file).readAsText()
|
||||
return MaybeCompressedDataReader.fromFile(file).readAsText()
|
||||
}
|
||||
|
||||
function getCoreDirForRun(tree: TraceDirectoryTree, selectedRun: number): TraceDirectoryTree {
|
||||
@@ -382,92 +344,129 @@ 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')
|
||||
let selectedRunNumber = 1
|
||||
if ('com.apple.xray.owner.template' in archive) {
|
||||
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 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
|
||||
})
|
||||
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(
|
||||
@@ -476,9 +475,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)
|
||||
@@ -510,7 +538,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
|
||||
}
|
||||
|
||||
@@ -518,7 +546,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
|
||||
}
|
||||
|
||||
@@ -605,7 +633,7 @@ export function readInstrumentsKeyedArchive(buffer: ArrayBuffer): any {
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
export function decodeUTF8(bytes: Uint8Array): string {
|
||||
let text = String.fromCharCode.apply(String, bytes)
|
||||
let text = String.fromCharCode.apply(String, Array.from(bytes))
|
||||
if (text.slice(-1) === '\0') text = text.slice(0, -1) // Remove a single trailing null character if present
|
||||
return decodeURIComponent(escape(text))
|
||||
}
|
||||
@@ -712,7 +740,10 @@ function paternMatchObjectiveC(
|
||||
// Replace NSString with a string
|
||||
case 'NSString':
|
||||
case 'NSMutableString':
|
||||
return decodeUTF8(value['NS.bytes'])
|
||||
if (value['NS.string']) return value['NS.string']
|
||||
if (value['NS.bytes']) return decodeUTF8(value['NS.bytes'])
|
||||
console.warn(`Unexpected ${name} format: `, value)
|
||||
return null
|
||||
|
||||
// Replace NSArray with an Array
|
||||
case 'NSArray':
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
describe('importFromLinuxPerf', () => {
|
||||
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())),
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importAsPprofProfile', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/pprof/simple.prof')
|
||||
})
|
||||
@@ -0,0 +1,134 @@
|
||||
import {perftools} from './profile.proto.js'
|
||||
import {FrameInfo, StackListProfileBuilder, Profile} from '../lib/profile'
|
||||
import {lastOf} from '../lib/utils'
|
||||
import {TimeFormatter, ByteFormatter} from '../lib/value-formatters'
|
||||
|
||||
interface SampleType {
|
||||
type: string
|
||||
unit: string
|
||||
}
|
||||
|
||||
export function importAsPprofProfile(rawProfile: ArrayBuffer): Profile | null {
|
||||
if (rawProfile.byteLength === 0) return null
|
||||
|
||||
let protoProfile: perftools.profiles.Profile
|
||||
try {
|
||||
protoProfile = perftools.profiles.Profile.decode(new Uint8Array(rawProfile))
|
||||
} catch (e) {
|
||||
return null
|
||||
}
|
||||
|
||||
function i32(n: number | Long): number {
|
||||
return typeof n === 'number' ? n : (n as Long).low
|
||||
}
|
||||
|
||||
function stringVal(key: number | Long): string | null {
|
||||
return protoProfile.stringTable[i32(key)] || null
|
||||
}
|
||||
|
||||
const frameInfoByFunctionID = new Map<number, FrameInfo>()
|
||||
|
||||
function frameInfoForFunction(f: perftools.profiles.IFunction): FrameInfo | null {
|
||||
const {name, filename, startLine} = f
|
||||
|
||||
const nameString = (name != null && stringVal(name)) || '(unknown)'
|
||||
const fileNameString = filename != null ? stringVal(filename) : null
|
||||
const line = startLine != null ? +startLine : null
|
||||
|
||||
const key = `${nameString}:${fileNameString}:${line}`
|
||||
|
||||
const frameInfo: FrameInfo = {
|
||||
key,
|
||||
name: nameString,
|
||||
}
|
||||
|
||||
if (fileNameString != null) {
|
||||
frameInfo.file = fileNameString
|
||||
}
|
||||
|
||||
if (line != null) {
|
||||
frameInfo.line = line
|
||||
}
|
||||
|
||||
return frameInfo
|
||||
}
|
||||
|
||||
for (let f of protoProfile.function) {
|
||||
if (f.id) {
|
||||
const frameInfo = frameInfoForFunction(f)
|
||||
if (frameInfo != null) {
|
||||
frameInfoByFunctionID.set(i32(f.id), frameInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function frameInfoForLocation(location: perftools.profiles.ILocation): FrameInfo | null {
|
||||
const {line} = location
|
||||
if (line == null) return null
|
||||
|
||||
// From a comment on profile.proto:
|
||||
//
|
||||
// Multiple line indicates this location has inlined functions,
|
||||
// where the last entry represents the caller into which the
|
||||
// preceding entries were inlined.
|
||||
//
|
||||
// E.g., if memcpy() is inlined into printf:
|
||||
// line[0].function_name == "memcpy"
|
||||
// line[1].function_name == "printf"
|
||||
//
|
||||
// Let's just take the last line then
|
||||
const lastLine = lastOf(line)
|
||||
if (lastLine == null) return null
|
||||
|
||||
if (lastLine.functionId) {
|
||||
return frameInfoByFunctionID.get(i32(lastLine.functionId)) || null
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
const frameByLocationID = new Map<number, FrameInfo>()
|
||||
|
||||
for (let l of protoProfile.location) {
|
||||
if (l.id != null) {
|
||||
const frameInfo = frameInfoForLocation(l)
|
||||
if (frameInfo) {
|
||||
frameByLocationID.set(i32(l.id), frameInfo)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const sampleTypes: SampleType[] = protoProfile.sampleType.map(type => ({
|
||||
type: (type.type && stringVal(type.type)) || 'samples',
|
||||
unit: (type.unit && stringVal(type.unit)) || 'count',
|
||||
}))
|
||||
|
||||
const sampleTypeIndex = protoProfile.defaultSampleType
|
||||
? +protoProfile.defaultSampleType
|
||||
: sampleTypes.length - 1
|
||||
const sampleType = sampleTypes[sampleTypeIndex]
|
||||
|
||||
const profileBuilder = new StackListProfileBuilder()
|
||||
|
||||
switch (sampleType.unit) {
|
||||
case 'nanoseconds':
|
||||
case 'microseconds':
|
||||
case 'milliseconds':
|
||||
case 'seconds':
|
||||
profileBuilder.setValueFormatter(new TimeFormatter(sampleType.unit))
|
||||
break
|
||||
|
||||
case 'bytes':
|
||||
profileBuilder.setValueFormatter(new ByteFormatter())
|
||||
break
|
||||
}
|
||||
|
||||
for (let s of protoProfile.sample) {
|
||||
const stack = s.locationId ? s.locationId.map(l => frameByLocationID.get(i32(l))) : []
|
||||
stack.reverse()
|
||||
const value = s.value![sampleTypeIndex]
|
||||
profileBuilder.appendSampleWithWeight(stack.filter(f => f != null) as FrameInfo[], +value)
|
||||
}
|
||||
|
||||
return profileBuilder.build()
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
// THIS FILE WAS IMPORTED FROM AN EXTERNAL SOURCE. DO NOT MODIFY THIS FILE
|
||||
// MANUALLY.
|
||||
//
|
||||
// Original from: https://github.com/google/pprof/blob/e027b50/proto/profile.proto
|
||||
//
|
||||
// This file is licensed under the Apache License 2.0
|
||||
// (https://github.com/google/pprof/blob/e027b5/LICENSE)
|
||||
|
||||
// Profile is a common stacktrace profile format.
|
||||
//
|
||||
// Measurements represented with this format should follow the
|
||||
// following conventions:
|
||||
//
|
||||
// - Consumers should treat unset optional fields as if they had been
|
||||
// set with their default value.
|
||||
//
|
||||
// - When possible, measurements should be stored in "unsampled" form
|
||||
// that is most useful to humans. There should be enough
|
||||
// information present to determine the original sampled values.
|
||||
//
|
||||
// - On-disk, the serialized proto must be gzip-compressed.
|
||||
//
|
||||
// - The profile is represented as a set of samples, where each sample
|
||||
// references a sequence of locations, and where each location belongs
|
||||
// to a mapping.
|
||||
// - There is a N->1 relationship from sample.location_id entries to
|
||||
// locations. For every sample.location_id entry there must be a
|
||||
// unique Location with that id.
|
||||
// - There is an optional N->1 relationship from locations to
|
||||
// mappings. For every nonzero Location.mapping_id there must be a
|
||||
// unique Mapping with that id.
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
package perftools.profiles;
|
||||
|
||||
option java_package = "com.google.perftools.profiles";
|
||||
option java_outer_classname = "ProfileProto";
|
||||
|
||||
message Profile {
|
||||
// A description of the samples associated with each Sample.value.
|
||||
// For a cpu profile this might be:
|
||||
// [["cpu","nanoseconds"]] or [["wall","seconds"]] or [["syscall","count"]]
|
||||
// For a heap profile, this might be:
|
||||
// [["allocations","count"], ["space","bytes"]],
|
||||
// If one of the values represents the number of events represented
|
||||
// by the sample, by convention it should be at index 0 and use
|
||||
// sample_type.unit == "count".
|
||||
repeated ValueType sample_type = 1;
|
||||
// The set of samples recorded in this profile.
|
||||
repeated Sample sample = 2;
|
||||
// Mapping from address ranges to the image/binary/library mapped
|
||||
// into that address range. mapping[0] will be the main binary.
|
||||
repeated Mapping mapping = 3;
|
||||
// Useful program location
|
||||
repeated Location location = 4;
|
||||
// Functions referenced by locations
|
||||
repeated Function function = 5;
|
||||
// A common table for strings referenced by various messages.
|
||||
// string_table[0] must always be "".
|
||||
repeated string string_table = 6;
|
||||
// frames with Function.function_name fully matching the following
|
||||
// regexp will be dropped from the samples, along with their successors.
|
||||
int64 drop_frames = 7; // Index into string table.
|
||||
// frames with Function.function_name fully matching the following
|
||||
// regexp will be kept, even if it matches drop_functions.
|
||||
int64 keep_frames = 8; // Index into string table.
|
||||
|
||||
// The following fields are informational, do not affect
|
||||
// interpretation of results.
|
||||
|
||||
// Time of collection (UTC) represented as nanoseconds past the epoch.
|
||||
int64 time_nanos = 9;
|
||||
// Duration of the profile, if a duration makes sense.
|
||||
int64 duration_nanos = 10;
|
||||
// The kind of events between sampled ocurrences.
|
||||
// e.g [ "cpu","cycles" ] or [ "heap","bytes" ]
|
||||
ValueType period_type = 11;
|
||||
// The number of events between sampled occurrences.
|
||||
int64 period = 12;
|
||||
// Freeform text associated to the profile.
|
||||
repeated int64 comment = 13; // Indices into string table.
|
||||
// Index into the string table of the type of the preferred sample
|
||||
// value. If unset, clients should default to the last sample value.
|
||||
int64 default_sample_type = 14;
|
||||
}
|
||||
|
||||
// ValueType describes the semantics and measurement units of a value.
|
||||
message ValueType {
|
||||
int64 type = 1; // Index into string table.
|
||||
int64 unit = 2; // Index into string table.
|
||||
}
|
||||
|
||||
// Each Sample records values encountered in some program
|
||||
// context. The program context is typically a stack trace, perhaps
|
||||
// augmented with auxiliary information like the thread-id, some
|
||||
// indicator of a higher level request being handled etc.
|
||||
message Sample {
|
||||
// The ids recorded here correspond to a Profile.location.id.
|
||||
// The leaf is at location_id[0].
|
||||
repeated uint64 location_id = 1;
|
||||
// The type and unit of each value is defined by the corresponding
|
||||
// entry in Profile.sample_type. All samples must have the same
|
||||
// number of values, the same as the length of Profile.sample_type.
|
||||
// When aggregating multiple samples into a single sample, the
|
||||
// result has a list of values that is the elemntwise sum of the
|
||||
// lists of the originals.
|
||||
repeated int64 value = 2;
|
||||
// label includes additional context for this sample. It can include
|
||||
// things like a thread id, allocation size, etc
|
||||
repeated Label label = 3;
|
||||
}
|
||||
|
||||
message Label {
|
||||
int64 key = 1; // Index into string table
|
||||
|
||||
// At most one of the following must be present
|
||||
int64 str = 2; // Index into string table
|
||||
int64 num = 3;
|
||||
|
||||
// Should only be present when num is present.
|
||||
// Specifies the units of num.
|
||||
// Use arbitrary string (for example, "requests") as a custom count unit.
|
||||
// If no unit is specified, consumer may apply heuristic to deduce the unit.
|
||||
// Consumers may also interpret units like "bytes" and "kilobytes" as memory
|
||||
// units and units like "seconds" and "nanoseconds" as time units,
|
||||
// and apply appropriate unit conversions to these.
|
||||
int64 num_unit = 4; // Index into string table
|
||||
}
|
||||
|
||||
message Mapping {
|
||||
// Unique nonzero id for the mapping.
|
||||
uint64 id = 1;
|
||||
// Address at which the binary (or DLL) is loaded into memory.
|
||||
uint64 memory_start = 2;
|
||||
// The limit of the address range occupied by this mapping.
|
||||
uint64 memory_limit = 3;
|
||||
// Offset in the binary that corresponds to the first mapped address.
|
||||
uint64 file_offset = 4;
|
||||
// The object this entry is loaded from. This can be a filename on
|
||||
// disk for the main binary and shared libraries, or virtual
|
||||
// abstractions like "[vdso]".
|
||||
int64 filename = 5; // Index into string table
|
||||
// A string that uniquely identifies a particular program version
|
||||
// with high probability. E.g., for binaries generated by GNU tools,
|
||||
// it could be the contents of the .note.gnu.build-id field.
|
||||
int64 build_id = 6; // Index into string table
|
||||
|
||||
// The following fields indicate the resolution of symbolic info.
|
||||
bool has_functions = 7;
|
||||
bool has_filenames = 8;
|
||||
bool has_line_numbers = 9;
|
||||
bool has_inline_frames = 10;
|
||||
}
|
||||
|
||||
// Describes function and line table debug information.
|
||||
message Location {
|
||||
// Unique nonzero id for the location. A profile could use
|
||||
// instruction addresses or any integer sequence as ids.
|
||||
uint64 id = 1;
|
||||
// The id of the corresponding profile.Mapping for this location.
|
||||
// It can be unset if the mapping is unknown or not applicable for
|
||||
// this profile type.
|
||||
uint64 mapping_id = 2;
|
||||
// The instruction address for this location, if available. It
|
||||
// should be within [Mapping.memory_start...Mapping.memory_limit]
|
||||
// for the corresponding mapping. A non-leaf address may be in the
|
||||
// middle of a call instruction. It is up to display tools to find
|
||||
// the beginning of the instruction if necessary.
|
||||
uint64 address = 3;
|
||||
// Multiple line indicates this location has inlined functions,
|
||||
// where the last entry represents the caller into which the
|
||||
// preceding entries were inlined.
|
||||
//
|
||||
// E.g., if memcpy() is inlined into printf:
|
||||
// line[0].function_name == "memcpy"
|
||||
// line[1].function_name == "printf"
|
||||
repeated Line line = 4;
|
||||
// Provides an indication that multiple symbols map to this location's
|
||||
// address, for example due to identical code folding by the linker. In that
|
||||
// case the line information above represents one of the multiple
|
||||
// symbols. This field must be recomputed when the symbolization state of the
|
||||
// profile changes.
|
||||
bool is_folded = 5;
|
||||
}
|
||||
|
||||
message Line {
|
||||
// The id of the corresponding profile.Function for this line.
|
||||
uint64 function_id = 1;
|
||||
// Line number in source code.
|
||||
int64 line = 2;
|
||||
}
|
||||
|
||||
message Function {
|
||||
// Unique nonzero id for the function.
|
||||
uint64 id = 1;
|
||||
// Name of the function, in human-readable form if available.
|
||||
int64 name = 2; // Index into string table
|
||||
// Name of the function, as identified by the system.
|
||||
// For instance, it can be a C++ mangled name.
|
||||
int64 system_name = 3; // Index into string table
|
||||
// Source file containing the function.
|
||||
int64 filename = 4; // Index into string table
|
||||
// Line number in source file.
|
||||
int64 start_line = 5;
|
||||
}
|
||||
Vendored
+1047
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user