Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8dad28e5e2 | ||
|
|
f62519ab69 | ||
|
|
984bf1296a | ||
|
|
26884c116c | ||
|
|
bb063e49e3 | ||
|
|
693545b77a | ||
|
|
b3b4b1492a | ||
|
|
9cdceede15 | ||
|
|
741fdeb427 | ||
|
|
e9133be353 | ||
|
|
fcc1fa5689 | ||
|
|
0414c2f617 | ||
|
|
f23f65b3af | ||
|
|
8da9088ec1 | ||
|
|
81a6f29ad1 | ||
|
|
263f7d513e | ||
|
|
1bce806933 | ||
|
|
6493c5f66f | ||
|
|
639dae322b | ||
|
|
33a8f3f313 | ||
|
|
7ae545a6c3 | ||
|
|
48d692c2a3 | ||
|
|
ca8fcb48cc | ||
|
|
63f3bc0395 | ||
|
|
1ac88cc09a | ||
|
|
9a2c2a270b | ||
|
|
229d48eca5 | ||
|
|
103db681d2 | ||
|
|
21167e69d8 | ||
|
|
e37f6fa7c3 | ||
|
|
6d02bf510f | ||
|
|
b71cef5db4 | ||
|
|
e6351a3c22 | ||
|
|
36aebfbda6 | ||
|
|
246fc3dd5d | ||
|
|
d6f5efa06c | ||
|
|
03a5104317 | ||
|
|
7dcfab1bbc | ||
|
|
24b60dfd4a | ||
|
|
6a979bb568 | ||
|
|
36911599cb | ||
|
|
b32ff08ca3 | ||
|
|
361bdc9cd2 | ||
|
|
a1384b03be | ||
|
|
5f32640060 | ||
|
|
a10c834f99 | ||
|
|
de3ab89eb5 | ||
|
|
aee2dfdf89 | ||
|
|
d9b3950274 | ||
|
|
177696e359 | ||
|
|
16e32dc08e | ||
|
|
8a4f38a8cb | ||
|
|
9361a6baf2 | ||
|
|
ede9c74d50 | ||
|
|
f758130455 | ||
|
|
f3a1c09c9b | ||
|
|
069c0194a6 | ||
|
|
64fe369c42 | ||
|
|
f55c53f699 | ||
|
|
a0b3fe8420 | ||
|
|
9452aeae82 | ||
|
|
b26cdb5be4 | ||
|
|
1c5bdba36e |
@@ -0,0 +1,43 @@
|
||||
name: Node.js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [10.x, 12.x, 14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm install
|
||||
- run: npm test
|
||||
env:
|
||||
CI: true
|
||||
|
||||
- name: Coveralls Parallel
|
||||
uses: coverallsapp/github-action@master
|
||||
with:
|
||||
github-token: ${{ secrets.github_token }}
|
||||
flag-name: run-${{ matrix.node-version }}
|
||||
parallel: true
|
||||
|
||||
finish:
|
||||
needs: test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Coveralls Finished
|
||||
uses: coverallsapp/github-action@master
|
||||
with:
|
||||
github-token: ${{ secrets.github_token }}
|
||||
parallel-finished: true
|
||||
+2
-1
@@ -2,4 +2,5 @@ node_modules
|
||||
.cache
|
||||
dist
|
||||
.idea
|
||||
coverage
|
||||
coverage
|
||||
.vscode
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- '10'
|
||||
- '12'
|
||||
- '13'
|
||||
- 'node'
|
||||
Vendored
-3
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"editor.formatOnSave": true,
|
||||
}
|
||||
+98
-1
@@ -1,4 +1,101 @@
|
||||
## Unreleased
|
||||
## [1.15.2] - 2023-06-21
|
||||
|
||||
### Fixed
|
||||
|
||||
- Use more accurate line information for pprof profiles [[#430](https://github.com/jlfwong/speedscope/pull/430)] (by @dalehamel)
|
||||
- Stackprof: weight on-cpu samples by period rather than timestamp delta [[#425](https://github.com/jlfwong/speedscope/pull/425)] (by @manuelfelipe)
|
||||
- Prevent crashes when stackprof profiles frames are missing names [[#419](https://github.com/jlfwong/speedscope/pull/419)] (by @jez)
|
||||
- fix pprof defaultSampleType [[#424](https://github.com/jlfwong/speedscope/pull/424)] (by @vasi-stripe)
|
||||
|
||||
## [1.15.1] - 2023-06-04
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix import from Chrome Devtools performance tab in Chrome >= 114 [[#422](https://github.com/jlfwong/speedscope/pull/422)]
|
||||
- Callgrind: Subposition compression and weight correction [[#423](https://github.com/jlfwong/speedscope/pull/423)]
|
||||
|
||||
## [1.15.0] - 2022-10-22
|
||||
|
||||
### Fixed
|
||||
|
||||
- Replace fuzzy matching with exact substring matching for finding matching frames [[#407](https://github.com/jlfwong/speedscope/pull/407)]
|
||||
|
||||
## [1.14.0] - 2022-05-19
|
||||
|
||||
### Added
|
||||
|
||||
- File and line information is now displayed in hover tips [[#365](https://github.com/jlfwong/speedscope/pull/365)] (by [@sokra](https://github.com/sokra))
|
||||
- Support for stackprof object mode [[#391](https://github.com/jlfwong/speedscope/pull/391)] (by [@alexcoco](https://github.com/alexcoco))
|
||||
- Support for hash params to control view-mode [[#362](https://github.com/jlfwong/speedscope/pull/362)] (by [@djudd](https://github.com/djudd))
|
||||
- Support for profiles over 512MB now works [[#385](https://github.com/jlfwong/speedscope/pull/385)] (by [@jlfwong](https://github.com/jlfwong))
|
||||
- Support for relative URLs in profileURL hashParam [[#357](https://github.com/jlfwong/speedscope/pull/357)] (by [@danvk](https://github.com/danvk))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Allow collapsed stacks with invalid lines for the Brenden Gregg stack format [[#336](https://github.com/jlfwong/speedscope/pull/336)] (by [@P403n1x87](https://github.com/P403n1x87))
|
||||
- Allow pasting into the search box [[#338](https://github.com/jlfwong/speedscope/pull/338)] (by [@P403n1x87](https://github.com/P403n1x87))
|
||||
- Prevent hover tips from getting unnecessarily clipped outside container bounds [[#395](https://github.com/jlfwong/speedscope/pull/395)] (by [@jlfwong](https://github.com/jlfwong))
|
||||
|
||||
## [1.13.0] - 2021-02-14
|
||||
|
||||
### Added
|
||||
|
||||
- Support for importing callgrind profiles [[#331](https://github.com/jlfwong/speedscope/pull/331)]
|
||||
|
||||
## [1.12.1] - 2020-11-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed for retina displays [[#327](https://github.com/jlfwong/speedscope/issues/327)]
|
||||
|
||||
## [1.12.0] - 2020-11-12
|
||||
|
||||
### Added
|
||||
|
||||
- Dark mode! [[#323](https://github.com/jlfwong/speedscope/pull/323)]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed incorrect highlighting when search result overlaps "…" [[#326](https://github.com/jlfwong/speedscope/pull/326)]
|
||||
|
||||
## [1.11.1] - 2020-10-25
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix trace-event import for many cases where there are 'ts' collisions [[#322](https://github.com/jlfwong/speedscope/pull/322)]
|
||||
- Fix import of trace event files where B/E events' args don't match [[#321](https://github.com/jlfwong/speedscope/pull/321)]
|
||||
|
||||
## [1.11.0] - 2020-10-13
|
||||
|
||||
### Added
|
||||
|
||||
- Support remapping profiles using source maps [[#317](https://github.com/jlfwong/speedscope/pull/317)]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix line & column numbers in imports from Chrome & Firefox [[#318](https://github.com/jlfwong/speedscope/pull/318)]
|
||||
|
||||
## [1.10.0] - 2020-09-29
|
||||
|
||||
### Added
|
||||
|
||||
- Support for importing profiles from Safari [[#300](https://github.com/jlfwong/speedscope/pull/300)] (by [@radex](https://github.com/radex))
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fixed browser not opening on Windows when using the CLI [[#307](https://github.com/jlfwong/speedscope/pull/307)] (by [@spillerrec](https://github.com/spillerrec))
|
||||
- Fixed import of UTF-16 encoded files w/ BOM [[#314](https://github.com/jlfwong/speedscope/pull/314)]
|
||||
- Removed accidental dependency on React [[#315](https://github.com/jlfwong/speedscope/pull/315)]
|
||||
|
||||
## [1.9.0] - 2020-08-05
|
||||
|
||||
### Added
|
||||
|
||||
- Provide prev/next buttons to cycle through search results, make search results more visually prominen [[#304](https://github.com/jlfwong/speedscope/pull/304)]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix accumulated errors in Chrome profile imports caused by zeroed negative timeDeltas [[#305](https://github.com/jlfwong/speedscope/pull/305)] (by [@taneliang](https://github.com/taneliang))
|
||||
|
||||
## [1.8.0] - 2020-07-19
|
||||
|
||||
|
||||
+12
-58
@@ -1,15 +1,5 @@
|
||||
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.
|
||||
|
||||
@@ -18,8 +8,9 @@ works if you're on a linux, and almost definitely does not work on Windows.
|
||||
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
|
||||
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:
|
||||
|
||||
@@ -36,58 +27,21 @@ 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".
|
||||
## Create & publish the new release
|
||||
|
||||
## Prepare the release
|
||||
Ensure you have the Github CLI tools installed and you're authenticated. Try running the following if you're unsure:
|
||||
|
||||
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`
|
||||
gh auth status
|
||||
npm whoami
|
||||
|
||||
## Publish to npm
|
||||
Once ready to publish, run:
|
||||
|
||||
Assuming everything went well in the previous two phases, publishing should just be
|
||||
a matter of running `npm publish`.
|
||||
scripts/publish-and-deploy.sh
|
||||
|
||||
### Verifying the publish
|
||||
## Verifying the release
|
||||
|
||||
To verify that the publish was successful, run `npm install -g speedscope`.
|
||||
To verify that the npm 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
|
||||
To verify the website has finished deploying, check the version number shown in the console of https://www.speedscope.app/
|
||||
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
简体中文 | [English](./README.md)
|
||||
# 🔬speedscope
|
||||
|
||||
一个快速,交互式,基于网络的性能分析工具。 [FlameGraphs][1](火焰图)的另一个替代品。它可以轻松显示数兆的配置文件并且不会使浏览器崩溃。
|
||||
|
||||
给定原始分析数据,你就可以交互式的探索数据,了解应用程序中什么部分速度较慢,或者分配所有内存,或者对任何数据进行分析。
|
||||
|
||||

|
||||
|
||||
[0]: https://en.wikipedia.org/wiki/Profiling_(computer_programming)#Statistical_profilers
|
||||
[1]: https://github.com/brendangregg/FlameGraph
|
||||
|
||||
# 使用
|
||||
|
||||
访问https://www.speedscope.app,上传文件或者拖拽到页面上。配置文件不会上传到任何地方——应用程序完全在浏览器中。
|
||||
|
||||
## 命令行中使用
|
||||
|
||||
为了方便在不联网的情况下或者在终端中使用, 你可以使用npm下载speedscope:
|
||||
|
||||
npm install -g speedscope
|
||||
|
||||
调用`speedscope /path/to/profile` 就可以在默认浏览器中加载speedscope。
|
||||
|
||||
## 独立使用
|
||||
|
||||
如果你不想使用npm或者node下载,你也可以在这里下载独立的版本https://github.com/jlfwong/speedscope/releases.
|
||||
下载完一个版本的压缩文件之后,解压并在谷歌或者火狐浏览器中打开`index.html`文件即可。
|
||||
|
||||
## 支持的文件格式
|
||||
|
||||
Speedscope可以不同编程语言和环境的各种不同探查器中摄取概要文件。单击下面的链接获取从特定源导入的文档。
|
||||
|
||||
- JavaScript
|
||||
- [从 Chrome 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-Chrome)
|
||||
- [从 Firefox 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-Firefox)
|
||||
- [从 Safari 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-Safari)
|
||||
- [从 Node.js 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-Node.js)
|
||||
- Ruby
|
||||
- [从 stackprof 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-stackprof-(ruby))
|
||||
- [从 rbspy 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-rbspy-(ruby))
|
||||
- [从 ruby-prof 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-ruby-prof)
|
||||
- Python
|
||||
- [从 py-spy 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-py-spy-(python))
|
||||
- [pyspeedscope](https://github.com/windelbouwman/pyspeedscope)
|
||||
- [从 Austin 导入](https://github.com/P403n1x87/austin-python#format-conversion)
|
||||
- [从 pyinstrument 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-pyinstrument-(python))
|
||||
- PHP
|
||||
- [从 phpspy 或者 sj-i/php-profiler 导入](https://github.com/sj-i/php-profiler/pull/101)
|
||||
- Go
|
||||
- [从 pprof 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-pprof-(go))
|
||||
- Rust
|
||||
- [flamescope](https://github.com/coolreader18/flamescope)
|
||||
- Native code
|
||||
- [从 Instruments.app 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-Instruments.app) (macOS)
|
||||
- [从 `perf` 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-perf-(linux)) (linux)
|
||||
- [从 .NET Core 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-.NET-Core)
|
||||
- [从 GHC (Haskell) 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-Haskell)
|
||||
- [从 custom sources 导入](https://github.com/jlfwong/speedscope/wiki/Importing-from-custom-sources)
|
||||
|
||||
极力欢迎贡献添加对其他格式的支持!查看 issues ["import source" tag](https://github.com/jlfwong/speedscope/issues?q=is%3Aissue+is%3Aopen+label%3A%22import+source%22).
|
||||
|
||||
## 通过URL导入
|
||||
|
||||
要通过URL加载特定的配置文件,你可以添加一个这样的hash片段 `#profileURL=[URL-encoded profile URL]&title=[URL-encoded custom title]`. 注意:托管配置文件的服务器必须配置CORS以允许来自speedscope的AJAX请求。
|
||||
|
||||
## 页面
|
||||
|
||||
### 🕰Time Order
|
||||

|
||||
|
||||
在 "Time Order" 页面 (默认),调用堆栈按照它们在输入文件中出现的顺序从左到右排列,这通常是安排它们被记录的时间顺序。这个视图对于理解应用程序随时间变化的行为非常有帮助,比如 "首次从数据库获取到数据,然后为序列化准备数据,数据被序列化为JSON"。
|
||||
|
||||
水平轴表示每个堆栈的“权重”(最常见的是CPU时间),垂直轴显示在运行期间处于活动状态的堆栈。如果你点击其中一个框,你将能够看到关于它的统计摘要。
|
||||
|
||||
|
||||
### ⬅️Left Heavy
|
||||

|
||||
|
||||
在 "Left Heavy" 页面,将相同的堆栈分组在一,不管它们是否按顺序记录。然后,对堆栈进行排序,使每个父堆栈中最重的堆栈位于左侧——因此称为“左权重”。 这个视图对于理解在其他调用栈之间有成百上千个函数交错调用的情况下,时间都花费在了哪里很有用。
|
||||
|
||||
### 🥪 Sandwich
|
||||

|
||||
|
||||
Sandwich 是一个表格视图,你可以在其中找到所有函数及其相关时间的列表。您可以按自己的时间或总时间排序。
|
||||
之所以称为"Sandwich"视图,是因为如果你选择表中的某一行,就可以看到所选对象的所有调用者和被调用者的火焰图
|
||||
。
|
||||
|
||||
|
||||
## 导航
|
||||
|
||||
一旦配置文件被加载,主视图就会被分成两部分:顶部区域是“迷你地图”,底部区域是“堆栈视图”。
|
||||
|
||||
### 迷你地图导航
|
||||
|
||||
* 在任意一个轴上滚动以进行平移
|
||||
* 单击并拖动可将视图缩小到特定范围
|
||||
|
||||
### 堆栈视图
|
||||
|
||||
* 在任意一个轴上滚动以进行平移
|
||||
* 缩放
|
||||
* 按住 Cmd+Scroll 进行缩放
|
||||
* 双击一帧以使视口适应
|
||||
* 点击一个框以查看关于它的摘要统计
|
||||
|
||||
### 键盘导航
|
||||
|
||||
* `+`: 放大
|
||||
* `-`: 缩小
|
||||
* `0`: 缩小以看到整体情况
|
||||
* `w`/`a`/`s`/`d` 或者箭头键: pan around the profile
|
||||
* `1`: 切换到 "Time Order" 视图
|
||||
* `2`: 切换到 "Left Heavy" 视图
|
||||
* `3`: 切换到 "Sandwich" 视图
|
||||
* `r`: 在火焰图中折叠递归
|
||||
* `Cmd+S`/`Ctrl+S` 保存现有文件
|
||||
* `Cmd+O`/`Ctrl+O` 打开一个新文件
|
||||
* `n`: 跳转到下一个文件/如果下一个文件存在
|
||||
* `p`: 跳转到上一个文件/如果上一个文件存在
|
||||
* `t`: 打开一个新文件/如果新文件存在
|
||||
* `Cmd+F`/`Ctrl+F`: 打开搜索。打开时,按下 `Enter` and `Shift+Enter` 查看结果
|
||||
|
||||
## 参与贡献
|
||||
|
||||
你想成为 speedscope 的贡献者吗? 查看 [CONTRIBUTING.md](./CONTRIBUTING.md) 关于设置开发环境的说明。
|
||||
@@ -1,4 +1,5 @@
|
||||
# 🔬speedscope
|
||||
English | [简体中文](./README-zh_CN.md)
|
||||
# 🔬speedscope
|
||||
|
||||
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.
|
||||
|
||||
@@ -36,6 +37,7 @@ speedscope is designed to ingest profiles from a variety of different profilers
|
||||
- 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 Safari](https://github.com/jlfwong/speedscope/wiki/Importing-from-Safari)
|
||||
- [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))
|
||||
@@ -44,6 +46,10 @@ speedscope is designed to ingest profiles from a variety of different profilers
|
||||
- Python
|
||||
- [Importing from py-spy](https://github.com/jlfwong/speedscope/wiki/Importing-from-py-spy-(python))
|
||||
- [pyspeedscope](https://github.com/windelbouwman/pyspeedscope)
|
||||
- [Importing from Austin](https://github.com/P403n1x87/austin-python#format-conversion)
|
||||
- [Importing from pyinstrument](https://github.com/jlfwong/speedscope/wiki/Importing-from-pyinstrument-(python))
|
||||
- PHP
|
||||
- [Importing from phpspy or sj-i/php-profiler](https://github.com/sj-i/php-profiler/pull/101)
|
||||
- Go
|
||||
- [Importing from pprof](https://github.com/jlfwong/speedscope/wiki/Importing-from-pprof-(go))
|
||||
- Rust
|
||||
@@ -79,7 +85,7 @@ In the "Left Heavy" view, identical stacks are grouped together, regardless of w
|
||||
### 🥪 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.
|
||||
The Sandwich view is a table view in which you can find a list of all functions and 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.
|
||||
|
||||
@@ -116,6 +122,7 @@ Once a profile has loaded, the main view is split into two: the top area is the
|
||||
* `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
|
||||
* `Cmd+F`/`Ctrl+F`: to open search. While open, `Enter` and `Shift+Enter` cycle through results
|
||||
|
||||
## Contributing
|
||||
|
||||
|
||||
+20
-6
@@ -4,7 +4,7 @@ const fs = require('fs')
|
||||
const os = require('os')
|
||||
const stream = require('stream')
|
||||
|
||||
const opn = require('opn')
|
||||
const open = require('open')
|
||||
|
||||
const helpString = `Usage: speedscope [filepath]
|
||||
|
||||
@@ -66,10 +66,20 @@ async function main() {
|
||||
const relPath = process.argv[2]
|
||||
const sourceBuffer = await getProfileBuffer(relPath)
|
||||
const filename = path.basename(relPath)
|
||||
const sourceBase64 = sourceBuffer.toString('base64')
|
||||
const jsSource = `speedscope.loadFileFromBase64(${JSON.stringify(filename)}, ${JSON.stringify(
|
||||
sourceBase64,
|
||||
)})`
|
||||
|
||||
let jsSource
|
||||
try {
|
||||
const sourceBase64 = sourceBuffer.toString('base64')
|
||||
jsSource = `speedscope.loadFileFromBase64(${JSON.stringify(filename)}, ${JSON.stringify(
|
||||
sourceBase64,
|
||||
)})`
|
||||
} catch(e) {
|
||||
if (e && e.message && /Cannot create a string longer than/.exec(e.message)) {
|
||||
jsSource = `alert("Sorry, ${filename} is too large to be loaded via command-line argument! Try dragging it into speedscope instead.")`
|
||||
} else {
|
||||
throw e
|
||||
}
|
||||
}
|
||||
|
||||
const filePrefix = `speedscope-${+new Date()}-${process.pid}`
|
||||
const jsPath = path.join(os.tmpdir(), `${filePrefix}.js`)
|
||||
@@ -89,7 +99,11 @@ async function main() {
|
||||
|
||||
console.log('Opening', urlToOpen, 'in your default browser')
|
||||
|
||||
await opn(urlToOpen, {wait: false})
|
||||
// We'd like to avoid blocking the terminal on the browsing closing,
|
||||
// but for some reason this doesn't work at all on Windows if we
|
||||
// don't use wait: true.
|
||||
const wait = process.platform === "win32";
|
||||
await open(urlToOpen, {wait})
|
||||
}
|
||||
|
||||
main()
|
||||
|
||||
Generated
+15567
-243
File diff suppressed because it is too large
Load Diff
+9
-12
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "1.8.0",
|
||||
"version": "1.15.2",
|
||||
"description": "",
|
||||
"repository": "jlfwong/speedscope",
|
||||
"main": "index.js",
|
||||
@@ -13,7 +13,7 @@
|
||||
"prettier": "prettier --write 'src/**/*.ts' 'src/**/*.tsx'",
|
||||
"lint": "eslint 'src/**/*.ts' 'src/**/*.tsx'",
|
||||
"jest": "./scripts/test-setup.sh && jest --runInBand",
|
||||
"coverage": "npm run jest -- --coverage && coveralls < coverage/lcov.info",
|
||||
"coverage": "npm run jest -- --coverage",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"test": "./scripts/ci.sh",
|
||||
"serve": "parcel assets/index.html --open --no-autoinstall"
|
||||
@@ -34,11 +34,10 @@
|
||||
"@types/jszip": "3.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",
|
||||
"@typescript-eslint/eslint-plugin": "4.19.0",
|
||||
"@typescript-eslint/parser": "4.19.0",
|
||||
"acorn": "7.2.0",
|
||||
"aphrodite": "2.1.0",
|
||||
"coveralls": "3.0.1",
|
||||
"eslint": "6.0.0",
|
||||
"eslint-plugin-prettier": "2.6.0",
|
||||
"eslint-plugin-react-hooks": "4.0.2",
|
||||
@@ -50,13 +49,12 @@
|
||||
"preact": "10.4.1",
|
||||
"prettier": "2.0.4",
|
||||
"protobufjs": "6.8.8",
|
||||
"react-redux": "^7.2.0",
|
||||
"redux": "^4.0.5",
|
||||
"source-map": "0.6.1",
|
||||
"ts-jest": "24.3.0",
|
||||
"typescript": "3.9.2",
|
||||
"typescript-eslint-parser": "17.0.1",
|
||||
"typescript": "4.2.3",
|
||||
"typescript-json-schema": "0.42.0",
|
||||
"uglify-es": "3.2.2"
|
||||
"uglify-es": "3.2.2",
|
||||
"uint8array-json-parser": "0.0.2"
|
||||
},
|
||||
"jest": {
|
||||
"transform": {
|
||||
@@ -79,7 +77,6 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"opn": "5.3.0",
|
||||
"react": "^16.13.1"
|
||||
"open": "7.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,46 @@
|
||||
Weight Self Weight Symbol Name
|
||||
96.08 Gc 100.0% - example_app (40414)
|
||||
96.08 Gc 100.0% - start
|
||||
96.08 Gc 100.0% - main
|
||||
96.08 Gc 100.0% - std::rt::lang_start::hdba6f1ebfd1bdcf8
|
||||
96.08 Gc 100.0% - std::rt::lang_start_internal::hc453db0ee48af82e
|
||||
96.08 Gc 100.0% - std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c
|
||||
96.08 Gc 100.0% - std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc
|
||||
96.08 Gc 100.0% - core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8
|
||||
96.08 Gc 100.0% - example_app::main::hddab13ae8d8b6a6e
|
||||
47.82 Gc 49.7% - example_app::example_a::h622d6879b734496d
|
||||
46.92 Gc 48.8% 404.75 Mc std::time::Instant::elapsed::h2e3793148fc23529
|
||||
45.92 Gc 47.7% 45.92 Gc mach_absolute_time
|
||||
600.78 Mc 0.6% 600.78 Mc std::time::Instant::elapsed::h2e3793148fc23529
|
||||
1.00 Mc 0.0% 1.00 Mc DYLD-STUB$$mach_absolute_time
|
||||
634.35 Mc 0.6% 634.35 Mc core::time::Duration::as_millis::hae6ad1b9cf7bb5ec
|
||||
181.50 Mc 0.1% 181.50 Mc example_app::example_a::h622d6879b734496d
|
||||
84.45 Mc 0.0% - example_app::example_b::h71b31fcd89b9ffd2
|
||||
81.45 Mc 0.0% - std::time::Instant::elapsed::h2e3793148fc23529
|
||||
80.45 Mc 0.0% 80.45 Mc mach_absolute_time
|
||||
1.00 Mc 0.0% 1.00 Mc std::time::Instant::elapsed::h2e3793148fc23529
|
||||
1.00 Mc 0.0% - example_app::example_c::h631759c10d7dee93
|
||||
1.00 Mc 0.0% - alloc::vec::Vec$LT$T$C$A$GT$::push::ha3426502ffc42c8b
|
||||
1.00 Mc 0.0% - alloc::raw_vec::RawVec$LT$T$C$A$GT$::reserve_for_push::he4a29b8274e35dbb
|
||||
1.00 Mc 0.0% - alloc::raw_vec::RawVec$LT$T$C$A$GT$::grow_amortized::h78db9ba423623c58
|
||||
1.00 Mc 0.0% - alloc::raw_vec::finish_grow::h876f5af1c66d74c8
|
||||
1.00 Mc 0.0% - _$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$::allocate::hcc733a40a34fbc94
|
||||
1.00 Mc 0.0% - alloc::alloc::Global::alloc_impl::hc55feba7d6266dfa
|
||||
1.00 Mc 0.0% - alloc::alloc::alloc::hfac63f3d6850b759
|
||||
1.00 Mc 0.0% - _malloc_zone_malloc
|
||||
1.00 Mc 0.0% - nanov2_malloc
|
||||
1.00 Mc 0.0% - nanov2_allocate
|
||||
1.00 Mc 0.0% - nanov2_allocate
|
||||
1.00 Mc 0.0% 1.00 Mc nanov2_find_block_and_allocate
|
||||
1.00 Mc 0.0% 1.00 Mc example_app::example_b::h71b31fcd89b9ffd2
|
||||
1.00 Mc 0.0% 1.00 Mc core::time::Duration::as_millis::hae6ad1b9cf7bb5ec
|
||||
47.45 Gc 49.3% 415.12 Mc std::time::Instant::elapsed::h2e3793148fc23529
|
||||
46.39 Gc 48.2% 46.39 Gc mach_absolute_time
|
||||
649.70 Mc 0.6% 649.70 Mc std::time::Instant::elapsed::h2e3793148fc23529
|
||||
614.22 Mc 0.6% 614.22 Mc core::time::Duration::as_millis::hae6ad1b9cf7bb5ec
|
||||
190.55 Mc 0.1% 190.55 Mc example_app::main::hddab13ae8d8b6a6e
|
||||
1.34 Kc 0.0% - std::io::stdio::_print::hdecfefdeb43586ed
|
||||
1.34 Kc 0.0% - _$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$::write_fmt::h2cb06dcd2b172844
|
||||
1.34 Kc 0.0% - core::fmt::write::hed96bcfc6342aee5
|
||||
532 cycles 0.0% - _$LT$std..io..Write..write_fmt..Adapter$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$::write_str::hbe33ec23de24ce2f
|
||||
532 cycles 0.0% 532 cycles _$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$::write_all::h22667d0a03b2151b
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,30 @@
|
||||
# callgrind format
|
||||
events: Instructions
|
||||
|
||||
fl=alpha.c
|
||||
fn=alpha
|
||||
1 10
|
||||
cfl=beta.c
|
||||
cfn=beta
|
||||
calls=1 1
|
||||
1 10
|
||||
cfn=gamma
|
||||
calls=1 1
|
||||
1 10
|
||||
cfn=delta
|
||||
calls=1 1
|
||||
1 20
|
||||
|
||||
fn=delta
|
||||
1 10
|
||||
cfn=gamma
|
||||
calls=1 1
|
||||
1 10
|
||||
|
||||
fn=gamma
|
||||
1 10
|
||||
cfl=
|
||||
|
||||
fl=beta.c
|
||||
fn=beta
|
||||
1 10
|
||||
@@ -0,0 +1,24 @@
|
||||
# callgrind format
|
||||
events: Instructions
|
||||
|
||||
fl=file1.c
|
||||
fn=main
|
||||
16 20
|
||||
cfn=func1
|
||||
calls=1 50
|
||||
16 400
|
||||
cfi=file2.c
|
||||
cfn=func2
|
||||
calls=3 20
|
||||
16 400
|
||||
|
||||
fn=func1
|
||||
51 100
|
||||
cfi=file2.c
|
||||
cfn=func2
|
||||
calls=2 20
|
||||
51 300
|
||||
|
||||
fl=file2.c
|
||||
fn=func2
|
||||
20 700
|
||||
@@ -0,0 +1,29 @@
|
||||
version: 1
|
||||
creator: xdebug 3.0.2 (PHP 7.4.14)
|
||||
cmd: /var/www/html/index.php
|
||||
part: 1
|
||||
positions: line
|
||||
|
||||
events: Time_(10ns) Memory_(bytes)
|
||||
|
||||
fl=(1) file1.c
|
||||
fn=(1) main
|
||||
16 20 15000
|
||||
cfn=(2) func1
|
||||
calls=1 50
|
||||
16 400 20000
|
||||
cfi=(2) file2.c
|
||||
cfn=(3) func2
|
||||
calls=3 51
|
||||
16 400 3000
|
||||
|
||||
fn=(2)
|
||||
51 100 15000
|
||||
cfi=(2)
|
||||
cfn=(3)
|
||||
calls=2 20
|
||||
51 300 5000
|
||||
|
||||
fl=(2)
|
||||
fn=(3)
|
||||
20 700 8000
|
||||
@@ -0,0 +1,24 @@
|
||||
# callgrind format
|
||||
events: Instructions
|
||||
|
||||
fl=(1) file1.c
|
||||
fn=(1) main
|
||||
16 20
|
||||
cfn=(2) func1
|
||||
calls=1 50
|
||||
16 400
|
||||
cfi=(2) file2.c
|
||||
cfn=(3) func2
|
||||
calls=3 20
|
||||
16 400
|
||||
|
||||
fn=(2)
|
||||
51 100
|
||||
cfi=(2)
|
||||
cfn=(3)
|
||||
calls=2 20
|
||||
51 300
|
||||
|
||||
fl=(2)
|
||||
fn=(3)
|
||||
20 700
|
||||
@@ -0,0 +1,24 @@
|
||||
# callgrind format
|
||||
events: Instructions
|
||||
|
||||
fl=file1.c
|
||||
fn=main
|
||||
16 20
|
||||
cfn=func1
|
||||
calls=1 50
|
||||
* 400
|
||||
cfi=file2.c
|
||||
cfn=func2
|
||||
calls=3 20
|
||||
* *
|
||||
|
||||
fn=func1
|
||||
+35 -300
|
||||
cfi=file2.c
|
||||
cfn=func2
|
||||
calls=2 20
|
||||
* 300
|
||||
|
||||
fl=file2.c
|
||||
fn=func2
|
||||
-31 +400
|
||||
@@ -0,0 +1,16 @@
|
||||
Script_abc_example_quest log opened (PC)
|
||||
500:PUSH:3053:1:abcExampleQuest (24021278):abc_example_quest..exampleFunction1
|
||||
1500:POP:3053:1:abcExampleQuest (24021278):abc_example_quest..exampleFunction1
|
||||
1700:PUSH:3053:2:abcExampleQuest (24021278):abc_example_quest..exampleFunction2
|
||||
1750:POP:3053:2:abcExampleQuest (24021278):abc_example_quest..exampleFunction2
|
||||
2000:PUSH:3208:2:abcExampleQuest (24021278):abc_example_quest..exampleFunction3
|
||||
2000:PUSH:3053:3:None:abc_example_quest..exampleFunction4
|
||||
2000:POP:3208:2:abcExampleQuest (24021278):abc_example_quest..exampleFunction3
|
||||
2000:POP:3053:3:None:abc_example_quest..exampleFunction4
|
||||
2000:PUSH:3947:1:None:abc_example_quest..exampleFunction5
|
||||
2250:PUSH:3949:1:None:abc_example_quest..exampleFunction6
|
||||
2500:POP:3949:1:None:abc_example_quest..exampleFunction6
|
||||
3000:POP:3947:1:None:abc_example_quest..exampleFunction5
|
||||
3450:PUSH:3947:1:abcExampleQuest (24021278):abc_example_quest..exampleFunction1
|
||||
3500:POP:3947:1:abcExampleQuest (24021278):abc_example_quest..exampleFunction1
|
||||
Log closed
|
||||
@@ -0,0 +1,24 @@
|
||||
Stack_3185 log opened (PC)
|
||||
50002:START:3185
|
||||
50002:POP:3185:3:None:Debug..StartStackProfiling
|
||||
50002:QUEUE_PUSH:3185:3: (00018A56):Location.??.GetFormID
|
||||
50018:PUSH:3185:3: (00018A56):Form..GetFormID
|
||||
50018:POP:3185:3: (00018A56):Form..GetFormID
|
||||
50018:PUSH:3185:3:None:abc_example_mod_quest..exampleFunction1
|
||||
50018:QUEUE_PUSH:3185:4: (00018A56):Location.??.GetFormID
|
||||
50035:PUSH:3185:4: (00018A56):Form..GetFormID
|
||||
50035:POP:3185:4: (00018A56):Form..GetFormID
|
||||
50035:PUSH:3185:4:None:Game..GetModName
|
||||
50035:POP:3185:4:None:Game..GetModName
|
||||
50035:POP:3185:3:None:abc_example_mod_quest..exampleFunction1
|
||||
50035:POP:3185:2:None:abc_example_mod_quest..exampleFunction2
|
||||
50035:QUEUE_PUSH:3185:2:WhiterunPLainsDistrict03 (0001A27A):Cell.??.IsInterior
|
||||
50051:PUSH:3185:2:WhiterunPLainsDistrict03 (0001A27A):Cell..IsInterior
|
||||
50051:POP:3185:2:WhiterunPLainsDistrict03 (0001A27A):Cell..IsInterior
|
||||
50051:POP:3185:1:abcExampleModQuest (24021278):abc_example_mod_quest..exampleFunction3
|
||||
50051:QUEUE_PUSH:3185:1:None:utility.??.WaitMenuMode
|
||||
50068:PUSH:3185:1:None:utility..WaitMenuMode
|
||||
50602:POP:3185:1:None:utility..WaitMenuMode
|
||||
50602:QUEUE_POP:3185:0:None:abc_example_mod_effect..OnEffectStart
|
||||
50619:POP:3185:0:None:abc_example_mod_effect..OnEffectStart
|
||||
Log closed
|
||||
@@ -0,0 +1,4 @@
|
||||
This directory contains profiles & source-maps to test if source-map
|
||||
remapping of profiles is working correctly. See the corresponding
|
||||
"sourcemaps" directory in programs/javascript to see how these were
|
||||
generated.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": ["gamma.ts", "beta.ts", "delta.ts", "alpha.ts", "kludge.ts", "typescript-source-map-test.ts"],
|
||||
"sourcesContent": ["export const gamma = () => {\n let prod = 1\n for (let i = 1; i < 1000; i++) {\n prod *= i\n }\n return prod\n}\n", "import {gamma} from './gamma'\n\nexport function beta() {\n for (let i = 0; i < 10; i++) {\n gamma()\n }\n}\n", "import {gamma} from './gamma'\n\nexport const delta = function () {\n for (let i = 0; i < 10; i++) {\n gamma()\n }\n}\n", "import {beta} from './beta'\nimport {delta} from './delta'\n\nexport function alpha() {\n ;(function () {\n for (let i = 0; i < 1000; i++) {\n beta()\n delta()\n }\n })()\n}\n", "import {alpha} from './alpha'\n\nexport class Kludge {\n constructor() {\n alpha()\n console.log(this.floop)\n }\n\n zap() {\n alpha()\n }\n\n get floop(): number {\n alpha()\n return 1\n }\n}\n", "import {Kludge} from './kludge'\n\nconst k = new Kludge()\nk.zap()\n"],
|
||||
"mappings": "MAAO,KAAM,GAAQ,KACnB,GAAI,GAAO,EACX,OAAS,GAAI,EAAG,EAAI,IAAM,IACxB,GAAQ,EAEV,MAAO,ICHF,aACL,OAAS,GAAI,EAAG,EAAI,GAAI,IACtB,ICFG,KAAM,GAAQ,WACnB,OAAS,GAAI,EAAG,EAAI,GAAI,IACtB,KCDG,aACJ,AAAC,YACA,OAAS,GAAI,EAAG,EAAI,IAAM,IACxB,IACA,QCPN,QAGE,cACE,IACA,QAAQ,IAAI,KAAK,OAGnB,MACE,OAGE,SACF,WACO,GCZX,KAAM,GAAI,GAAI,GACd,EAAE",
|
||||
"names": []
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["gamma.ts","beta.ts","delta.ts","alpha.ts","kludge.ts","typescript-source-map-test.ts"],"names":[],"mappings":";AAAO,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,WAAA,EAAA,IAAM,EAAQ,WAEd,IADD,IAAA,EAAO,EACF,EAAI,EAAG,EAAI,IAAM,IACxB,GAAQ,EAEH,OAAA,GALF,QAAA,MAAA;;ACMN,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,KAAA,EAND,IAAA,EAAA,QAAA,WAEM,SAAU,IACT,IAAA,IAAI,EAAI,EAAG,EAAI,GAAI,KACtB,EAAA,EAAA;;ACFG,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,WAAA,EAFP,IAAA,EAAA,QAAA,WAEa,EAAQ,WACd,IAAA,IAAI,EAAI,EAAG,EAAI,GAAI,KACtB,EAAA,EAAA,UAFG,QAAA,MAAA;;ACQN,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,MAAA,EAVD,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,WAEM,SAAU,KACZ,WACK,IAAA,IAAI,EAAI,EAAG,EAAI,IAAM,KACxB,EAAA,EAAA,SACA,EAAA,EAAA,SAHF;;ACFJ,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,YAAA,EAFA,IAAA,EAAA,QAAA,WAEA,EAAA,WACE,SAAA,KACE,EAAA,EAAA,SACA,QAAQ,IAAI,KAAK,OAWrB,OARE,EAAA,UAAA,IAAA,YACE,EAAA,EAAA,UAGF,OAAA,eAAI,EAAA,UAAA,QAAK,CAAT,IAAA,WAES,OADP,EAAA,EAAA,SACO,GAFA,YAAA,EAVX,cAAA,IAcA,EAdA,GAAA,QAAA,OAAA;;ACCA,aAHA,IAAA,EAAA,QAAA,YAEM,EAAI,IAAI,EAAJ,OACV,EAAE","file":"typescript-source-map-test.js","sourceRoot":"..","sourcesContent":["export const gamma = () => {\n let prod = 1\n for (let i = 1; i < 1000; i++) {\n prod *= i\n }\n return prod\n}\n","import {gamma} from './gamma'\n\nexport function beta() {\n for (let i = 0; i < 10; i++) {\n gamma()\n }\n}\n","import {gamma} from './gamma'\n\nexport const delta = function () {\n for (let i = 0; i < 10; i++) {\n gamma()\n }\n}\n","import {beta} from './beta'\nimport {delta} from './delta'\n\nexport function alpha() {\n ;(function () {\n for (let i = 0; i < 1000; i++) {\n beta()\n delta()\n }\n })()\n}\n","import {alpha} from './alpha'\n\nexport class Kludge {\n constructor() {\n alpha()\n console.log(this.floop)\n }\n\n zap() {\n alpha()\n }\n\n get floop(): number {\n alpha()\n return 1\n }\n}\n","import {Kludge} from './kludge'\n\nconst k = new Kludge()\nk.zap()\n"]}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["webpack://speedscope-sourcemap-test-project/./gamma.ts","webpack://speedscope-sourcemap-test-project/./beta.ts","webpack://speedscope-sourcemap-test-project/./delta.ts","webpack://speedscope-sourcemap-test-project/./alpha.ts","webpack://speedscope-sourcemap-test-project/./typescript-source-map-test.ts","webpack://speedscope-sourcemap-test-project/./kludge.ts"],"names":["gamma","prod","i","beta","delta","alpha","console","log","this","floop","zap"],"mappings":"mBAAO,IAAMA,EAAQ,WAEnB,IADA,IAAIC,EAAO,EACFC,EAAI,EAAGA,EAAI,IAAMA,IACxBD,GAAQC,EAEV,OAAOD,GCHF,SAASE,IACd,IAAK,IAAID,EAAI,EAAGA,EAAI,GAAIA,IACtBF,ICFG,IAAMI,EAAQ,WACnB,IAAK,IAAIF,EAAI,EAAGA,EAAI,GAAIA,IACtBF,KCDG,SAASK,KACb,WACC,IAAK,IAAIH,EAAI,EAAGA,EAAI,IAAMA,IACxBC,IACAC,IAHH,ICFO,ICAV,WACE,aACEC,IACAC,QAAQC,IAAIC,KAAKC,OAWrB,OARE,YAAAC,IAAA,WACEL,KAGF,sBAAI,oBAAK,C,IAAT,WAEE,OADAA,IACO,G,gCAEX,EAdA,KDCEK,O","file":"typescript-source-map-test.js","sourcesContent":["export const gamma = () => {\n let prod = 1\n for (let i = 1; i < 1000; i++) {\n prod *= i\n }\n return prod\n}\n","import {gamma} from './gamma'\n\nexport function beta() {\n for (let i = 0; i < 10; i++) {\n gamma()\n }\n}\n","import {gamma} from './gamma'\n\nexport const delta = function () {\n for (let i = 0; i < 10; i++) {\n gamma()\n }\n}\n","import {beta} from './beta'\nimport {delta} from './delta'\n\nexport function alpha() {\n ;(function () {\n for (let i = 0; i < 1000; i++) {\n beta()\n delta()\n }\n })()\n}\n","import {Kludge} from './kludge'\n\nconst k = new Kludge()\nk.zap()\n","import {alpha} from './alpha'\n\nexport class Kludge {\n constructor() {\n alpha()\n console.log(this.floop)\n }\n\n zap() {\n alpha()\n }\n\n get floop(): number {\n alpha()\n return 1\n }\n}\n"],"sourceRoot":""}
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,8 @@
|
||||
# comment that gives extra info about the samples
|
||||
// some other comment
|
||||
a;b;c 1
|
||||
a;b;c 1
|
||||
a;b;d 4
|
||||
a;b;c 3
|
||||
a;b 5
|
||||
invalid line
|
||||
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 one or more lines are too long
@@ -0,0 +1,25 @@
|
||||
[
|
||||
{ "pid": 0, "tid": 0, "ph": "B", "ts": 0, "name": "A" },
|
||||
{ "pid": 0, "tid": 0, "ph": "E", "ts": 2, "name": "A" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 0, "dur": 2, "name": "B" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 10, "dur": 2, "name": "C" },
|
||||
{ "pid": 0, "tid": 0, "ph": "B", "ts": 10, "name": "D" },
|
||||
{ "pid": 0, "tid": 0, "ph": "E", "ts": 12, "name": "D" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 20, "dur": 1, "name": "E" },
|
||||
{ "pid": 0, "tid": 0, "ph": "B", "ts": 20, "name": "F" },
|
||||
{ "pid": 0, "tid": 0, "ph": "E", "ts": 22, "name": "F" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "B", "ts": 30, "name": "G" },
|
||||
{ "pid": 0, "tid": 0, "ph": "E", "ts": 32, "name": "G" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 30, "dur": 1, "name": "H" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 41, "dur": 1, "name": "I" },
|
||||
{ "pid": 0, "tid": 0, "ph": "B", "ts": 40, "name": "J" },
|
||||
{ "pid": 0, "tid": 0, "ph": "E", "ts": 42, "name": "J" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "B", "ts": 50, "name": "K" },
|
||||
{ "pid": 0, "tid": 0, "ph": "E", "ts": 52, "name": "K" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 51, "dur": 1, "name": "L" }
|
||||
]
|
||||
@@ -0,0 +1,5 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 2}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "args": {"x": 1}, "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "B", "args": {"x": 2}, "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "A", "args": {"x": 2}, "ts": 10},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "Z", "args": {"x": 1}, "ts": 10, "dur": 1}
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{"tid": 1, "ph": "X", "pid": 0, "name": "alpha", "args": {"x": 0}, "ts": 0, "dur": 10},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "beta", "args": {"x": 0}, "ts": 1},
|
||||
{"tid": 1, "ph": "B", "pid": 0, "name": "gamma", "args": {"x": 0}, "ts": 1},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "beta", "args": {"x": 1}, "ts": 2},
|
||||
{"tid": 1, "ph": "E", "pid": 0, "name": "gamma", "args": {"x": 1}, "ts": 2}
|
||||
]
|
||||
@@ -0,0 +1,4 @@
|
||||
[
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 0, "dur": 10, "name": "alpha" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 5, "dur": 10, "name": "beta" }
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 0, "dur": 10, "name": "alpha" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 1, "dur": 1, "name": "beta" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 1, "dur": 1, "name": "gamma" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 5, "dur": 1, "name": "gamma" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 5, "dur": 1, "name": "beta" }
|
||||
]
|
||||
@@ -0,0 +1,4 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "args": {"x": 1}, "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "A", "args": {"x": 2}, "ts": 10}
|
||||
]
|
||||
@@ -0,0 +1,4 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 10}
|
||||
]
|
||||
@@ -0,0 +1,5 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "args": {"x": 1}, "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "args": {"x": 2}, "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "A", "args": {"x": 1}, "ts": 10, "dur": 1}
|
||||
]
|
||||
@@ -0,0 +1,5 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "args": {"x": 1}, "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "B", "args": {"x": 2}, "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "C", "args": {"x": 2}, "ts": 2}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "alpha", "ts": 9},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 10},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "alpha", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "beta", "ts": 1}
|
||||
]
|
||||
@@ -0,0 +1,10 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "B", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "B", "ts": 9},
|
||||
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "A", "ts": 10},
|
||||
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "C", "ts": 2},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "C", "ts": 8}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "args": {"x": 1}, "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "args": {"x": 2}, "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "A", "args": {"x": 1}, "ts": 9},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "A", "args": {"x": 2}, "ts": 10}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{"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": "alpha", "ts": 9},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "beta", "ts": 10}
|
||||
]
|
||||
@@ -0,0 +1,15 @@
|
||||
[
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 0, "dur": 20, "name": "alpha" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 1, "dur": 2, "name": "beta" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 2, "dur": 1, "name": "gamma" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 5, "dur": 2, "name": "gamma" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 6, "dur": 1, "name": "beta" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 10, "dur": 1, "name": "gamma" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 9, "dur": 2, "name": "beta" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 15, "dur": 1, "name": "beta" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 14, "dur": 2, "name": "gamma" }
|
||||
]
|
||||
@@ -0,0 +1,15 @@
|
||||
[
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 0, "dur": 20, "name": "alpha" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 1, "dur": 2, "name": "beta" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 1, "dur": 1, "name": "gamma" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 5, "dur": 2, "name": "gamma" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 5, "dur": 1, "name": "beta" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 9, "dur": 1, "name": "beta" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 9, "dur": 2, "name": "gamma" },
|
||||
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 13, "dur": 1, "name": "gamma" },
|
||||
{ "pid": 0, "tid": 0, "ph": "X", "ts": 13, "dur": 2, "name": "beta" }
|
||||
]
|
||||
@@ -0,0 +1,9 @@
|
||||
[
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "A", "ts": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "B", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "B", "ts": 1},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "C", "ts": 2},
|
||||
{"pid": 0, "tid": 0, "ph": "B", "name": "C", "ts": 2},
|
||||
{"pid": 0, "tid": 0, "ph": "X", "name": "D", "ts": 3, "dur": 0},
|
||||
{"pid": 0, "tid": 0, "ph": "E", "name": "A", "ts": 10}
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
## Source Map Test Project
|
||||
|
||||
This directory contains test files used to test whether the remapping of
|
||||
performance profiles using sourcemaps work correctly.
|
||||
|
||||
Run `npm run build` to build the artifacts, then open the appropriate files in
|
||||
the `html` directory in whatever browser you're testing.
|
||||
|
||||
The idea is to sourcemaps generated by a variety of tools, and also to take
|
||||
profiles from a variety of browsers, and hopefully see that they all get
|
||||
remapped as expected.
|
||||
|
||||
This project is set up to go through three levels of source-map indirection,
|
||||
and also using multiple different build chains.
|
||||
|
||||
1. TypeScript -> JavaScript source generation
|
||||
2. JavaScript source -> JavaScript bundling
|
||||
3. Minification
|
||||
|
||||
Some bundlers will swap the order of steps 2 & 3, or potentially merge them,
|
||||
but it's complex yet realistic enough that this will hoepfully suss out
|
||||
problems.
|
||||
@@ -0,0 +1,11 @@
|
||||
import {beta} from './beta'
|
||||
import {delta} from './delta'
|
||||
|
||||
export function alpha() {
|
||||
;(function () {
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
beta()
|
||||
delta()
|
||||
}
|
||||
})()
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import {gamma} from './gamma'
|
||||
|
||||
export function beta() {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import {gamma} from './gamma'
|
||||
|
||||
export const delta = function () {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
gamma()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
export const gamma = () => {
|
||||
let prod = 1
|
||||
for (let i = 1; i < 1000; i++) {
|
||||
prod *= i
|
||||
}
|
||||
return prod
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
<title>ESbuild</title>
|
||||
<script src="../dist/esbuild/typescript-source-map-test.js"></script>
|
||||
<h1>ESbuild Source Map Test</h1>
|
||||
@@ -0,0 +1,3 @@
|
||||
<title>Parcel</title>
|
||||
<script src="../dist/parcel/typescript-source-map-test.js"></script>
|
||||
<h1>Parcel Source Map Test</h1>
|
||||
@@ -0,0 +1,3 @@
|
||||
<title>Webpack</title>
|
||||
<script src="../dist/webpack/typescript-source-map-test.js"></script>
|
||||
<h1>Webpack Source Map Test</h1>
|
||||
@@ -0,0 +1,17 @@
|
||||
import {alpha} from './alpha'
|
||||
|
||||
export class Kludge {
|
||||
constructor() {
|
||||
alpha()
|
||||
console.log(this.floop)
|
||||
}
|
||||
|
||||
zap() {
|
||||
alpha()
|
||||
}
|
||||
|
||||
get floop(): number {
|
||||
alpha()
|
||||
return 1
|
||||
}
|
||||
}
|
||||
+10497
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "speedscope-sourcemap-test-project",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"private": "true",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "npm run parcel && npm run webpack && npm run esbuild",
|
||||
"parcel": "parcel build -o parcel/typescript-source-map-test typescript-source-map-test.ts",
|
||||
"webpack": "webpack",
|
||||
"esbuild": "esbuild --sourcemap --minify --bundle --outdir=dist/esbuild typescript-source-map-test.ts"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"esbuild": "^0.7.14",
|
||||
"parcel": "^1.12.4",
|
||||
"ts-loader": "^8.0.4",
|
||||
"typescript": "^4.0.3",
|
||||
"webpack": "^5.0.0",
|
||||
"webpack-cli": "^4.0.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist/",
|
||||
"noImplicitAny": true,
|
||||
"sourceMap": true,
|
||||
"module": "es6",
|
||||
"target": "es5",
|
||||
"jsx": "react"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
import {Kludge} from './kludge'
|
||||
|
||||
const k = new Kludge()
|
||||
k.zap()
|
||||
@@ -0,0 +1,22 @@
|
||||
const path = require('path')
|
||||
|
||||
module.exports = {
|
||||
entry: './typescript-source-map-test.ts',
|
||||
devtool: 'source-map',
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
use: 'ts-loader',
|
||||
exclude: /node_modules/,
|
||||
},
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['.tsx', '.ts', '.js'],
|
||||
},
|
||||
output: {
|
||||
filename: 'typescript-source-map-test.js',
|
||||
path: path.resolve(__dirname, 'dist', 'webpack'),
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
require 'json'
|
||||
require 'stackprof'
|
||||
|
||||
def a
|
||||
for i in 0..2 do
|
||||
b
|
||||
c
|
||||
end
|
||||
end
|
||||
|
||||
def b
|
||||
Object.new
|
||||
end
|
||||
|
||||
def c
|
||||
for i in 0..5
|
||||
(1..10).to_a.sample(3).sort
|
||||
end
|
||||
end
|
||||
|
||||
profile = StackProf.run(mode: :object, raw: true) do
|
||||
a
|
||||
end
|
||||
|
||||
puts JSON.generate(profile)
|
||||
@@ -5,6 +5,7 @@ def a
|
||||
for i in 0..100 do
|
||||
b
|
||||
c
|
||||
e
|
||||
end
|
||||
end
|
||||
|
||||
@@ -28,8 +29,13 @@ def d
|
||||
prod
|
||||
end
|
||||
|
||||
profile = StackProf.run(mode: :wall, raw: true) do
|
||||
def e
|
||||
sleep 0.05
|
||||
end
|
||||
|
||||
mode = (ARGV[0] || :wall).to_sym
|
||||
profile = StackProf.run(mode: mode, raw: true) do
|
||||
a
|
||||
end
|
||||
|
||||
puts JSON.generate(profile)
|
||||
puts JSON.generate(profile)
|
||||
|
||||
+1
-1
@@ -58,5 +58,5 @@ echo "Build complete. Starting server on http://localhost:4444/"
|
||||
echo "Hit Ctrl+C to complete or cancel the release"
|
||||
echo
|
||||
echo
|
||||
python -m SimpleHTTPServer 4444 .
|
||||
python3 -m http.server 4444
|
||||
set +x
|
||||
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Print changes since the last tagged release in a format to match CHANGELOG.md
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Usage: $0 <version>"
|
||||
echo "e.g. $0 1.15.2"
|
||||
exit 1
|
||||
fi
|
||||
version="$1"
|
||||
|
||||
|
||||
# Get the most recent tagged commit that is an ancestor of HEAD
|
||||
tagged_commit=$(git log --simplify-by-decoration --oneline --decorate | grep -E '^\w+ \(tag: .+\) .+$' | head -n1 | cut -d' ' -f 1)
|
||||
|
||||
gitlog=$(git log --graph --pretty=format:"%s" --abbrev-commit "$tagged_commit"..HEAD)
|
||||
|
||||
version="$1"
|
||||
|
||||
current_date=$(date +%Y-%m-%d)
|
||||
echo "## [$version] - $current_date"
|
||||
echo
|
||||
|
||||
while IFS= read line; do
|
||||
message=$(echo "$line" | sed 's/^* //g')
|
||||
message_without_pr_num=$(echo "$message" | sed 's/ (#[0-9][0-9]*)//g')
|
||||
|
||||
pr_number=$(echo "$message" | grep -Eo '#[0-9]+' | grep -Eo '[0-9]+'; true)
|
||||
|
||||
if [[ -n "$pr_number" ]]; then
|
||||
author=$(gh pr view $pr_number --json author -q ".author.login")
|
||||
pr_link="https://github.com/jlfwong/speedscope/pull/$pr_number"
|
||||
echo "- $message_without_pr_num [[#$pr_number]($pr_link)] (by @$author)"
|
||||
else
|
||||
echo "- $message_without_pr_num"
|
||||
fi
|
||||
done <<< "$gitlog"
|
||||
Executable
+51
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Run the full release process. This means...
|
||||
# - Bumping the version in package.json
|
||||
# - Updating the changelog
|
||||
# - Commiting and tagging the release
|
||||
# - Pushing to Github
|
||||
# - Publishing a new version to npm
|
||||
# - Deploying the website
|
||||
# - Create a new release in Github with the zip-file standalone version
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Usage: $0 <minor | patch | version>"
|
||||
echo "e.g. $0 patch"
|
||||
exit 1
|
||||
fi
|
||||
version_arg="$1"
|
||||
|
||||
# Bump versions in package.json and package-lock.json, but don't commit or make tags yet
|
||||
version=$(npm version "$version_arg" --no-git-tag-version --no-commit-hooks | sed 's/^v//g')
|
||||
tagname="v$version"
|
||||
|
||||
script_dir=$(dirname "$0")
|
||||
|
||||
# Prepend the changelog update to CHANGELOG.md
|
||||
changelog_update=$("$script_dir/print-changelog-update.sh" "$version")
|
||||
|
||||
echo -e "$changelog_update\n" > CHANGELOG.md.new
|
||||
cat CHANGELOG.md >> CHANGELOG.md.new
|
||||
mv CHANGELOG.md.new CHANGELOG.md
|
||||
|
||||
# Commit and tag the release
|
||||
git add CHANGELOG.md package.json package-lock.json
|
||||
git commit -m "$version"
|
||||
git tag "$tagname"
|
||||
|
||||
# Push to Github
|
||||
git push
|
||||
git push --tags
|
||||
|
||||
# Publish to npm
|
||||
npm publish
|
||||
|
||||
# Create a new release on Github
|
||||
"$script_dir/prepare-zip-file.sh"
|
||||
gh release create "$tagname" --title "$tagname" --notes "$changelog_update" --attach "dist/release/speedscope-$version.zip"
|
||||
|
||||
# Deploy the website
|
||||
npm run deploy
|
||||
+6
-6
@@ -4,10 +4,10 @@ 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,
|
||||
- `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)
|
||||
- `app-state/`: Speedscope's application state management
|
||||
- `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).
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import {Profile} from '../lib/profile'
|
||||
import {getProfileToView} from './getters'
|
||||
import {flattenRecursionAtom, profileGroupAtom} from '.'
|
||||
import {FlamechartViewState, SandwichViewState} from './profile-group'
|
||||
import {useAtom} from '../lib/atom'
|
||||
|
||||
export interface ApplicationState {}
|
||||
|
||||
export interface ActiveProfileState {
|
||||
profile: Profile
|
||||
index: number
|
||||
chronoViewState: FlamechartViewState
|
||||
leftHeavyViewState: FlamechartViewState
|
||||
sandwichViewState: SandwichViewState
|
||||
}
|
||||
|
||||
export function useActiveProfileState(): ActiveProfileState | null {
|
||||
const flattenRecursion = useAtom(flattenRecursionAtom)
|
||||
const profileGroupState = useAtom(profileGroupAtom)
|
||||
|
||||
if (!profileGroupState) return null
|
||||
if (profileGroupState.indexToView >= profileGroupState.profiles.length) return null
|
||||
|
||||
const index = profileGroupState.indexToView
|
||||
const profileState = profileGroupState.profiles[index]
|
||||
return {
|
||||
...profileGroupState.profiles[profileGroupState.indexToView],
|
||||
profile: getProfileToView({
|
||||
profile: profileState.profile,
|
||||
flattenRecursion,
|
||||
}),
|
||||
index: profileGroupState.indexToView,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
import {Atom} from '../lib/atom'
|
||||
|
||||
export const enum ColorScheme {
|
||||
// Default: respect prefers-color-schema
|
||||
SYSTEM,
|
||||
|
||||
// Use dark theme
|
||||
DARK,
|
||||
|
||||
// use light theme
|
||||
LIGHT,
|
||||
}
|
||||
|
||||
const localStorageKey = 'speedscope-color-scheme'
|
||||
|
||||
function getStoredPreference(): ColorScheme {
|
||||
const storedPreference = window.localStorage && window.localStorage[localStorageKey]
|
||||
if (storedPreference === 'DARK') {
|
||||
return ColorScheme.DARK
|
||||
} else if (storedPreference === 'LIGHT') {
|
||||
return ColorScheme.LIGHT
|
||||
} else {
|
||||
return ColorScheme.SYSTEM
|
||||
}
|
||||
}
|
||||
|
||||
function matchMediaDarkColorScheme(): MediaQueryList {
|
||||
return matchMedia('(prefers-color-scheme: dark)')
|
||||
}
|
||||
|
||||
function nextColorScheme(scheme: ColorScheme): ColorScheme {
|
||||
const systemPrefersDarkMode = matchMediaDarkColorScheme().matches
|
||||
|
||||
// We'll use a different cycling order for changing the color scheme depending
|
||||
// on what the *current* system preference is. This should guarantee that when
|
||||
// a user interacts with the color scheme toggle for the first time, it always
|
||||
// changes the color scheme.
|
||||
if (systemPrefersDarkMode) {
|
||||
switch (scheme) {
|
||||
case ColorScheme.SYSTEM: {
|
||||
return ColorScheme.LIGHT
|
||||
}
|
||||
case ColorScheme.LIGHT: {
|
||||
return ColorScheme.DARK
|
||||
}
|
||||
case ColorScheme.DARK: {
|
||||
return ColorScheme.SYSTEM
|
||||
}
|
||||
}
|
||||
} else {
|
||||
switch (scheme) {
|
||||
case ColorScheme.SYSTEM: {
|
||||
return ColorScheme.DARK
|
||||
}
|
||||
case ColorScheme.DARK: {
|
||||
return ColorScheme.LIGHT
|
||||
}
|
||||
case ColorScheme.LIGHT: {
|
||||
return ColorScheme.SYSTEM
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ColorSchemeAtom extends Atom<ColorScheme> {
|
||||
cycleToNextColorScheme = () => {
|
||||
this.set(nextColorScheme(this.get()))
|
||||
}
|
||||
}
|
||||
|
||||
export const colorSchemeAtom = new ColorSchemeAtom(getStoredPreference(), 'colorScheme')
|
||||
|
||||
colorSchemeAtom.subscribe(() => {
|
||||
const value = colorSchemeAtom.get()
|
||||
|
||||
switch (value) {
|
||||
case ColorScheme.DARK: {
|
||||
window.localStorage[localStorageKey] = 'DARK'
|
||||
break
|
||||
}
|
||||
case ColorScheme.LIGHT: {
|
||||
window.localStorage[localStorageKey] = 'LIGHT'
|
||||
break
|
||||
}
|
||||
case ColorScheme.SYSTEM: {
|
||||
delete window.localStorage[localStorageKey]
|
||||
break
|
||||
}
|
||||
default: {
|
||||
const _exhaustiveCheck: never = value
|
||||
return _exhaustiveCheck
|
||||
}
|
||||
}
|
||||
return value
|
||||
})
|
||||
@@ -1,9 +1,9 @@
|
||||
import {Frame, Profile} from '../lib/profile'
|
||||
import {triangle, memoizeByReference, memoizeByShallowEquality} from '../lib/utils'
|
||||
import {memoizeByReference, memoizeByShallowEquality} from '../lib/utils'
|
||||
import {RowAtlas} from '../gl/row-atlas'
|
||||
import {CanvasContext} from '../gl/canvas-context'
|
||||
import {Color} from '../lib/color'
|
||||
import {FlamechartRowAtlasKey} from '../gl/flamechart-renderer'
|
||||
import {Theme} from '../views/themes/theme'
|
||||
|
||||
export const createGetColorBucketForFrame = memoizeByReference(
|
||||
(frameToColorBucket: Map<number | string, number>) => {
|
||||
@@ -13,24 +13,27 @@ export const createGetColorBucketForFrame = memoizeByReference(
|
||||
},
|
||||
)
|
||||
|
||||
export const createGetCSSColorForFrame = memoizeByReference(
|
||||
(frameToColorBucket: Map<number | string, number>) => {
|
||||
export const createGetCSSColorForFrame = memoizeByShallowEquality(
|
||||
({
|
||||
theme,
|
||||
frameToColorBucket,
|
||||
}: {
|
||||
theme: Theme
|
||||
frameToColorBucket: Map<number | string, number>
|
||||
}) => {
|
||||
const getColorBucketForFrame = createGetColorBucketForFrame(frameToColorBucket)
|
||||
return (frame: Frame): string => {
|
||||
const t = getColorBucketForFrame(frame) / 255
|
||||
|
||||
const x = triangle(30.0 * t)
|
||||
const H = 360.0 * (0.9 * t)
|
||||
const C = 0.25 + 0.2 * x
|
||||
const L = 0.8 - 0.15 * x
|
||||
return Color.fromLumaChromaHue(L, C, H).toCSS()
|
||||
return theme.colorForBucket(t).toCSS()
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
export const getCanvasContext = memoizeByReference((canvas: HTMLCanvasElement) => {
|
||||
return new CanvasContext(canvas)
|
||||
})
|
||||
export const getCanvasContext = memoizeByShallowEquality(
|
||||
({theme, canvas}: {theme: Theme; canvas: HTMLCanvasElement}) => {
|
||||
return new CanvasContext(canvas, theme)
|
||||
},
|
||||
)
|
||||
|
||||
export const getRowAtlas = memoizeByReference((canvasContext: CanvasContext) => {
|
||||
return new RowAtlas<FlamechartRowAtlasKey>(
|
||||
@@ -0,0 +1,78 @@
|
||||
import {Atom} from '../lib/atom'
|
||||
import {ViewMode} from '../lib/view-mode'
|
||||
import {getHashParams, HashParams} from '../lib/hash-params'
|
||||
import {ProfileGroupAtom} from './profile-group'
|
||||
|
||||
// True if recursion should be flattened when viewing flamegraphs
|
||||
export const flattenRecursionAtom = new Atom<boolean>(false, 'flattenRecursion')
|
||||
|
||||
// The query used in top-level views
|
||||
//
|
||||
// An empty string indicates that the search is open by no filter is applied.
|
||||
// searchIsActive is stored separately, because we may choose to persist the
|
||||
// query even when the search input is closed.
|
||||
export const searchIsActiveAtom = new Atom<boolean>(false, 'searchIsActive')
|
||||
export const searchQueryAtom = new Atom<string>('', 'searchQueryAtom')
|
||||
|
||||
// Which top-level view should be displayed
|
||||
export const viewModeAtom = new Atom<ViewMode>(ViewMode.CHRONO_FLAME_CHART, 'viewMode')
|
||||
|
||||
// The top-level profile group from which most other data will be derived
|
||||
export const profileGroupAtom = new ProfileGroupAtom(null, 'profileGroup')
|
||||
|
||||
viewModeAtom.subscribe(() => {
|
||||
// If we switch views, the hover information is no longer relevant
|
||||
profileGroupAtom.clearHoverNode()
|
||||
})
|
||||
|
||||
// Parameters defined by the URL encoded k=v pairs after the # in the URL
|
||||
const hashParams = getHashParams()
|
||||
export const hashParamsAtom = new Atom<HashParams>(hashParams, 'hashParams')
|
||||
|
||||
// The <canvas> element used for WebGL
|
||||
export const glCanvasAtom = new Atom<HTMLCanvasElement | null>(null, 'glCanvas')
|
||||
|
||||
// True when a file drag is currently active. Used to indicate that the
|
||||
// application is a valid drop target.
|
||||
export const dragActiveAtom = new Atom<boolean>(false, 'dragActive')
|
||||
|
||||
// True when the application is currently in a loading state. Used to
|
||||
// display a loading progress bar.
|
||||
|
||||
// Speedscope is usable both from a local HTML file being served
|
||||
// from a file:// URL, and via websites. In the case of file:// URLs,
|
||||
// however, XHR will be unavailable to fetching files in adjacent directories.
|
||||
const protocol = window.location.protocol
|
||||
export const canUseXHR = protocol === 'http:' || protocol === 'https:'
|
||||
const isImmediatelyLoading = canUseXHR && hashParams.profileURL != null
|
||||
export const loadingAtom = new Atom<boolean>(isImmediatelyLoading, 'loading')
|
||||
|
||||
// True when the application is an error state, e.g. because the profile
|
||||
// imported was invalid.
|
||||
export const errorAtom = new Atom<boolean>(false, 'error')
|
||||
|
||||
export enum SortField {
|
||||
SYMBOL_NAME,
|
||||
SELF,
|
||||
TOTAL,
|
||||
}
|
||||
|
||||
export enum SortDirection {
|
||||
ASCENDING,
|
||||
DESCENDING,
|
||||
}
|
||||
|
||||
export interface SortMethod {
|
||||
field: SortField
|
||||
direction: SortDirection
|
||||
}
|
||||
|
||||
// The table sorting method using for the sandwich view, specifying the column
|
||||
// to sort by, and the direction to sort that clumn.
|
||||
export const tableSortMethodAtom = new Atom<SortMethod>(
|
||||
{
|
||||
field: SortField.SELF,
|
||||
direction: SortDirection.DESCENDING,
|
||||
},
|
||||
'tableSortMethod',
|
||||
)
|
||||
@@ -0,0 +1,227 @@
|
||||
import {Atom} from '../lib/atom'
|
||||
import {clamp, Rect, Vec2} from '../lib/math'
|
||||
import {CallTreeNode, Frame, Profile, ProfileGroup} from '../lib/profile'
|
||||
import {objectsHaveShallowEquality} from '../lib/utils'
|
||||
|
||||
export interface FlamechartViewState {
|
||||
hover: {
|
||||
node: CallTreeNode
|
||||
event: MouseEvent
|
||||
} | null
|
||||
selectedNode: CallTreeNode | null
|
||||
logicalSpaceViewportSize: Vec2
|
||||
configSpaceViewportRect: Rect
|
||||
}
|
||||
|
||||
export interface CallerCalleeState {
|
||||
selectedFrame: Frame
|
||||
invertedCallerFlamegraph: FlamechartViewState
|
||||
calleeFlamegraph: FlamechartViewState
|
||||
}
|
||||
|
||||
export interface SandwichViewState {
|
||||
callerCallee: CallerCalleeState | null
|
||||
}
|
||||
|
||||
export interface ProfileState {
|
||||
profile: Profile
|
||||
chronoViewState: FlamechartViewState
|
||||
leftHeavyViewState: FlamechartViewState
|
||||
sandwichViewState: SandwichViewState
|
||||
}
|
||||
|
||||
export type ProfileGroupState = {
|
||||
name: string
|
||||
|
||||
// The index within the list of profiles currently being viewed
|
||||
indexToView: number
|
||||
|
||||
profiles: ProfileState[]
|
||||
} | null
|
||||
|
||||
export enum FlamechartID {
|
||||
LEFT_HEAVY = 'LEFT_HEAVY',
|
||||
CHRONO = 'CHRONO',
|
||||
SANDWICH_INVERTED_CALLERS = 'SANDWICH_INVERTED_CALLERS',
|
||||
SANDWICH_CALLEES = 'SANDWICH_CALLEES',
|
||||
}
|
||||
|
||||
let initialFlameChartViewState: FlamechartViewState = {
|
||||
hover: null,
|
||||
selectedNode: null,
|
||||
configSpaceViewportRect: Rect.empty,
|
||||
logicalSpaceViewportSize: Vec2.zero,
|
||||
}
|
||||
|
||||
export class ProfileGroupAtom extends Atom<ProfileGroupState> {
|
||||
set(newState: ProfileGroupState) {
|
||||
const oldState = this.state
|
||||
if (oldState != null && newState != null && objectsHaveShallowEquality(oldState, newState)) {
|
||||
return
|
||||
}
|
||||
super.set(newState)
|
||||
}
|
||||
|
||||
getActiveProfile(): ProfileState | null {
|
||||
if (this.state == null) return null
|
||||
return this.state.profiles[this.state?.indexToView] || null
|
||||
}
|
||||
|
||||
setProfileGroup = (group: ProfileGroup) => {
|
||||
this.set({
|
||||
name: group.name,
|
||||
indexToView: group.indexToView,
|
||||
profiles: group.profiles.map(p => ({
|
||||
profile: p,
|
||||
chronoViewState: initialFlameChartViewState,
|
||||
leftHeavyViewState: initialFlameChartViewState,
|
||||
sandwichViewState: {callerCallee: null},
|
||||
})),
|
||||
})
|
||||
}
|
||||
|
||||
setProfileIndexToView = (indexToView: number) => {
|
||||
if (this.state == null) return
|
||||
|
||||
indexToView = clamp(indexToView, 0, this.state.profiles.length - 1)
|
||||
|
||||
this.set({
|
||||
...this.state,
|
||||
indexToView,
|
||||
})
|
||||
}
|
||||
|
||||
private updateActiveProfileState(fn: (profileState: ProfileState) => ProfileState) {
|
||||
if (this.state == null) return
|
||||
const {indexToView, profiles} = this.state
|
||||
this.set({
|
||||
...this.state,
|
||||
profiles: profiles.map((p, i) => {
|
||||
if (i != indexToView) return p
|
||||
return fn(p)
|
||||
}),
|
||||
})
|
||||
}
|
||||
|
||||
private updateActiveSandwichViewState(
|
||||
fn: (sandwichViewState: SandwichViewState) => SandwichViewState,
|
||||
) {
|
||||
this.updateActiveProfileState(p => ({
|
||||
...p,
|
||||
sandwichViewState: fn(p.sandwichViewState),
|
||||
}))
|
||||
}
|
||||
|
||||
setSelectedFrame = (frame: Frame | null) => {
|
||||
if (this.state == null) return
|
||||
|
||||
const profile = this.getActiveProfile()
|
||||
if (profile == null) {
|
||||
return
|
||||
}
|
||||
|
||||
this.updateActiveSandwichViewState(sandwichViewState => {
|
||||
if (frame == null) {
|
||||
return {callerCallee: null}
|
||||
}
|
||||
return {
|
||||
callerCallee: {
|
||||
invertedCallerFlamegraph: initialFlameChartViewState,
|
||||
calleeFlamegraph: initialFlameChartViewState,
|
||||
selectedFrame: frame,
|
||||
},
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private updateFlamechartState(
|
||||
id: FlamechartID,
|
||||
fn: (flamechartViewState: FlamechartViewState) => FlamechartViewState,
|
||||
) {
|
||||
switch (id) {
|
||||
case FlamechartID.CHRONO: {
|
||||
this.updateActiveProfileState(p => ({
|
||||
...p,
|
||||
chronoViewState: fn(p.chronoViewState),
|
||||
}))
|
||||
break
|
||||
}
|
||||
|
||||
case FlamechartID.LEFT_HEAVY: {
|
||||
this.updateActiveProfileState(p => ({
|
||||
...p,
|
||||
leftHeavyViewState: fn(p.leftHeavyViewState),
|
||||
}))
|
||||
break
|
||||
}
|
||||
|
||||
case FlamechartID.SANDWICH_CALLEES: {
|
||||
this.updateActiveSandwichViewState(s => ({
|
||||
...s,
|
||||
callerCallee:
|
||||
s.callerCallee == null
|
||||
? null
|
||||
: {
|
||||
...s.callerCallee,
|
||||
calleeFlamegraph: fn(s.callerCallee.calleeFlamegraph),
|
||||
},
|
||||
}))
|
||||
break
|
||||
}
|
||||
|
||||
case FlamechartID.SANDWICH_INVERTED_CALLERS: {
|
||||
this.updateActiveSandwichViewState(s => ({
|
||||
...s,
|
||||
callerCallee:
|
||||
s.callerCallee == null
|
||||
? null
|
||||
: {
|
||||
...s.callerCallee,
|
||||
invertedCallerFlamegraph: fn(s.callerCallee.invertedCallerFlamegraph),
|
||||
},
|
||||
}))
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setFlamechartHoveredNode(
|
||||
id: FlamechartID,
|
||||
hover: {node: CallTreeNode; event: MouseEvent} | null,
|
||||
) {
|
||||
this.updateFlamechartState(id, f => ({
|
||||
...f,
|
||||
hover,
|
||||
}))
|
||||
}
|
||||
|
||||
setSelectedNode(id: FlamechartID, selectedNode: CallTreeNode | null) {
|
||||
this.updateFlamechartState(id, f => ({
|
||||
...f,
|
||||
selectedNode,
|
||||
}))
|
||||
}
|
||||
|
||||
setConfigSpaceViewportRect(id: FlamechartID, configSpaceViewportRect: Rect) {
|
||||
this.updateFlamechartState(id, f => ({
|
||||
...f,
|
||||
configSpaceViewportRect,
|
||||
}))
|
||||
}
|
||||
|
||||
setLogicalSpaceViewportSize(id: FlamechartID, logicalSpaceViewportSize: Vec2) {
|
||||
this.updateFlamechartState(id, f => ({
|
||||
...f,
|
||||
logicalSpaceViewportSize,
|
||||
}))
|
||||
}
|
||||
|
||||
clearHoverNode() {
|
||||
// TODO(jlfwong): This causes 4 separate observer events. This is probably
|
||||
// fine, since I hope that Preact/React are smart about batching re-renders?
|
||||
this.setFlamechartHoveredNode(FlamechartID.CHRONO, null)
|
||||
this.setFlamechartHoveredNode(FlamechartID.LEFT_HEAVY, null)
|
||||
this.setFlamechartHoveredNode(FlamechartID.SANDWICH_CALLEES, null)
|
||||
this.setFlamechartHoveredNode(FlamechartID.SANDWICH_INVERTED_CALLERS, null)
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,8 @@ import {TextureRenderer} from './texture-renderer'
|
||||
import {Rect, Vec2} from '../lib/math'
|
||||
import {ViewportRectangleRenderer} from './overlay-rectangle-renderer'
|
||||
import {FlamechartColorPassRenderer} from './flamechart-color-pass-renderer'
|
||||
import {Color} from '../lib/color'
|
||||
import {Theme} from '../views/themes/theme'
|
||||
|
||||
type FrameCallback = () => void
|
||||
|
||||
@@ -13,13 +15,19 @@ export class CanvasContext {
|
||||
public readonly textureRenderer: TextureRenderer
|
||||
public readonly viewportRectangleRenderer: ViewportRectangleRenderer
|
||||
public readonly flamechartColorPassRenderer: FlamechartColorPassRenderer
|
||||
public readonly theme: Theme
|
||||
|
||||
constructor(canvas: HTMLCanvasElement) {
|
||||
constructor(canvas: HTMLCanvasElement, theme: Theme) {
|
||||
this.gl = new WebGL.Context(canvas)
|
||||
this.rectangleBatchRenderer = new RectangleBatchRenderer(this.gl)
|
||||
this.textureRenderer = new TextureRenderer(this.gl)
|
||||
this.viewportRectangleRenderer = new ViewportRectangleRenderer(this.gl)
|
||||
this.flamechartColorPassRenderer = new FlamechartColorPassRenderer(this.gl)
|
||||
this.viewportRectangleRenderer = new ViewportRectangleRenderer(this.gl, theme)
|
||||
this.flamechartColorPassRenderer = new FlamechartColorPassRenderer(this.gl, theme)
|
||||
this.theme = theme
|
||||
|
||||
// Whenever the canvas is resized, draw immediately. This prevents
|
||||
// flickering during resizing.
|
||||
this.gl.addAfterResizeEventHandler(this.onBeforeFrame)
|
||||
|
||||
const webGLInfo = this.gl.getWebGLInfo()
|
||||
if (webGLInfo) {
|
||||
@@ -48,7 +56,8 @@ export class CanvasContext {
|
||||
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))
|
||||
const color = Color.fromCSSHex(this.theme.bgPrimaryColor)
|
||||
this.gl.clear(new Graphics.Color(color.r, color.g, color.b, color.a))
|
||||
|
||||
for (const handler of this.beforeFrameHandlers) {
|
||||
handler()
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {Vec2, Rect, AffineTransform} from '../lib/math'
|
||||
import {Theme} from '../views/themes/theme'
|
||||
import {Graphics} from './graphics'
|
||||
import {setUniformAffineTransform} from './utils'
|
||||
|
||||
@@ -20,7 +21,7 @@ const vert = `
|
||||
}
|
||||
`
|
||||
|
||||
const frag = `
|
||||
const frag = (colorForBucket: string) => `
|
||||
precision mediump float;
|
||||
|
||||
uniform vec2 uvSpacePixelSize;
|
||||
@@ -49,13 +50,7 @@ const frag = `
|
||||
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);
|
||||
}
|
||||
${colorForBucket}
|
||||
|
||||
void main() {
|
||||
vec4 here = texture2D(colorTexture, vUv);
|
||||
@@ -107,7 +102,7 @@ export class FlamechartColorPassRenderer {
|
||||
private material: Graphics.Material
|
||||
private buffer: Graphics.VertexBuffer
|
||||
|
||||
constructor(private gl: Graphics.Context) {
|
||||
constructor(private gl: Graphics.Context, theme: Theme) {
|
||||
const vertices = [
|
||||
{pos: [-1, 1], uv: [0, 1]},
|
||||
{pos: [1, 1], uv: [1, 1]},
|
||||
@@ -124,7 +119,7 @@ export class FlamechartColorPassRenderer {
|
||||
|
||||
this.buffer = gl.createVertexBuffer(vertexFormat.stride * vertices.length)
|
||||
this.buffer.uploadFloats(floats)
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag)
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag(theme.colorForBucketGLSL))
|
||||
}
|
||||
|
||||
render(props: FlamechartColorPassRenderProps) {
|
||||
|
||||
+21
-2
@@ -83,6 +83,15 @@ export namespace Graphics {
|
||||
public alphaF: number,
|
||||
) {}
|
||||
|
||||
equals(other: Color): boolean {
|
||||
return (
|
||||
this.redF === other.redF &&
|
||||
this.greenF === other.greenF &&
|
||||
this.blueF === other.blueF &&
|
||||
this.alphaF === other.alphaF
|
||||
)
|
||||
}
|
||||
|
||||
static TRANSPARENT = new Color(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
@@ -160,6 +169,14 @@ export namespace Graphics {
|
||||
setUnpremultipliedBlendState() {
|
||||
this.setBlendState(BlendOperation.SOURCE_ALPHA, BlendOperation.INVERSE_SOURCE_ALPHA)
|
||||
}
|
||||
|
||||
protected resizeEventHandlers = new Set<() => void>()
|
||||
addAfterResizeEventHandler(callback: () => void): void {
|
||||
this.resizeEventHandlers.add(callback)
|
||||
}
|
||||
removeAfterResizeEventHandler(callback: () => void): void {
|
||||
this.resizeEventHandlers.delete(callback)
|
||||
}
|
||||
}
|
||||
|
||||
export interface Material {
|
||||
@@ -459,7 +476,7 @@ export namespace WebGL {
|
||||
const bounds = canvas.getBoundingClientRect()
|
||||
|
||||
if (
|
||||
this._width === widthInAppUnits &&
|
||||
this._width === widthInPixels &&
|
||||
this._height === heightInPixels &&
|
||||
bounds.width === widthInAppUnits &&
|
||||
bounds.height === heightInAppUnits
|
||||
@@ -476,13 +493,15 @@ export namespace WebGL {
|
||||
this.setViewport(0, 0, widthInPixels, heightInPixels)
|
||||
this._width = widthInPixels
|
||||
this._height = heightInPixels
|
||||
|
||||
this.resizeEventHandlers.forEach(cb => cb())
|
||||
}
|
||||
|
||||
clear(color: Graphics.Color) {
|
||||
this._updateRenderTargetAndViewport()
|
||||
this._updateBlendState()
|
||||
|
||||
if (color != this._currentClearColor) {
|
||||
if (!color.equals(this._currentClearColor)) {
|
||||
this._gl.clearColor(color.redF, color.greenF, color.blueF, color.alphaF)
|
||||
this._currentClearColor = color
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import {Color} from '../lib/color'
|
||||
import {AffineTransform, Rect} from '../lib/math'
|
||||
import {Theme} from '../views/themes/theme'
|
||||
import {Graphics} from './graphics'
|
||||
import {setUniformAffineTransform, setUniformVec2} from './utils'
|
||||
|
||||
@@ -18,53 +20,57 @@ const vert = `
|
||||
}
|
||||
`
|
||||
|
||||
const frag = `
|
||||
precision mediump float;
|
||||
const frag = (theme: Theme) => {
|
||||
const {r, g, b} = Color.fromCSSHex(theme.fgSecondaryColor)
|
||||
const rgb = `${r.toFixed(1)}, ${g.toFixed(1)}, ${b.toFixed(1)}`
|
||||
return `
|
||||
precision mediump float;
|
||||
|
||||
uniform mat3 configSpaceToPhysicalViewSpace;
|
||||
uniform vec2 physicalSize;
|
||||
uniform vec2 physicalOrigin;
|
||||
uniform vec2 configSpaceViewportOrigin;
|
||||
uniform vec2 configSpaceViewportSize;
|
||||
uniform float framebufferHeight;
|
||||
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;
|
||||
void main() {
|
||||
vec2 origin = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportOrigin, 1.0)).xy;
|
||||
vec2 size = (configSpaceToPhysicalViewSpace * vec3(configSpaceViewportSize, 0.0)).xy;
|
||||
|
||||
vec2 halfSize = physicalSize / 2.0;
|
||||
vec2 halfSize = physicalSize / 2.0;
|
||||
|
||||
float borderWidth = 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);
|
||||
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));
|
||||
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);
|
||||
// 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(${rgb}, 0.8);
|
||||
} else {
|
||||
// Outside viewport rectangle
|
||||
gl_FragColor = vec4(${rgb}, 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
`
|
||||
}
|
||||
|
||||
export class ViewportRectangleRenderer {
|
||||
private material: Graphics.Material
|
||||
private buffer: Graphics.VertexBuffer
|
||||
|
||||
constructor(private gl: Graphics.Context) {
|
||||
constructor(private gl: Graphics.Context, theme: Theme) {
|
||||
const vertices = [
|
||||
[-1, 1],
|
||||
[1, 1],
|
||||
@@ -78,7 +84,7 @@ export class ViewportRectangleRenderer {
|
||||
}
|
||||
this.buffer = gl.createVertexBuffer(vertexFormat.stride * vertices.length)
|
||||
this.buffer.upload(new Uint8Array(new Float32Array(floats).buffer))
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag)
|
||||
this.material = gl.createMaterial(vertexFormat, vert, frag(theme))
|
||||
}
|
||||
|
||||
render(props: ViewportRectangleRendererProps) {
|
||||
|
||||
@@ -104,6 +104,168 @@ exports[`importFromBGFlameGraph with CRLF: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph with CRLF: profileGroup.name 1`] = `"simple-crlf.txt"`;
|
||||
|
||||
exports[`importFromBGFlameGraph with UTF-16, Big Endian 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-utf16-be.txt",
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
"a;b;c 3",
|
||||
"a;b 5",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromBGFlameGraph with UTF-16, Big Endian: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph with UTF-16, Big Endian: profileGroup.name 1`] = `"simple-utf16-be.txt"`;
|
||||
|
||||
exports[`importFromBGFlameGraph with UTF-16, Little Endian 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-utf16-le.txt",
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
"a;b;c 3",
|
||||
"a;b 5",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromBGFlameGraph with UTF-16, Little Endian: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph with UTF-16, Little Endian: profileGroup.name 1`] = `"simple-utf16-le.txt"`;
|
||||
|
||||
exports[`importFromBGFlameGraph with invalid lines 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-with-invalids.txt",
|
||||
"stacks": Array [
|
||||
"a;b;c 2",
|
||||
"a;b;d 4",
|
||||
"a;b;c 3",
|
||||
"a;b 5",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromBGFlameGraph with invalid lines: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph with invalid lines: profileGroup.name 1`] = `"simple-with-invalids.txt"`;
|
||||
|
||||
exports[`importFromBGFlameGraph: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromBGFlameGraph: profileGroup.name 1`] = `"simple.txt"`;
|
||||
|
||||
@@ -0,0 +1,277 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importFromCallgrind 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:main",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 820,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:func1",
|
||||
"line": undefined,
|
||||
"name": "func1",
|
||||
"selfWeight": 100,
|
||||
"totalWeight": 400,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file2.c",
|
||||
"key": "file2.c:func2",
|
||||
"line": undefined,
|
||||
"name": "func2",
|
||||
"selfWeight": 700,
|
||||
"totalWeight": 700,
|
||||
},
|
||||
],
|
||||
"name": "callgrind.example.log -- Instructions",
|
||||
"stacks": Array [
|
||||
"main;func1;func2 300",
|
||||
"main;func1 100",
|
||||
"main;func2 400",
|
||||
"main 20",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromCallgrind cfn reset 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "alpha.c",
|
||||
"key": "alpha.c:alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 10,
|
||||
"totalWeight": 50,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "beta.c",
|
||||
"key": "beta.c:beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 10,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "alpha.c",
|
||||
"key": "alpha.c:gamma",
|
||||
"line": undefined,
|
||||
"name": "gamma",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 20,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "alpha.c",
|
||||
"key": "alpha.c:delta",
|
||||
"line": undefined,
|
||||
"name": "delta",
|
||||
"selfWeight": 10,
|
||||
"totalWeight": 20,
|
||||
},
|
||||
],
|
||||
"name": "callgrind.cfn-reset.log -- Instructions",
|
||||
"stacks": Array [
|
||||
"alpha;beta 10",
|
||||
"alpha;gamma 10",
|
||||
"alpha;delta;gamma 10",
|
||||
"alpha;delta 10",
|
||||
"alpha 10",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromCallgrind cfn reset: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromCallgrind cfn reset: profileGroup.name 1`] = `"callgrind.cfn-reset.log"`;
|
||||
|
||||
exports[`importFromCallgrind multiple event types 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:main",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 200,
|
||||
"totalWeight": 8200,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:func1",
|
||||
"line": undefined,
|
||||
"name": "func1",
|
||||
"selfWeight": 1000,
|
||||
"totalWeight": 4000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file2.c",
|
||||
"key": "file2.c:func2",
|
||||
"line": undefined,
|
||||
"name": "func2",
|
||||
"selfWeight": 7000,
|
||||
"totalWeight": 7000,
|
||||
},
|
||||
],
|
||||
"name": "callgrind.multiple-event-types.log -- Time",
|
||||
"stacks": Array [
|
||||
"main;func1;func2 3.00µs",
|
||||
"main;func1 1.00µs",
|
||||
"main;func2 4.00µs",
|
||||
"main 200.00ns",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromCallgrind multiple event types 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:main",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 15000,
|
||||
"totalWeight": 38000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:func1",
|
||||
"line": undefined,
|
||||
"name": "func1",
|
||||
"selfWeight": 15000,
|
||||
"totalWeight": 20000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file2.c",
|
||||
"key": "file2.c:func2",
|
||||
"line": undefined,
|
||||
"name": "func2",
|
||||
"selfWeight": 8000,
|
||||
"totalWeight": 8000,
|
||||
},
|
||||
],
|
||||
"name": "callgrind.multiple-event-types.log -- Memory",
|
||||
"stacks": Array [
|
||||
"main;func1;func2 4.88 KB",
|
||||
"main;func1 14.65 KB",
|
||||
"main;func2 2.93 KB",
|
||||
"main 14.65 KB",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromCallgrind multiple event types: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromCallgrind multiple event types: profileGroup.name 1`] = `"callgrind.multiple-event-types.log"`;
|
||||
|
||||
exports[`importFromCallgrind name compression 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:main",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 820,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:func1",
|
||||
"line": undefined,
|
||||
"name": "func1",
|
||||
"selfWeight": 100,
|
||||
"totalWeight": 400,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file2.c",
|
||||
"key": "file2.c:func2",
|
||||
"line": undefined,
|
||||
"name": "func2",
|
||||
"selfWeight": 700,
|
||||
"totalWeight": 700,
|
||||
},
|
||||
],
|
||||
"name": "callgrind.name-compression.log -- Instructions",
|
||||
"stacks": Array [
|
||||
"main;func1;func2 300",
|
||||
"main;func1 100",
|
||||
"main;func2 400",
|
||||
"main 20",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromCallgrind name compression: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromCallgrind name compression: profileGroup.name 1`] = `"callgrind.name-compression.log"`;
|
||||
|
||||
exports[`importFromCallgrind subposition compression 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:main",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 820,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file1.c",
|
||||
"key": "file1.c:func1",
|
||||
"line": undefined,
|
||||
"name": "func1",
|
||||
"selfWeight": 100,
|
||||
"totalWeight": 400,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "file2.c",
|
||||
"key": "file2.c:func2",
|
||||
"line": undefined,
|
||||
"name": "func2",
|
||||
"selfWeight": 700,
|
||||
"totalWeight": 700,
|
||||
},
|
||||
],
|
||||
"name": "callgrind.subposition-compression.log -- Instructions",
|
||||
"stacks": Array [
|
||||
"main;func1;func2 300",
|
||||
"main;func1 100",
|
||||
"main;func2 400",
|
||||
"main 20",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromCallgrind subposition compression: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromCallgrind subposition compression: profileGroup.name 1`] = `"callgrind.subposition-compression.log"`;
|
||||
|
||||
exports[`importFromCallgrind: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromCallgrind: profileGroup.name 1`] = `"callgrind.example.log"`;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -64,17 +64,17 @@ exports[`importFromFirefox ignore self-hosted 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:1",
|
||||
"col": 15,
|
||||
"file": "http://localhost:8000/simple.js",
|
||||
"key": "alpha (http://localhost:8000/simple.js:1:14)",
|
||||
"line": 14,
|
||||
"line": 1,
|
||||
"name": "alpha",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 26.983816999942064,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:14",
|
||||
"col": 15,
|
||||
"file": "http://localhost:8000/simple.js",
|
||||
"key": "delta (http://localhost:8000/simple.js:14:14)",
|
||||
"line": 14,
|
||||
"name": "delta",
|
||||
@@ -82,19 +82,19 @@ Object {
|
||||
"totalWeight": 11.946324001066387,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:20",
|
||||
"col": 15,
|
||||
"file": "http://localhost:8000/simple.js",
|
||||
"key": "gamma (http://localhost:8000/simple.js:20:14)",
|
||||
"line": 14,
|
||||
"line": 20,
|
||||
"name": "gamma",
|
||||
"selfWeight": 26.983816999942064,
|
||||
"totalWeight": 26.983816999942064,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "http://localhost:8000/simple.js:8",
|
||||
"col": 14,
|
||||
"file": "http://localhost:8000/simple.js",
|
||||
"key": "beta (http://localhost:8000/simple.js:8:13)",
|
||||
"line": 13,
|
||||
"line": 8,
|
||||
"name": "beta",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 15.037492998875678,
|
||||
|
||||
@@ -99,10 +99,332 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy allocations profile 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":example_app (40414)",
|
||||
"line": undefined,
|
||||
"name": "example_app (40414)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":start",
|
||||
"line": undefined,
|
||||
"name": "start",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":main",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":std::rt::lang_start::hdba6f1ebfd1bdcf8",
|
||||
"line": undefined,
|
||||
"name": "std::rt::lang_start::hdba6f1ebfd1bdcf8",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":std::rt::lang_start_internal::hc453db0ee48af82e",
|
||||
"line": undefined,
|
||||
"name": "std::rt::lang_start_internal::hc453db0ee48af82e",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c",
|
||||
"line": undefined,
|
||||
"name": "std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc",
|
||||
"line": undefined,
|
||||
"name": "std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8",
|
||||
"line": undefined,
|
||||
"name": "core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":example_app::main::hddab13ae8d8b6a6e",
|
||||
"line": undefined,
|
||||
"name": "example_app::main::hddab13ae8d8b6a6e",
|
||||
"selfWeight": 1385999000,
|
||||
"totalWeight": 96000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":example_app::example_a::h622d6879b734496d",
|
||||
"line": undefined,
|
||||
"name": "example_app::example_a::h622d6879b734496d",
|
||||
"selfWeight": 282000000,
|
||||
"totalWeight": 47000000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":std::time::Instant::elapsed::h2e3793148fc23529",
|
||||
"line": undefined,
|
||||
"name": "std::time::Instant::elapsed::h2e3793148fc23529",
|
||||
"selfWeight": 2000000000,
|
||||
"totalWeight": 93081000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":mach_absolute_time",
|
||||
"line": undefined,
|
||||
"name": "mach_absolute_time",
|
||||
"selfWeight": 91080000000,
|
||||
"totalWeight": 91080000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":DYLD-STUB$$mach_absolute_time",
|
||||
"line": undefined,
|
||||
"name": "DYLD-STUB$$mach_absolute_time",
|
||||
"selfWeight": 1000000,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":core::time::Duration::as_millis::hae6ad1b9cf7bb5ec",
|
||||
"line": undefined,
|
||||
"name": "core::time::Duration::as_millis::hae6ad1b9cf7bb5ec",
|
||||
"selfWeight": 1249000000,
|
||||
"totalWeight": 1249000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":example_app::example_b::h71b31fcd89b9ffd2",
|
||||
"line": undefined,
|
||||
"name": "example_app::example_b::h71b31fcd89b9ffd2",
|
||||
"selfWeight": 1000000,
|
||||
"totalWeight": 84000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":example_app::example_c::h631759c10d7dee93",
|
||||
"line": undefined,
|
||||
"name": "example_app::example_c::h631759c10d7dee93",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":alloc::vec::Vec$LT$T$C$A$GT$::push::ha3426502ffc42c8b",
|
||||
"line": undefined,
|
||||
"name": "alloc::vec::Vec$LT$T$C$A$GT$::push::ha3426502ffc42c8b",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":alloc::raw_vec::RawVec$LT$T$C$A$GT$::reserve_for_push::he4a29b8274e35dbb",
|
||||
"line": undefined,
|
||||
"name": "alloc::raw_vec::RawVec$LT$T$C$A$GT$::reserve_for_push::he4a29b8274e35dbb",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":alloc::raw_vec::RawVec$LT$T$C$A$GT$::grow_amortized::h78db9ba423623c58",
|
||||
"line": undefined,
|
||||
"name": "alloc::raw_vec::RawVec$LT$T$C$A$GT$::grow_amortized::h78db9ba423623c58",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":alloc::raw_vec::finish_grow::h876f5af1c66d74c8",
|
||||
"line": undefined,
|
||||
"name": "alloc::raw_vec::finish_grow::h876f5af1c66d74c8",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$::allocate::hcc733a40a34fbc94",
|
||||
"line": undefined,
|
||||
"name": "_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$::allocate::hcc733a40a34fbc94",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":alloc::alloc::Global::alloc_impl::hc55feba7d6266dfa",
|
||||
"line": undefined,
|
||||
"name": "alloc::alloc::Global::alloc_impl::hc55feba7d6266dfa",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":alloc::alloc::alloc::hfac63f3d6850b759",
|
||||
"line": undefined,
|
||||
"name": "alloc::alloc::alloc::hfac63f3d6850b759",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_malloc_zone_malloc",
|
||||
"line": undefined,
|
||||
"name": "_malloc_zone_malloc",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":nanov2_malloc",
|
||||
"line": undefined,
|
||||
"name": "nanov2_malloc",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":nanov2_allocate",
|
||||
"line": undefined,
|
||||
"name": "nanov2_allocate",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":nanov2_find_block_and_allocate",
|
||||
"line": undefined,
|
||||
"name": "nanov2_find_block_and_allocate",
|
||||
"selfWeight": 1000000,
|
||||
"totalWeight": 1000000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":std::io::stdio::_print::hdecfefdeb43586ed",
|
||||
"line": undefined,
|
||||
"name": "std::io::stdio::_print::hdecfefdeb43586ed",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$::write_fmt::h2cb06dcd2b172844",
|
||||
"line": undefined,
|
||||
"name": "_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$::write_fmt::h2cb06dcd2b172844",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":core::fmt::write::hed96bcfc6342aee5",
|
||||
"line": undefined,
|
||||
"name": "core::fmt::write::hed96bcfc6342aee5",
|
||||
"selfWeight": 468,
|
||||
"totalWeight": 1000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_$LT$std..io..Write..write_fmt..Adapter$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$::write_str::hbe33ec23de24ce2f",
|
||||
"line": undefined,
|
||||
"name": "_$LT$std..io..Write..write_fmt..Adapter$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$::write_str::hbe33ec23de24ce2f",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 532,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$::write_all::h22667d0a03b2151b",
|
||||
"line": undefined,
|
||||
"name": "_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$::write_all::h22667d0a03b2151b",
|
||||
"selfWeight": 532,
|
||||
"totalWeight": 532,
|
||||
},
|
||||
],
|
||||
"name": "cycles-example-deep-copy.txt",
|
||||
"stacks": Array [
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;std::time::Instant::elapsed::h2e3793148fc23529;mach_absolute_time 750000:00",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;std::time::Instant::elapsed::h2e3793148fc23529;std::time::Instant::elapsed::h2e3793148fc23529 10000:00",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;std::time::Instant::elapsed::h2e3793148fc23529;DYLD-STUB$$mach_absolute_time 16:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;std::time::Instant::elapsed::h2e3793148fc23529 6650:00",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;core::time::Duration::as_millis::hae6ad1b9cf7bb5ec 10566:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;example_app::example_a::h622d6879b734496d 3016:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;example_app::example_b::h71b31fcd89b9ffd2;std::time::Instant::elapsed::h2e3793148fc23529;mach_absolute_time 1333:20",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;example_app::example_b::h71b31fcd89b9ffd2;std::time::Instant::elapsed::h2e3793148fc23529;std::time::Instant::elapsed::h2e3793148fc23529 16:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;example_app::example_b::h71b31fcd89b9ffd2;example_app::example_c::h631759c10d7dee93;alloc::vec::Vec$LT$T$C$A$GT$::push::ha3426502ffc42c8b;alloc::raw_vec::RawVec$LT$T$C$A$GT$::reserve_for_push::he4a29b8274e35dbb;alloc::raw_vec::RawVec$LT$T$C$A$GT$::grow_amortized::h78db9ba423623c58;alloc::raw_vec::finish_grow::h876f5af1c66d74c8;_$LT$alloc..alloc..Global$u20$as$u20$core..alloc..Allocator$GT$::allocate::hcc733a40a34fbc94;alloc::alloc::Global::alloc_impl::hc55feba7d6266dfa;alloc::alloc::alloc::hfac63f3d6850b759;_malloc_zone_malloc;nanov2_malloc;nanov2_allocate;nanov2_allocate;nanov2_find_block_and_allocate 16:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;example_app::example_b::h71b31fcd89b9ffd2;example_app::example_b::h71b31fcd89b9ffd2 16:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d;example_app::example_b::h71b31fcd89b9ffd2;core::time::Duration::as_millis::hae6ad1b9cf7bb5ec 16:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::example_a::h622d6879b734496d 1683:20",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;std::time::Instant::elapsed::h2e3793148fc23529;mach_absolute_time 766666:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;std::time::Instant::elapsed::h2e3793148fc23529;std::time::Instant::elapsed::h2e3793148fc23529 10816:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;std::time::Instant::elapsed::h2e3793148fc23529 5850:00",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;core::time::Duration::as_millis::hae6ad1b9cf7bb5ec 10233:20",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;example_app::main::hddab13ae8d8b6a6e 3166:40",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;std::io::stdio::_print::hdecfefdeb43586ed;_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$::write_fmt::h2cb06dcd2b172844;core::fmt::write::hed96bcfc6342aee5;_$LT$std..io..Write..write_fmt..Adapter$LT$T$GT$$u20$as$u20$core..fmt..Write$GT$::write_str::hbe33ec23de24ce2f;_$LT$std..io..stdio..StdoutLock$u20$as$u20$std..io..Write$GT$::write_all::h22667d0a03b2151b 532.00ms",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e;std::io::stdio::_print::hdecfefdeb43586ed;_$LT$$RF$std..io..stdio..Stdout$u20$as$u20$std..io..Write$GT$::write_fmt::h2cb06dcd2b172844;core::fmt::write::hed96bcfc6342aee5 468.00ms",
|
||||
"example_app (40414);start;main;std::rt::lang_start::hdba6f1ebfd1bdcf8;std::rt::lang_start_internal::hc453db0ee48af82e;std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::hd856f2663871206c;std::sys_common::backtrace::__rust_begin_short_backtrace::h4869fd82068bc1dc;core::ops::function::FnOnce::call_once::h06e0c27ee740c6a8;example_app::main::hddab13ae8d8b6a6e 19933:19",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy allocations profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy allocations profile: indexToView 2`] = `0`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy allocations profile: profileGroup.name 1`] = `"random-allocations-deep-copy.txt"`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy allocations profile: profileGroup.name 2`] = `"cycles-example-deep-copy.txt"`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
|
||||
@@ -1376,6 +1376,268 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromLinuxPerf system-wide.linux-perf.txt chunked 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "[unknown]",
|
||||
"key": "[unknown] ([unknown])",
|
||||
"line": undefined,
|
||||
"name": "??? ([unknown])",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0.13823499999125488,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/lib/x86_64-linux-gnu/libc-2.27.so",
|
||||
"key": "__libc_start_main (/lib/x86_64-linux-gnu/libc-2.27.so)",
|
||||
"line": undefined,
|
||||
"name": "__libc_start_main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0.13823499999125488,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/workdir/simple-terminates",
|
||||
"key": "main (/workdir/simple-terminates)",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0.13823499999125488,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/workdir/simple-terminates",
|
||||
"key": "_Z5alphav (/workdir/simple-terminates)",
|
||||
"line": undefined,
|
||||
"name": "_Z5alphav",
|
||||
"selfWeight": 0.04059999997843988,
|
||||
"totalWeight": 0.04059999997843988,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/workdir/simple-terminates",
|
||||
"key": "_Z5deltav (/workdir/simple-terminates)",
|
||||
"line": undefined,
|
||||
"name": "_Z5deltav",
|
||||
"selfWeight": 0.023244000098202378,
|
||||
"totalWeight": 0.07264250004664063,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/workdir/simple-terminates",
|
||||
"key": "_Z4betav (/workdir/simple-terminates)",
|
||||
"line": undefined,
|
||||
"name": "_Z4betav",
|
||||
"selfWeight": 0.05354449988226406,
|
||||
"totalWeight": 0.05447799988905899,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/workdir/simple-terminates",
|
||||
"key": "_Z5gammav (/workdir/simple-terminates)",
|
||||
"line": undefined,
|
||||
"name": "_Z5gammav",
|
||||
"selfWeight": 0.01991300002555363,
|
||||
"totalWeight": 0.01991300002555363,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "[kernel.kallsyms]",
|
||||
"key": "[unknown] ([kernel.kallsyms])",
|
||||
"line": undefined,
|
||||
"name": "??? ([kernel.kallsyms])",
|
||||
"selfWeight": 0.0009335000067949295,
|
||||
"totalWeight": 0.0009335000067949295,
|
||||
},
|
||||
],
|
||||
"name": "simple-terminat tid: 9",
|
||||
"stacks": Array [
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 501.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 996.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.03ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 989.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.07ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.04ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav;??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 933.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.46ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.47ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 997.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.04ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.06ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 965.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 2.12ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 925.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.02ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.07ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 987.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 997.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1000.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 997.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 997.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 999.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 921.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.08ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 989.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 974.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 963.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.04ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.04ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 991.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 922.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.02ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.07ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 983.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 999.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 998.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 998.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 974.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.03ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 998.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1000.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 997.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 999.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 997.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 932.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 2.09ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 986.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 998.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 954.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 991.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.05ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 989.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 998.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1000.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 981.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 921.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 2.09ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.01ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z4betav 999.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5gammav 995.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z5alphav 997.50µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav 1.00ms",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5alphav 980.00µs",
|
||||
"??? ([unknown]);__libc_start_main;main;_Z5deltav;_Z4betav 476.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromLinuxPerf system-wide.linux-perf.txt chunked 2`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "[kernel.kallsyms]",
|
||||
"key": "[unknown] ([kernel.kallsyms])",
|
||||
"line": undefined,
|
||||
"name": "??? ([kernel.kallsyms])",
|
||||
"selfWeight": 0.1372890000056941,
|
||||
"totalWeight": 0.1372890000056941,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "[unknown]",
|
||||
"key": "[unknown] ([unknown])",
|
||||
"line": undefined,
|
||||
"name": "??? ([unknown])",
|
||||
"selfWeight": 0.0009340000106021762,
|
||||
"totalWeight": 0.0014475000207312405,
|
||||
},
|
||||
],
|
||||
"name": "swapper",
|
||||
"stacks": Array [
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 17.00µs",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 9.55ms",
|
||||
"??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]) 487.50µs",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 486.00µs",
|
||||
"??? ([unknown]);??? ([unknown]) 446.50µs",
|
||||
"??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 34.50µs",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 38.00µs",
|
||||
"??? ([kernel.kallsyms]);??? ([unknown]);??? ([unknown]);??? ([unknown]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 479.00µs",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 6.52ms",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 517.00µs",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 111.12ms",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 399.50µs",
|
||||
"??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]);??? ([kernel.kallsyms]) 8.13ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromLinuxPerf system-wide.linux-perf.txt chunked: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromLinuxPerf system-wide.linux-perf.txt chunked: profileGroup.name 1`] = `"system-wide.linux-perf.txt"`;
|
||||
|
||||
exports[`importFromLinuxPerf system-wide.linux-perf.txt: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromLinuxPerf system-wide.linux-perf.txt: profileGroup.name 1`] = `"system-wide.linux-perf.txt"`;
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importFromPapyrus script profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "STACK 3053",
|
||||
"line": undefined,
|
||||
"name": "STACK 3053",
|
||||
"selfWeight": 200,
|
||||
"totalWeight": 1250,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "abc_example_quest..exampleFunction1",
|
||||
"line": undefined,
|
||||
"name": "abc_example_quest..exampleFunction1",
|
||||
"selfWeight": 1050,
|
||||
"totalWeight": 1050,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "abc_example_quest..exampleFunction2",
|
||||
"line": undefined,
|
||||
"name": "abc_example_quest..exampleFunction2",
|
||||
"selfWeight": 50,
|
||||
"totalWeight": 50,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "STACK 3208",
|
||||
"line": undefined,
|
||||
"name": "STACK 3208",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "abc_example_quest..exampleFunction3",
|
||||
"line": undefined,
|
||||
"name": "abc_example_quest..exampleFunction3",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "abc_example_quest..exampleFunction4",
|
||||
"line": undefined,
|
||||
"name": "abc_example_quest..exampleFunction4",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "STACK 3947",
|
||||
"line": undefined,
|
||||
"name": "STACK 3947",
|
||||
"selfWeight": 450,
|
||||
"totalWeight": 1500,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "abc_example_quest..exampleFunction5",
|
||||
"line": undefined,
|
||||
"name": "abc_example_quest..exampleFunction5",
|
||||
"selfWeight": 750,
|
||||
"totalWeight": 1000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "STACK 3949",
|
||||
"line": undefined,
|
||||
"name": "STACK 3949",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 250,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "abc_example_quest..exampleFunction6",
|
||||
"line": undefined,
|
||||
"name": "abc_example_quest..exampleFunction6",
|
||||
"selfWeight": 250,
|
||||
"totalWeight": 250,
|
||||
},
|
||||
],
|
||||
"name": "script.log",
|
||||
"stacks": Array [
|
||||
"STACK 3053;abc_example_quest..exampleFunction1 1.00s",
|
||||
"STACK 3053 200.00ms",
|
||||
"STACK 3053;abc_example_quest..exampleFunction2 50.00ms",
|
||||
" 250.00ms",
|
||||
"STACK 3947;abc_example_quest..exampleFunction5 250.00ms",
|
||||
"STACK 3947;abc_example_quest..exampleFunction5;STACK 3949;abc_example_quest..exampleFunction6 250.00ms",
|
||||
"STACK 3947;abc_example_quest..exampleFunction5 500.00ms",
|
||||
"STACK 3947 450.00ms",
|
||||
"STACK 3947;abc_example_quest..exampleFunction1 50.00ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromPapyrus script profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromPapyrus script profile: profileGroup.name 1`] = `"script.log"`;
|
||||
|
||||
exports[`importFromPapyrus stack profile 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "STACK 3185",
|
||||
"line": undefined,
|
||||
"name": "STACK 3185",
|
||||
"selfWeight": 66,
|
||||
"totalWeight": 617,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "Debug..StartStackProfiling",
|
||||
"line": undefined,
|
||||
"name": "Debug..StartStackProfiling",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "Form..GetFormID",
|
||||
"line": undefined,
|
||||
"name": "Form..GetFormID",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "abc_example_mod_quest..exampleFunction1",
|
||||
"line": undefined,
|
||||
"name": "abc_example_mod_quest..exampleFunction1",
|
||||
"selfWeight": 17,
|
||||
"totalWeight": 17,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "Game..GetModName",
|
||||
"line": undefined,
|
||||
"name": "Game..GetModName",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "Cell..IsInterior",
|
||||
"line": undefined,
|
||||
"name": "Cell..IsInterior",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "utility..WaitMenuMode",
|
||||
"line": undefined,
|
||||
"name": "utility..WaitMenuMode",
|
||||
"selfWeight": 534,
|
||||
"totalWeight": 534,
|
||||
},
|
||||
],
|
||||
"name": "stack.log",
|
||||
"stacks": Array [
|
||||
"STACK 3185 16.00ms",
|
||||
"STACK 3185;abc_example_mod_quest..exampleFunction1 17.00ms",
|
||||
"STACK 3185 33.00ms",
|
||||
"STACK 3185;utility..WaitMenuMode 534.00ms",
|
||||
"STACK 3185 17.00ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromPapyrus stack profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromPapyrus stack profile: profileGroup.name 1`] = `"stack.log"`;
|
||||
@@ -7,239 +7,239 @@ Object {
|
||||
"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,
|
||||
"line": 198,
|
||||
"name": "runtime.main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 136,
|
||||
"totalWeight": 1360000000,
|
||||
},
|
||||
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,
|
||||
"line": 49,
|
||||
"name": "main.main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 136,
|
||||
"totalWeight": 1360000000,
|
||||
},
|
||||
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,
|
||||
"line": 28,
|
||||
"name": "main.delta",
|
||||
"selfWeight": 22,
|
||||
"totalWeight": 58,
|
||||
"selfWeight": 220000000,
|
||||
"totalWeight": 580000000,
|
||||
},
|
||||
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,
|
||||
"line": 18,
|
||||
"name": "main.beta",
|
||||
"selfWeight": 39,
|
||||
"totalWeight": 39,
|
||||
"selfWeight": 390000000,
|
||||
"totalWeight": 390000000,
|
||||
},
|
||||
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,
|
||||
"line": 11,
|
||||
"name": "main.alpha",
|
||||
"selfWeight": 48,
|
||||
"totalWeight": 48,
|
||||
"selfWeight": 480000000,
|
||||
"totalWeight": 480000000,
|
||||
},
|
||||
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,
|
||||
"line": 34,
|
||||
"name": "main.gamma",
|
||||
"selfWeight": 27,
|
||||
"totalWeight": 27,
|
||||
"selfWeight": 270000000,
|
||||
"totalWeight": 270000000,
|
||||
},
|
||||
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,
|
||||
"line": 480,
|
||||
"name": "runtime.morestack",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 11,
|
||||
"totalWeight": 110000000,
|
||||
},
|
||||
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,
|
||||
"line": 957,
|
||||
"name": "runtime.newstack",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 11,
|
||||
"totalWeight": 110000000,
|
||||
},
|
||||
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,
|
||||
"line": 412,
|
||||
"name": "runtime.duffcopy",
|
||||
"selfWeight": 11,
|
||||
"totalWeight": 11,
|
||||
"selfWeight": 110000000,
|
||||
"totalWeight": 110000000,
|
||||
},
|
||||
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,
|
||||
"line": 247,
|
||||
"name": "runtime.timerproc",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 125,
|
||||
"name": "runtime.goroutineReady",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 301,
|
||||
"name": "runtime.goready",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 409,
|
||||
"name": "runtime.systemstack",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 302,
|
||||
"name": "runtime.goready.func1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 608,
|
||||
"name": "runtime.ready",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 2083,
|
||||
"name": "runtime.wakep",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 2017,
|
||||
"name": "runtime.startm",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 147,
|
||||
"name": "runtime.notewakeup",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 36,
|
||||
"name": "runtime.semawakeup",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 465,
|
||||
"name": "runtime.mach_semrelease",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 558,
|
||||
"name": "runtime.mach_semaphore_signal",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
"selfWeight": 10000000,
|
||||
"totalWeight": 10000000,
|
||||
},
|
||||
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,
|
||||
"line": 1193,
|
||||
"name": "runtime.mstart",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
"totalWeight": 20000000,
|
||||
},
|
||||
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,
|
||||
"line": 1227,
|
||||
"name": "runtime.mstart1",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
"totalWeight": 20000000,
|
||||
},
|
||||
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,
|
||||
"line": 4221,
|
||||
"name": "runtime.sysmon",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
"totalWeight": 20000000,
|
||||
},
|
||||
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,
|
||||
"line": 418,
|
||||
"name": "runtime.usleep",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 2,
|
||||
"selfWeight": 20000000,
|
||||
"totalWeight": 20000000,
|
||||
},
|
||||
],
|
||||
"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",
|
||||
"runtime.main;main.main;main.delta;main.beta 140.00ms",
|
||||
"runtime.main;main.main;main.alpha 260.00ms",
|
||||
"runtime.main;main.main;main.gamma 270.00ms",
|
||||
"runtime.morestack;runtime.newstack;runtime.duffcopy 110.00ms",
|
||||
"runtime.main;main.main;main.beta 250.00ms",
|
||||
"runtime.main;main.main;main.delta 220.00ms",
|
||||
"runtime.main;main.main;main.delta;main.alpha 220.00ms",
|
||||
"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 10.00ms",
|
||||
"runtime.mstart;runtime.mstart1;runtime.sysmon;runtime.usleep 20.00ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importFromSafari 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": 13,
|
||||
"file": "__InjectedScript_InjectedScriptSource.js",
|
||||
"key": "injectModule:__InjectedScript_InjectedScriptSource.js:109:13",
|
||||
"line": 109,
|
||||
"name": "injectModule",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0.001,
|
||||
},
|
||||
Frame {
|
||||
"col": 10,
|
||||
"file": "__InjectedScript_CommandLineAPIModuleSource.js",
|
||||
"key": ":__InjectedScript_CommandLineAPIModuleSource.js:2:10",
|
||||
"line": 2,
|
||||
"name": "(anonymous __InjectedScript_CommandLineAPIModuleSource.js:2)",
|
||||
"selfWeight": 0.001,
|
||||
"totalWeight": 0.001,
|
||||
},
|
||||
Frame {
|
||||
"col": 1,
|
||||
"file": "file:///speedscope/sample/programs/javascript/simple.js",
|
||||
"key": "(program):file:///speedscope/sample/programs/javascript/simple.js:1:1",
|
||||
"line": 1,
|
||||
"name": "(program)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0.03248933597933502,
|
||||
},
|
||||
Frame {
|
||||
"col": 15,
|
||||
"file": "file:///speedscope/sample/programs/javascript/simple.js",
|
||||
"key": "alpha:file:///speedscope/sample/programs/javascript/simple.js:1:15",
|
||||
"line": 1,
|
||||
"name": "alpha",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0.03248933597933502,
|
||||
},
|
||||
Frame {
|
||||
"col": 15,
|
||||
"file": "file:///speedscope/sample/programs/javascript/simple.js",
|
||||
"key": "delta:file:///speedscope/sample/programs/javascript/simple.js:14:15",
|
||||
"line": 14,
|
||||
"name": "delta",
|
||||
"selfWeight": 0.003094222474222382,
|
||||
"totalWeight": 0.020112446082445484,
|
||||
},
|
||||
Frame {
|
||||
"col": 15,
|
||||
"file": "file:///speedscope/sample/programs/javascript/simple.js",
|
||||
"key": "gamma:file:///speedscope/sample/programs/javascript/simple.js:20:15",
|
||||
"line": 20,
|
||||
"name": "gamma",
|
||||
"selfWeight": 0.029395113505112636,
|
||||
"totalWeight": 0.029395113505112636,
|
||||
},
|
||||
Frame {
|
||||
"col": 14,
|
||||
"file": "file:///speedscope/sample/programs/javascript/simple.js",
|
||||
"key": "beta:file:///speedscope/sample/programs/javascript/simple.js:8:14",
|
||||
"line": 8,
|
||||
"name": "beta",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0.012376889896889526,
|
||||
},
|
||||
Frame {
|
||||
"col": 102,
|
||||
"file": "",
|
||||
"key": "firstOpenSearchURLString::4:102",
|
||||
"line": 4,
|
||||
"name": "firstOpenSearchURLString",
|
||||
"selfWeight": 0.0005174240213818848,
|
||||
"totalWeight": 0.0005174240213818848,
|
||||
},
|
||||
],
|
||||
"name": "Grabación de Control temporal 1",
|
||||
"stacks": Array [
|
||||
"injectModule;(anonymous __InjectedScript_CommandLineAPIModuleSource.js:2) 1.00ms",
|
||||
" 39.93ms",
|
||||
"(program);alpha;delta;gamma 10.83ms",
|
||||
" 2.46ms",
|
||||
"(program);alpha;delta 3.09ms",
|
||||
"(program);alpha;beta;gamma 4.64ms",
|
||||
"(program);alpha;delta;gamma 1.55ms",
|
||||
"(program);alpha;beta;gamma 1.55ms",
|
||||
"(program);alpha;delta;gamma 3.09ms",
|
||||
"(program);alpha;beta;gamma 4.64ms",
|
||||
"(program);alpha;delta;gamma 1.55ms",
|
||||
"(program);alpha;beta;gamma 1.55ms",
|
||||
" 253.50ms",
|
||||
"firstOpenSearchURLString 517.42µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromSafari: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromSafari: profileGroup.name 1`] = `"Grabación de Control temporal 1"`;
|
||||
@@ -1,5 +1,453 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importCpuProfileWithProperWeights importFromStackprof cpu mode snapshot 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "sample/programs/ruby/simple.rb",
|
||||
"key": 5352342240,
|
||||
"line": undefined,
|
||||
"name": "<main>",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 410000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/mcorrea/src/github.com/dalehamel/speedscope/sample/programs/ruby/simple.rb",
|
||||
"key": 4530376200,
|
||||
"line": undefined,
|
||||
"name": "<main>",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 410000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/mcorrea/src/github.com/dalehamel/speedscope/sample/programs/ruby/simple.rb",
|
||||
"key": 4530486680,
|
||||
"line": 37,
|
||||
"name": "block in <main>",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 410000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/mcorrea/src/github.com/dalehamel/speedscope/sample/programs/ruby/simple.rb",
|
||||
"key": 5335911080,
|
||||
"line": 4,
|
||||
"name": "Object#a",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 410000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/mcorrea/src/github.com/dalehamel/speedscope/sample/programs/ruby/simple.rb",
|
||||
"key": 5335911040,
|
||||
"line": 12,
|
||||
"name": "Object#b",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 154000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/mcorrea/src/github.com/dalehamel/speedscope/sample/programs/ruby/simple.rb",
|
||||
"key": 5335909920,
|
||||
"line": 24,
|
||||
"name": "Object#d",
|
||||
"selfWeight": 331000,
|
||||
"totalWeight": 331000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/mcorrea/src/github.com/dalehamel/speedscope/sample/programs/ruby/simple.rb",
|
||||
"key": 5335910560,
|
||||
"line": 18,
|
||||
"name": "Object#c",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 177000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/mcorrea/src/github.com/dalehamel/speedscope/sample/programs/ruby/simple.rb",
|
||||
"key": 5335909880,
|
||||
"line": 32,
|
||||
"name": "Object#e",
|
||||
"selfWeight": 79000,
|
||||
"totalWeight": 79000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "",
|
||||
"key": 1,
|
||||
"line": undefined,
|
||||
"name": "(garbage collection)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 79000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "",
|
||||
"key": 5,
|
||||
"line": undefined,
|
||||
"name": "(sweeping)",
|
||||
"selfWeight": 71000,
|
||||
"totalWeight": 71000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "",
|
||||
"key": 3,
|
||||
"line": undefined,
|
||||
"name": "(marking)",
|
||||
"selfWeight": 8000,
|
||||
"totalWeight": 8000,
|
||||
},
|
||||
],
|
||||
"name": "simple-cpu-stackprof.json",
|
||||
"stacks": Array [
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 5.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"(garbage collection);(sweeping) 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 4.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 4.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 4.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 5.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 4.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 4.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 4.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 5.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 4.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 4.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(marking) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 5.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 1.00ms",
|
||||
"(garbage collection);(sweeping) 2.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 4.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#e 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 4.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#b;Object#b;Object#d;Object#d 2.00ms",
|
||||
"(garbage collection);(sweeping) 1.00ms",
|
||||
"<main>;<main>;block in <main>;Object#a;Object#a;Object#c;Object#c;Object#d;Object#d 3.00ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importCpuProfileWithProperWeights importFromStackprof cpu mode snapshot: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importCpuProfileWithProperWeights importFromStackprof cpu mode snapshot: profileGroup.name 1`] = `"simple-cpu-stackprof.json"`;
|
||||
|
||||
exports[`importFromStackprof 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -851,6 +1299,396 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromStackprof object mode 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "../../alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4317728280,
|
||||
"line": undefined,
|
||||
"name": "<main>",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4376547240,
|
||||
"line": undefined,
|
||||
"name": "<main>",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4379035920,
|
||||
"line": null,
|
||||
"name": "StackProf.run",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4317464320,
|
||||
"line": 21,
|
||||
"name": "block in <main>",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4379033920,
|
||||
"line": 4,
|
||||
"name": "Object#a",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 102,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4317869400,
|
||||
"line": null,
|
||||
"name": "Range#each",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 102,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4379033880,
|
||||
"line": 11,
|
||||
"name": "Object#b",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4318054440,
|
||||
"line": null,
|
||||
"name": "Class#new",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4379033840,
|
||||
"line": 15,
|
||||
"name": "Object#c",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 95,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4317868920,
|
||||
"line": null,
|
||||
"name": "Range#to_a",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 37,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4379016640,
|
||||
"line": null,
|
||||
"name": "Enumerable#to_a",
|
||||
"selfWeight": 36,
|
||||
"totalWeight": 36,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<internal:array>",
|
||||
"key": 4317563560,
|
||||
"line": 60,
|
||||
"name": "Array#sample",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 20,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4317922760,
|
||||
"line": null,
|
||||
"name": "Array#sort",
|
||||
"selfWeight": 36,
|
||||
"totalWeight": 36,
|
||||
},
|
||||
],
|
||||
"name": "object-stackprof.json",
|
||||
"stacks": Array [
|
||||
"<main>;<main>;StackProf.run;block in <main> 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b;Class#new 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 3",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b;Class#new 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b;Class#new 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sort 2",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromStackprof object mode: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromStackprof object mode: profileGroup.name 1`] = `"object-stackprof.json"`;
|
||||
|
||||
exports[`importFromStackprof when a profile has a frame with no name 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "../../alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4317728280,
|
||||
"line": undefined,
|
||||
"name": "<main>",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4376547240,
|
||||
"line": undefined,
|
||||
"name": "<main>",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4379035920,
|
||||
"line": null,
|
||||
"name": "StackProf.run",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4317464320,
|
||||
"line": 21,
|
||||
"name": "block in <main>",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 103,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4379033920,
|
||||
"line": 4,
|
||||
"name": "Object#a",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 102,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4317869400,
|
||||
"line": null,
|
||||
"name": "Range#each",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 102,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4379033880,
|
||||
"line": 11,
|
||||
"name": "Object#b",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 5,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4318054440,
|
||||
"line": null,
|
||||
"name": "Class#new",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "/Users/alex/src/github.com/alexcoco/speedscope/sample/programs/ruby/object.rb",
|
||||
"key": 4379033840,
|
||||
"line": 15,
|
||||
"name": "Object#c",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 95,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4317868920,
|
||||
"line": null,
|
||||
"name": "Range#to_a",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 37,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4379016640,
|
||||
"line": null,
|
||||
"name": "Enumerable#to_a",
|
||||
"selfWeight": 36,
|
||||
"totalWeight": 36,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<internal:array>",
|
||||
"key": 4317563560,
|
||||
"line": 60,
|
||||
"name": "Array#sample",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 20,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": "<cfunc>",
|
||||
"key": 4317922760,
|
||||
"line": null,
|
||||
"name": "(unknown)",
|
||||
"selfWeight": 36,
|
||||
"totalWeight": 36,
|
||||
},
|
||||
],
|
||||
"name": "stackprof-last-frame-no-name.json",
|
||||
"stacks": Array [
|
||||
"<main>;<main>;StackProf.run;block in <main> 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b;Class#new 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 3",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b;Class#new 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#b;Class#new 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Range#to_a;Enumerable#to_a 2",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;Array#sample 1",
|
||||
"<main>;<main>;StackProf.run;block in <main>;Object#a;Range#each;Object#a;Object#c;Range#each;Object#c;(unknown) 2",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromStackprof when a profile has a frame with no name: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromStackprof when a profile has a frame with no name: profileGroup.name 1`] = `"stackprof-last-frame-no-name.json"`;
|
||||
|
||||
exports[`importFromStackprof: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromStackprof: profileGroup.name 1`] = `"simple-stackprof.json"`;
|
||||
|
||||
@@ -1,5 +1,142 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`importTraceEvents BEX interaction 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A",
|
||||
"line": undefined,
|
||||
"name": "A",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "B",
|
||||
"line": undefined,
|
||||
"name": "B",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "D",
|
||||
"line": undefined,
|
||||
"name": "D",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "C",
|
||||
"line": undefined,
|
||||
"name": "C",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "F",
|
||||
"line": undefined,
|
||||
"name": "F",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "E",
|
||||
"line": undefined,
|
||||
"name": "E",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "G",
|
||||
"line": undefined,
|
||||
"name": "G",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "H",
|
||||
"line": undefined,
|
||||
"name": "H",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "J",
|
||||
"line": undefined,
|
||||
"name": "J",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "I",
|
||||
"line": undefined,
|
||||
"name": "I",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "K",
|
||||
"line": undefined,
|
||||
"name": "K",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "L",
|
||||
"line": undefined,
|
||||
"name": "L",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A;B 2.00µs",
|
||||
" 8.00µs",
|
||||
"D;C 2.00µs",
|
||||
" 8.00µs",
|
||||
"F;E 1.00µs",
|
||||
"F 1.00µs",
|
||||
" 8.00µs",
|
||||
"G;H 1.00µs",
|
||||
"G 1.00µs",
|
||||
" 8.00µs",
|
||||
"J 1.00µs",
|
||||
"J;I 1.00µs",
|
||||
" 8.00µs",
|
||||
"K 1.00µs",
|
||||
"K;L 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents BEX interaction: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents BEX interaction: profileGroup.name 1`] = `"bex-interaction.json"`;
|
||||
|
||||
exports[`importTraceEvents bad E events 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -35,6 +172,74 @@ exports[`importTraceEvents bad E events: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents bad E events: profileGroup.name 1`] = `"too-many-end-events.json"`;
|
||||
|
||||
exports[`importTraceEvents end event with empty stack 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents end event with empty stack: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents end event with empty stack: profileGroup.name 1`] = `"end-event-with-empty-stack.json"`;
|
||||
|
||||
exports[`importTraceEvents end-non-top-of-stack 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A {\\"x\\":1}",
|
||||
"line": undefined,
|
||||
"name": "A {\\"x\\":1}",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 11,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "B {\\"x\\":2}",
|
||||
"line": undefined,
|
||||
"name": "B {\\"x\\":2}",
|
||||
"selfWeight": 9,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "Z {\\"x\\":1}",
|
||||
"line": undefined,
|
||||
"name": "Z {\\"x\\":1}",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A {\\"x\\":1} 1.00µs",
|
||||
"A {\\"x\\":1};B {\\"x\\":2} 9.00µs",
|
||||
"A {\\"x\\":1};B {\\"x\\":2};Z {\\"x\\":1} 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents end-non-top-of-stack: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents end-non-top-of-stack: profileGroup.name 1`] = `"end-non-top-of-stack.json"`;
|
||||
|
||||
exports[`importTraceEvents event re-ordering 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -93,6 +298,176 @@ exports[`importTraceEvents event re-ordering: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents event re-ordering: profileGroup.name 1`] = `"must-retain-original-order.json"`;
|
||||
|
||||
exports[`importTraceEvents event reordering name match 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha {\\"x\\":0}",
|
||||
"line": undefined,
|
||||
"name": "alpha {\\"x\\":0}",
|
||||
"selfWeight": 9,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta {\\"x\\":0}",
|
||||
"line": undefined,
|
||||
"name": "beta {\\"x\\":0}",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma {\\"x\\":0}",
|
||||
"line": undefined,
|
||||
"name": "gamma {\\"x\\":0}",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 1",
|
||||
"stacks": Array [
|
||||
"alpha {\\"x\\":0} 1.00µs",
|
||||
"alpha {\\"x\\":0};beta {\\"x\\":0};gamma {\\"x\\":0} 1.00µs",
|
||||
"alpha {\\"x\\":0} 8.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents event reordering name match: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents event reordering name match: profileGroup.name 1`] = `"event-reordering-name-match.json"`;
|
||||
|
||||
exports[`importTraceEvents invalid x nesting 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 5,
|
||||
"totalWeight": 15,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 10,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 5.00µs",
|
||||
"alpha;beta 10.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents invalid x nesting: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents invalid x nesting: profileGroup.name 1`] = `"invalid-x-nesting.json"`;
|
||||
|
||||
exports[`importTraceEvents matching x 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 8,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma",
|
||||
"line": undefined,
|
||||
"name": "gamma",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta;gamma 1.00µs",
|
||||
"alpha 3.00µs",
|
||||
"alpha;gamma;beta 1.00µs",
|
||||
"alpha 4.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents matching x: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents matching x: profileGroup.name 1`] = `"matching-x.json"`;
|
||||
|
||||
exports[`importTraceEvents mismatched args 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A {\\"x\\":1}",
|
||||
"line": undefined,
|
||||
"name": "A {\\"x\\":1}",
|
||||
"selfWeight": 10,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A {\\"x\\":1} 10.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents mismatched args: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents mismatched args: profileGroup.name 1`] = `"mismatched-args.json"`;
|
||||
|
||||
exports[`importTraceEvents mismatched name 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents mismatched name: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents mismatched name: profileGroup.name 1`] = `"mismatched-name.json"`;
|
||||
|
||||
exports[`importTraceEvents multiprocess 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -257,6 +632,164 @@ exports[`importTraceEvents multiprocess: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents multiprocess: profileGroup.name 1`] = `"multiprocess.json"`;
|
||||
|
||||
exports[`importTraceEvents not enough end events 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A {\\"x\\":1}",
|
||||
"line": undefined,
|
||||
"name": "A {\\"x\\":1}",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 11,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A {\\"x\\":2}",
|
||||
"line": undefined,
|
||||
"name": "A {\\"x\\":2}",
|
||||
"selfWeight": 9,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A {\\"x\\":1} 1.00µs",
|
||||
"A {\\"x\\":1};A {\\"x\\":2} 9.00µs",
|
||||
"A {\\"x\\":1};A {\\"x\\":2};A {\\"x\\":1} 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents not enough end events: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents not enough end events: profileGroup.name 1`] = `"not-enough-end-events.json"`;
|
||||
|
||||
exports[`importTraceEvents not out-of-order 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A",
|
||||
"line": undefined,
|
||||
"name": "A",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "B",
|
||||
"line": undefined,
|
||||
"name": "B",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 8,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "C",
|
||||
"line": undefined,
|
||||
"name": "C",
|
||||
"selfWeight": 6,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A 1.00µs",
|
||||
"A;B 1.00µs",
|
||||
"A;B;C 6.00µs",
|
||||
"A;B 1.00µs",
|
||||
"A 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents not out-of-order unbalanced name 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 9,
|
||||
"totalWeight": 9,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 9.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents not out-of-order unbalanced name: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents not out-of-order unbalanced name: profileGroup.name 1`] = `"out-of-order-unbalanced-name.json"`;
|
||||
|
||||
exports[`importTraceEvents not out-of-order: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents not out-of-order: profileGroup.name 1`] = `"out-of-order.json"`;
|
||||
|
||||
exports[`importTraceEvents only begin events 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A {\\"x\\":1}",
|
||||
"line": undefined,
|
||||
"name": "A {\\"x\\":1}",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 2,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "B {\\"x\\":2}",
|
||||
"line": undefined,
|
||||
"name": "B {\\"x\\":2}",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "C {\\"x\\":2}",
|
||||
"line": undefined,
|
||||
"name": "C {\\"x\\":2}",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A {\\"x\\":1} 1.00µs",
|
||||
"A {\\"x\\":1};B {\\"x\\":2} 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents only begin events: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents only begin events: profileGroup.name 1`] = `"only-begin-events.json"`;
|
||||
|
||||
exports[`importTraceEvents partial json import 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -309,6 +842,62 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents partial json import chunked 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 chunked: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents partial json import chunked: profileGroup.name 1`] = `"simple-partial.json"`;
|
||||
|
||||
exports[`importTraceEvents partial json import trailing comma 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -361,6 +950,62 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents partial json import trailing comma chunked 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 chunked: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents partial json import trailing comma chunked: profileGroup.name 1`] = `"simple-partial-trailing-comma.json"`;
|
||||
|
||||
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"`;
|
||||
@@ -417,6 +1062,62 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents partial json import whitespace padding chunked 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 chunked: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents partial json import whitespace padding chunked: profileGroup.name 1`] = `"simple-partial-whitespace.json"`;
|
||||
|
||||
exports[`importTraceEvents partial json import whitespace padding: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents partial json import whitespace padding: profileGroup.name 1`] = `"simple-partial-whitespace.json"`;
|
||||
@@ -526,3 +1227,231 @@ exports[`importTraceEvents simple object: profileGroup.name 1`] = `"simple-objec
|
||||
exports[`importTraceEvents simple: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents simple: profileGroup.name 1`] = `"simple.json"`;
|
||||
|
||||
exports[`importTraceEvents unbalanced args 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A {\\"x\\":1}",
|
||||
"line": undefined,
|
||||
"name": "A {\\"x\\":1}",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A {\\"x\\":2}",
|
||||
"line": undefined,
|
||||
"name": "A {\\"x\\":2}",
|
||||
"selfWeight": 8,
|
||||
"totalWeight": 8,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A {\\"x\\":1} 1.00µs",
|
||||
"A {\\"x\\":1};A {\\"x\\":2} 8.00µs",
|
||||
"A {\\"x\\":1} 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents unbalanced args: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents unbalanced args: profileGroup.name 1`] = `"unbalanced-args.json"`;
|
||||
|
||||
exports[`importTraceEvents unbalanced name 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 9,
|
||||
"totalWeight": 9,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 9.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents unbalanced name: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents unbalanced name: profileGroup.name 1`] = `"unbalanced-name.json"`;
|
||||
|
||||
exports[`importTraceEvents x events matching end 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 12,
|
||||
"totalWeight": 20,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma",
|
||||
"line": undefined,
|
||||
"name": "gamma",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha;beta;gamma 1.00µs",
|
||||
"alpha 2.00µs",
|
||||
"alpha;gamma 1.00µs",
|
||||
"alpha;gamma;beta 1.00µs",
|
||||
"alpha 2.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha;beta;gamma 1.00µs",
|
||||
"alpha 3.00µs",
|
||||
"alpha;gamma 1.00µs",
|
||||
"alpha;gamma;beta 1.00µs",
|
||||
"alpha 4.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents x events matching end: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents x events matching end: profileGroup.name 1`] = `"x-events-matching-end.json"`;
|
||||
|
||||
exports[`importTraceEvents x events matching start 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "alpha",
|
||||
"line": undefined,
|
||||
"name": "alpha",
|
||||
"selfWeight": 12,
|
||||
"totalWeight": 20,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "beta",
|
||||
"line": undefined,
|
||||
"name": "beta",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "gamma",
|
||||
"line": undefined,
|
||||
"name": "gamma",
|
||||
"selfWeight": 4,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"alpha 1.00µs",
|
||||
"alpha;beta;gamma 1.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha 2.00µs",
|
||||
"alpha;gamma;beta 1.00µs",
|
||||
"alpha;gamma 1.00µs",
|
||||
"alpha 2.00µs",
|
||||
"alpha;gamma;beta 1.00µs",
|
||||
"alpha;gamma 1.00µs",
|
||||
"alpha 2.00µs",
|
||||
"alpha;beta;gamma 1.00µs",
|
||||
"alpha;beta 1.00µs",
|
||||
"alpha 5.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents x events matching start: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents x events matching start: profileGroup.name 1`] = `"x-events-matching-start.json"`;
|
||||
|
||||
exports[`importTraceEvents zero duration events 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "A",
|
||||
"line": undefined,
|
||||
"name": "A",
|
||||
"selfWeight": 10,
|
||||
"totalWeight": 10,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "B",
|
||||
"line": undefined,
|
||||
"name": "B",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "C",
|
||||
"line": undefined,
|
||||
"name": "C",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": "D",
|
||||
"line": undefined,
|
||||
"name": "D",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 0,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"A 10.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents zero duration events: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents zero duration events: profileGroup.name 1`] = `"zero-duration-events.json"`;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ Object {
|
||||
"file": "bootstrap_node.js",
|
||||
"key": " bootstrap_node.js:10:10",
|
||||
"line": 10,
|
||||
"name": "(anonymous)",
|
||||
"name": "(anonymous bootstrap_node.js:10)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 116424,
|
||||
},
|
||||
@@ -53,7 +53,7 @@ Object {
|
||||
"file": "util.js",
|
||||
"key": " util.js:1:11",
|
||||
"line": 1,
|
||||
"name": "(anonymous)",
|
||||
"name": "(anonymous util.js:1)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 29385,
|
||||
},
|
||||
@@ -62,7 +62,7 @@ Object {
|
||||
"file": "internal/encoding.js",
|
||||
"key": " internal/encoding.js:1:11",
|
||||
"line": 1,
|
||||
"name": "(anonymous)",
|
||||
"name": "(anonymous encoding.js:1)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 29385,
|
||||
},
|
||||
@@ -107,7 +107,7 @@ Object {
|
||||
"file": "module.js",
|
||||
"key": " module.js:1:11",
|
||||
"line": 1,
|
||||
"name": "(anonymous)",
|
||||
"name": "(anonymous module.js:1)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 22888,
|
||||
},
|
||||
@@ -116,7 +116,7 @@ Object {
|
||||
"file": "fs.js",
|
||||
"key": " fs.js:1:11",
|
||||
"line": 1,
|
||||
"name": "(anonymous)",
|
||||
"name": "(anonymous fs.js:1)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 22888,
|
||||
},
|
||||
@@ -197,7 +197,7 @@ Object {
|
||||
"file": "/Users/jlfwong/code/speedscope/sample/programs/javascript/simple.js",
|
||||
"key": " /Users/jlfwong/code/speedscope/sample/programs/javascript/simple.js:1:11",
|
||||
"line": 1,
|
||||
"name": "(anonymous)",
|
||||
"name": "(anonymous simple.js:1)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 64151,
|
||||
},
|
||||
@@ -240,22 +240,22 @@ Object {
|
||||
],
|
||||
"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",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;b;d 37.52ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;c;d 1.28ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;b;d 2.55ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;c;d 1.27ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;b;d 1.28ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;c;d 1.27ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;b;d 1.29ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;c;d 1.26ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;b;d 1.31ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;c;d 2.52ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;c 1.27ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;b 3.62ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;c 1.28ms",
|
||||
"(anonymous);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous);a;b 6.42ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;setupGlobalVariables;NativeModule.require;NativeModule.compile;(anonymous util.js:1);NativeModule.require;NativeModule.compile;(anonymous encoding.js:1);(c++) v8::internal::Runtime_CreateArrayLiteral;(c++) v8::internal::JSFunction::EnsureHasInitialMap 29.38ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;setupGlobalConsole;setupInspectorCommandLineAPI;NativeModule.require;NativeModule.compile;(anonymous module.js:1);NativeModule.require;NativeModule.compile;(anonymous fs.js:1);(c++) v8::internal::Runtime_StoreIC_Miss;(c++) v8::internal::Map::RawCopy 22.89ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;b;d 37.52ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;c;d 1.28ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;b;d 2.55ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;c;d 1.27ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;b;d 1.28ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;c;d 1.27ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;b;d 1.29ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;c;d 1.26ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;b;d 1.31ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;c;d 2.52ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;c 1.27ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;b 3.62ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;c 1.28ms",
|
||||
"(anonymous bootstrap_node.js:10);startup;Module.runMain;Module._load;tryModuleLoad;Module.load;Module._extensions..js;Module._compile;(anonymous simple.js:1);a;b 6.42ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -7,3 +7,15 @@ test('importFromBGFlameGraph', async () => {
|
||||
test('importFromBGFlameGraph with CRLF', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple-crlf.txt')
|
||||
})
|
||||
|
||||
test('importFromBGFlameGraph with UTF-16, Little Endian', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple-utf16-le.txt')
|
||||
})
|
||||
|
||||
test('importFromBGFlameGraph with UTF-16, Big Endian', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple-utf16-be.txt')
|
||||
})
|
||||
|
||||
test('importFromBGFlameGraph with invalid lines', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/stackcollapse/simple-with-invalids.txt')
|
||||
})
|
||||
|
||||
@@ -1,25 +1,31 @@
|
||||
// https://github.com/brendangregg/FlameGraph#2-fold-stacks
|
||||
|
||||
import {Profile, FrameInfo, StackListProfileBuilder} from '../lib/profile'
|
||||
import {TextFileContent} from './utils'
|
||||
|
||||
interface BGSample {
|
||||
stack: FrameInfo[]
|
||||
duration: number
|
||||
}
|
||||
|
||||
function parseBGFoldedStacks(contents: string): BGSample[] {
|
||||
function parseBGFoldedStacks(contents: TextFileContent): BGSample[] {
|
||||
const samples: BGSample[] = []
|
||||
contents.replace(/^(.*) (\d+)$/gm, (match: string, stack: string, n: string) => {
|
||||
for (const line of contents.splitLines()) {
|
||||
const match = /^(.*) (\d+)$/gm.exec(line)
|
||||
if (!match) continue
|
||||
const stack = match[1]
|
||||
const n = match[2]
|
||||
|
||||
samples.push({
|
||||
stack: stack.split(';').map(name => ({key: name, name: name})),
|
||||
duration: parseInt(n, 10),
|
||||
})
|
||||
return match
|
||||
})
|
||||
}
|
||||
|
||||
return samples
|
||||
}
|
||||
|
||||
export function importFromBGFlameGraph(contents: string): Profile | null {
|
||||
export function importFromBGFlameGraph(contents: TextFileContent): Profile | null {
|
||||
const parsed = parseBGFoldedStacks(contents)
|
||||
const duration = parsed.reduce((prev: number, cur: BGSample) => prev + cur.duration, 0)
|
||||
const profile = new StackListProfileBuilder(duration)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
|
||||
test('importFromCallgrind', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/callgrind/callgrind.example.log')
|
||||
})
|
||||
|
||||
test('importFromCallgrind name compression', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/callgrind/callgrind.name-compression.log')
|
||||
})
|
||||
|
||||
test('importFromCallgrind multiple event types', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/callgrind/callgrind.multiple-event-types.log')
|
||||
})
|
||||
|
||||
test('importFromCallgrind subposition compression', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/callgrind/callgrind.subposition-compression.log')
|
||||
})
|
||||
|
||||
test('importFromCallgrind cfn reset', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/callgrind/callgrind.cfn-reset.log')
|
||||
})
|
||||
@@ -0,0 +1,631 @@
|
||||
// https://www.valgrind.org/docs/manual/cl-format.html
|
||||
//
|
||||
// Larger example files can be found by searching on github:
|
||||
// https://github.com/search?q=cfn%3D&type=code
|
||||
//
|
||||
// Converting callgrind files into flamegraphs is challenging because callgrind
|
||||
// formatted profiles contain call graphs with weighted nodes and edges, and
|
||||
// such a weighted call graph does not uniquely define a flamegraph.
|
||||
//
|
||||
// Consider a program that looks like this:
|
||||
//
|
||||
// // example.js
|
||||
// function backup(read) {
|
||||
// if (read) {
|
||||
// read()
|
||||
// } else {
|
||||
// write()
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// function start() {
|
||||
// backup(true)
|
||||
// }
|
||||
//
|
||||
// function end() {
|
||||
// backup(false)
|
||||
// }
|
||||
//
|
||||
// start()
|
||||
// end()
|
||||
//
|
||||
// Profiling this program might result in a profile that looks like the
|
||||
// following flame graph defined in Brendan Gregg's plaintext format:
|
||||
//
|
||||
// start;backup;read 4
|
||||
// end;backup;write 4
|
||||
//
|
||||
// When we convert this execution into a call-graph, we get the following:
|
||||
//
|
||||
// +------------------+ +---------------+
|
||||
// | start (self: 0) | | end (self: 0) |
|
||||
// +------------------+ +---------------|
|
||||
// \ /
|
||||
// (total: 4) \ / (total: 4)
|
||||
// v v
|
||||
// +------------------+
|
||||
// | backup (self: 0) |
|
||||
// +------------------+
|
||||
// / \
|
||||
// (total: 4) / \ (total: 4)
|
||||
// v v
|
||||
// +----------------+ +-----------------+
|
||||
// | read (self: 4) | | write (self: 4) |
|
||||
// +----------------+ +-----------------+
|
||||
//
|
||||
// In the process of the conversion, we've lost information about the ratio of
|
||||
// time spent in read v.s. write in the start call v.s. the end call. The
|
||||
// following flame graph would yield the exact same call-graph, and therefore
|
||||
// the exact sample call-grind formatted profile:
|
||||
//
|
||||
// start;backup;read 3
|
||||
// start;backup;write 1
|
||||
// end;backup;read 1
|
||||
// end;backup;write 3
|
||||
//
|
||||
// This is unfortunate, since it means we can't produce a flamegraph that isn't
|
||||
// potentially lying about the what the actual execution behavior was. To
|
||||
// produce a flamegraph at all from the call graph representation, we have to
|
||||
// decide how much weight each sub-call should have. Given that we know the
|
||||
// total weight of each node, we'll make the incorrect assumption that every
|
||||
// invocation of a function will have the average distribution of costs among
|
||||
// the sub-function invocations. In the example given, this means we assume that
|
||||
// every invocation of backup() is assumed to spend half its time in read() and
|
||||
// half its time in write().
|
||||
//
|
||||
// So the flamegraph we'll produce from the given call-graph will actually be:
|
||||
//
|
||||
// start;backup;read 2
|
||||
// start;backup;write 2
|
||||
// end;backup;read 2
|
||||
// end;backup;write 2
|
||||
//
|
||||
// A particularly bad consequence is that the resulting flamegraph will suggest
|
||||
// that there was at some point a call stack that looked like
|
||||
// strat;backup;write, even though that never happened in the real program
|
||||
// execution.
|
||||
|
||||
import {CallTreeProfileBuilder, Frame, FrameInfo, Profile, ProfileGroup} from '../lib/profile'
|
||||
import {getOrElse, getOrInsert, KeyedSet} from '../lib/utils'
|
||||
import {ByteFormatter, TimeFormatter} from '../lib/value-formatters'
|
||||
import {TextFileContent} from './utils'
|
||||
|
||||
class CallGraph {
|
||||
private frameSet = new KeyedSet<Frame>()
|
||||
private totalWeights = new Map<Frame, number>()
|
||||
private childrenTotalWeights = new Map<Frame, Map<Frame, number>>()
|
||||
|
||||
constructor(private fileName: string, private fieldName: string) {}
|
||||
|
||||
private getOrInsertFrame(info: FrameInfo): Frame {
|
||||
return Frame.getOrInsert(this.frameSet, info)
|
||||
}
|
||||
|
||||
private addToTotalWeight(frame: Frame, weight: number) {
|
||||
if (!this.totalWeights.has(frame)) {
|
||||
this.totalWeights.set(frame, weight)
|
||||
} else {
|
||||
this.totalWeights.set(frame, this.totalWeights.get(frame)! + weight)
|
||||
}
|
||||
}
|
||||
|
||||
addSelfWeight(frameInfo: FrameInfo, weight: number) {
|
||||
this.addToTotalWeight(this.getOrInsertFrame(frameInfo), weight)
|
||||
}
|
||||
|
||||
addChildWithTotalWeight(parentInfo: FrameInfo, childInfo: FrameInfo, weight: number) {
|
||||
const parent = this.getOrInsertFrame(parentInfo)
|
||||
const child = this.getOrInsertFrame(childInfo)
|
||||
|
||||
const childMap = getOrInsert(this.childrenTotalWeights, parent, k => new Map())
|
||||
|
||||
if (!childMap.has(child)) {
|
||||
childMap.set(child, weight)
|
||||
} else {
|
||||
childMap.set(child, childMap.get(child) + weight)
|
||||
}
|
||||
|
||||
this.addToTotalWeight(parent, weight)
|
||||
}
|
||||
|
||||
toProfile(): Profile {
|
||||
const profile = new CallTreeProfileBuilder()
|
||||
|
||||
let unitMultiplier = 1
|
||||
|
||||
// These are common field names used by Xdebug. Let's give them special
|
||||
// treatment to more helpfully display units.
|
||||
if (this.fieldName === 'Time_(10ns)') {
|
||||
profile.setName(`${this.fileName} -- Time`)
|
||||
unitMultiplier = 10
|
||||
profile.setValueFormatter(new TimeFormatter('nanoseconds'))
|
||||
} else if (this.fieldName == 'Memory_(bytes)') {
|
||||
profile.setName(`${this.fileName} -- Memory`)
|
||||
profile.setValueFormatter(new ByteFormatter())
|
||||
} else {
|
||||
profile.setName(`${this.fileName} -- ${this.fieldName}`)
|
||||
}
|
||||
|
||||
let totalCumulative = 0
|
||||
|
||||
const currentStack = new Set<Frame>()
|
||||
|
||||
let maxWeight = 0
|
||||
for (let [_, totalWeight] of this.totalWeights) {
|
||||
maxWeight = Math.max(maxWeight, totalWeight)
|
||||
}
|
||||
|
||||
const visit = (frame: Frame, subtreeTotalWeight: number) => {
|
||||
if (currentStack.has(frame)) {
|
||||
// Call-graphs are allowed to have cycles. Call-trees are not. In case
|
||||
// we run into a cycle, we'll just avoid recursing into the same subtree
|
||||
// more than once in a call stack. The result will be that the time
|
||||
// spent in the recursive call will instead be attributed as self time
|
||||
// in the parent.
|
||||
return
|
||||
}
|
||||
|
||||
// We need to calculate how much weight to give to a particular node in
|
||||
// the call-tree based on information from the call-graph. A given node
|
||||
// from the call-graph might correspond to several nodes in the call-tree,
|
||||
// so we need to decide how to distribute the weight of the call-graph
|
||||
// node to the various call-tree nodes.
|
||||
//
|
||||
// We assume that the weighting is evenly distributed. If a call-tree node
|
||||
// X occurs with weights x1 and x2, and we know from the call-graph that
|
||||
// child Y of X has a total weight y, then we assume the child Y of X has
|
||||
// weight y*x1/(x1 + x2) for the first occurrence, and y*x2(y1 + x2) for
|
||||
// the second occurrence.
|
||||
//
|
||||
// This assumption is incorrectly (sometimes wildly so), but we need to
|
||||
// make *some* assumption, and this seems to me the sanest option.
|
||||
//
|
||||
// See the comment at the top of the file for an example where this
|
||||
// assumption can yield especially misleading results.
|
||||
|
||||
if (subtreeTotalWeight < 1e-4 * maxWeight) {
|
||||
// This assumption about even distribution can cause us to generate a
|
||||
// call tree with dramatically more nodes than the call graph.
|
||||
//
|
||||
// Consider a function which is called 1000 times, where the result is
|
||||
// cached. The first invocation has a complex call tree and may take
|
||||
// 100ms. Let's say that this complex call tree has 250 nodes.
|
||||
//
|
||||
// Subsequent calls use the cached result, so take only 1ms, and have no
|
||||
// children in their call trees. So we have, in total, (1 + 250) + 999
|
||||
// nodes in the call-tree for a total of 1250 nodes.
|
||||
//
|
||||
// The information specific to each invocation is, however, lost in the
|
||||
// call-graph representation.
|
||||
//
|
||||
// Because of the even distribution assumption we make, this means that
|
||||
// the call-trees of each invocation will have the same shape. Each 1ms
|
||||
// call-tree will look identical to the 100ms call-tree, just
|
||||
// horizontally compacted. So instead of 1251 nodes, we have
|
||||
// 1000*250=250,000 nodes in the resulting call graph.
|
||||
//
|
||||
// To mitigate this explosion of the # of nodes, we ignore subtrees
|
||||
// whose weights are less than 0.01% of the heaviest node in the call
|
||||
// graph.
|
||||
return
|
||||
}
|
||||
|
||||
const totalWeightForFrameInCallgraph = getOrElse(this.totalWeights, frame, () => 0)
|
||||
if (totalWeightForFrameInCallgraph === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
let selfWeightForNodeInCallTree = subtreeTotalWeight
|
||||
|
||||
profile.enterFrame(frame, Math.round(totalCumulative * unitMultiplier))
|
||||
|
||||
currentStack.add(frame)
|
||||
for (let [child, totalWeightAsChild] of this.childrenTotalWeights.get(frame) || []) {
|
||||
// To determine the weight of the child in the call tree, we look at the
|
||||
// weight of the child in the call graph relative to its parent.
|
||||
const childCallTreeWeight =
|
||||
subtreeTotalWeight * (totalWeightAsChild / totalWeightForFrameInCallgraph)
|
||||
|
||||
let prevTotalCumulative = totalCumulative
|
||||
visit(child, childCallTreeWeight)
|
||||
|
||||
// Even though we tried to add a child with total weight equal to
|
||||
// childCallTreeWeight, we might have failed for a variety of data
|
||||
// consistency reasons, or due to cycles.
|
||||
//
|
||||
// We want to avoid losing weight in the call tree by subtracting from
|
||||
// the self weight on the assumption it was added to the subtree, so we
|
||||
// only subtree from the self weight the amount that was *actually* used
|
||||
// by the subtree, rather than the amount we *intended* for it to use.
|
||||
const actualChildCallTreeWeight = totalCumulative - prevTotalCumulative
|
||||
selfWeightForNodeInCallTree -= actualChildCallTreeWeight
|
||||
}
|
||||
currentStack.delete(frame)
|
||||
|
||||
totalCumulative += selfWeightForNodeInCallTree
|
||||
profile.leaveFrame(frame, Math.round(totalCumulative * unitMultiplier))
|
||||
}
|
||||
|
||||
// It's surprisingly hard to figure out which nodes in the call graph
|
||||
// constitute the root nodes of call trees.
|
||||
//
|
||||
// Here are a few intuitive options, and reasons why they're not always
|
||||
// correct or good.
|
||||
//
|
||||
// ## 1. Find nodes in the call graph that have no callers
|
||||
//
|
||||
// This is probably right 99% of the time in practice, but since the
|
||||
// callgrind is totally general, it's totally valid to have a file
|
||||
// representing a profile for the following code:
|
||||
//
|
||||
// function a() {
|
||||
// b()
|
||||
// }
|
||||
// function b() {
|
||||
// }
|
||||
// a()
|
||||
// b()
|
||||
//
|
||||
// In this case, even though b has a caller, some of the real calltree for
|
||||
// an execution trace of the program will have b on the top of the stack.
|
||||
//
|
||||
// ## 2. Find nodes in the call graph that still have weight if you
|
||||
// subtract all of the weight caused by callers.
|
||||
//
|
||||
// The callgraph format, in theory, provides inclusive times for every
|
||||
// function call. That means if you have a function `alpha` with a total
|
||||
// weight of 20, and its only in-edge in the call-graph has weight of 10,
|
||||
// that should indicate that `alpha` exists both as the root-node of a
|
||||
// calltree, and as a node in some other call-tree.
|
||||
//
|
||||
// In theory, you should be able to figure out the weight of it as a root
|
||||
// node by subtracting the weights of all the in-edges. In practice, real
|
||||
// callgrind files are inconsistent in how they do accounting for in-edges
|
||||
// where you end up in weird situations where the weight of in-edges
|
||||
// *exceeds* the weight of nodes (where the weight of a node is its
|
||||
// self-weight plus the weight of all its out-edges).
|
||||
//
|
||||
// ## 3. Find the heaviest node in the call graph, build its call-tree, and
|
||||
// decrease the weights of other nodes in the call graph while you
|
||||
// build the call tree. After you've done this, repeat with the new
|
||||
// heaviest.
|
||||
//
|
||||
// I think this version is probably fully correct, but the performance is
|
||||
// awful. The naive-version is O(n^2) because you have to re-determine which
|
||||
// node is the heaviest after each time you finish building a call-tree. You
|
||||
// can't just sort, because the relative ordering also changes with the
|
||||
// construction of each call tree.
|
||||
//
|
||||
// There's probably a clever solution here which puts all of the nodes into
|
||||
// a min-heap and then deletes and re-inserts nodes as their weights change,
|
||||
// but reasoning about the performance of that is a big pain in the butt.
|
||||
//
|
||||
// Despite not always being correct, I'm opting for option (1).
|
||||
|
||||
const rootNodes = new Set<Frame>(this.frameSet)
|
||||
|
||||
for (let [_, childMap] of this.childrenTotalWeights) {
|
||||
for (let [child, _] of childMap) {
|
||||
rootNodes.delete(child)
|
||||
}
|
||||
}
|
||||
|
||||
for (let rootNode of rootNodes) {
|
||||
visit(rootNode, this.totalWeights.get(rootNode)!)
|
||||
}
|
||||
|
||||
return profile.build()
|
||||
}
|
||||
}
|
||||
|
||||
// In writing this, I initially tried to use the formal grammar described in
|
||||
// section 3.2 of https://www.valgrind.org/docs/manual/cl-format.html, but
|
||||
// stopped because most of the information isn't relevant for visualization, and
|
||||
// because there's inconsistency between the grammar and subsequence
|
||||
// descriptions.
|
||||
//
|
||||
// For example, the grammar for headers specifies all the valid header names,
|
||||
// but then the writing below that mentions there may be a "totals" or "summary"
|
||||
// header, which should be disallowed by the formal grammar.
|
||||
//
|
||||
// So, instead, I'm not going to bother with a formal parse. Since there are no
|
||||
// real recursive structures in this file format, that should be okay.
|
||||
class CallgrindParser {
|
||||
private lines: string[]
|
||||
private lineNum: number
|
||||
|
||||
private callGraphs: CallGraph[] | null = null
|
||||
private eventsLine: string | null = null
|
||||
|
||||
private filename: string | null = null
|
||||
private functionName: string | null = null
|
||||
private calleeFilename: string | null = null
|
||||
private calleeFunctionName: string | null = null
|
||||
|
||||
private savedFileNames: {[id: string]: string} = {}
|
||||
private savedFunctionNames: {[id: string]: string} = {}
|
||||
|
||||
constructor(contents: TextFileContent, private importedFileName: string) {
|
||||
this.lines = [...contents.splitLines()]
|
||||
this.lineNum = 0
|
||||
}
|
||||
|
||||
parse(): ProfileGroup | null {
|
||||
while (this.lineNum < this.lines.length) {
|
||||
const line = this.lines[this.lineNum++]
|
||||
|
||||
if (/^\s*#/.exec(line)) {
|
||||
// Line is a comment. Ignore it.
|
||||
continue
|
||||
}
|
||||
|
||||
if (/^\s*$/.exec(line)) {
|
||||
// Line is empty. Ignore it.
|
||||
continue
|
||||
}
|
||||
|
||||
if (this.parseHeaderLine(line)) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (this.parseAssignmentLine(line)) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (this.parseCostLine(line, 'self')) {
|
||||
continue
|
||||
}
|
||||
|
||||
throw new Error(`Unrecognized line "${line}" on line ${this.lineNum}`)
|
||||
}
|
||||
|
||||
if (!this.callGraphs) {
|
||||
return null
|
||||
}
|
||||
return {
|
||||
name: this.importedFileName,
|
||||
indexToView: 0,
|
||||
profiles: this.callGraphs.map(cg => cg.toProfile()),
|
||||
}
|
||||
}
|
||||
|
||||
private frameInfo(): FrameInfo {
|
||||
const file = this.filename || '(unknown)'
|
||||
const name = this.functionName || '(unknown)'
|
||||
const key = `${file}:${name}`
|
||||
return {key, name, file}
|
||||
}
|
||||
|
||||
private calleeFrameInfo(): FrameInfo {
|
||||
const file = this.calleeFilename || this.filename || '(unknown)'
|
||||
const name = this.calleeFunctionName || '(unknown)'
|
||||
const key = `${file}:${name}`
|
||||
return {key, name, file}
|
||||
}
|
||||
|
||||
private parseHeaderLine(line: string): boolean {
|
||||
const headerMatch = /^\s*(\w+):\s*(.*)+$/.exec(line)
|
||||
if (!headerMatch) return false
|
||||
|
||||
if (headerMatch[1] !== 'events') {
|
||||
// We don't care about other headers. Ignore this line.
|
||||
return true
|
||||
}
|
||||
|
||||
// Line specifies the formatting of subsequent cost lines.
|
||||
const fields = headerMatch[2].split(' ')
|
||||
|
||||
if (this.callGraphs != null) {
|
||||
throw new Error(
|
||||
`Duplicate "events: " lines specified. First was "${this.eventsLine}", now received "${line}" on ${this.lineNum}.`,
|
||||
)
|
||||
}
|
||||
|
||||
this.callGraphs = fields.map(fieldName => {
|
||||
return new CallGraph(this.importedFileName, fieldName)
|
||||
})
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private parseAssignmentLine(line: string): boolean {
|
||||
const assignmentMatch = /^(\w+)=\s*(.*)$/.exec(line)
|
||||
if (!assignmentMatch) return false
|
||||
|
||||
const key = assignmentMatch[1]
|
||||
const value = assignmentMatch[2]
|
||||
|
||||
switch (key) {
|
||||
case 'fe':
|
||||
case 'fi': {
|
||||
// fe/fi are used to indicate the source-file of a function definition
|
||||
// changed mid-definition. This is for inlined code, but doesn't
|
||||
// indicate that we've actually switched to referring to a different
|
||||
// function, so we mostly ignore it.
|
||||
//
|
||||
// We still need to do the parseNameWithCompression call in case a name
|
||||
// is defined and then referenced later on for name compression.
|
||||
this.parseNameWithCompression(value, this.savedFileNames)
|
||||
break
|
||||
}
|
||||
|
||||
case 'fl': {
|
||||
this.filename = this.parseNameWithCompression(value, this.savedFileNames)
|
||||
break
|
||||
}
|
||||
|
||||
case 'fn': {
|
||||
this.functionName = this.parseNameWithCompression(value, this.savedFunctionNames)
|
||||
break
|
||||
}
|
||||
|
||||
case 'cfi':
|
||||
case 'cfl': {
|
||||
// NOTE: unlike the fe/fi distinction described above, cfi and cfl are
|
||||
// interchangeable.
|
||||
this.calleeFilename = this.parseNameWithCompression(value, this.savedFileNames)
|
||||
break
|
||||
}
|
||||
|
||||
case 'cfn': {
|
||||
this.calleeFunctionName = this.parseNameWithCompression(value, this.savedFunctionNames)
|
||||
break
|
||||
}
|
||||
|
||||
case 'calls': {
|
||||
// TODO(jlfwong): This is currently ignoring the number of calls being
|
||||
// made. Accounting for the number of calls might be unhelpful anyway,
|
||||
// since it'll just be copying the exact same frame over-and-over again,
|
||||
// but that might be better than ignoring it.
|
||||
this.parseCostLine(this.lines[this.lineNum++], 'child')
|
||||
|
||||
// This isn't specified anywhere in the spec, but empirically the and
|
||||
// "cfn" scope should only persist for a single "call".
|
||||
//
|
||||
// This seems to be what KCacheGrind does too:
|
||||
//
|
||||
// https://github.com/KDE/kcachegrind/blob/ea4314db2785cb8f279fe884ee7f82445642b692/libcore/cachegrindloader.cpp#L1259
|
||||
this.calleeFilename = null
|
||||
this.calleeFunctionName = null
|
||||
break
|
||||
}
|
||||
|
||||
case 'cob':
|
||||
case 'ob': {
|
||||
// We ignore these for now. They're valid lines, but we don't capture or
|
||||
// display information about them.
|
||||
break
|
||||
}
|
||||
|
||||
default: {
|
||||
console.log(`Ignoring assignment to unrecognized key "${line}" on line ${this.lineNum}`)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private parseNameWithCompression(name: string, saved: {[id: string]: string}): string {
|
||||
{
|
||||
const nameDefinitionMatch = /^\((\d+)\)\s*(.+)$/.exec(name)
|
||||
|
||||
if (nameDefinitionMatch) {
|
||||
const id = nameDefinitionMatch[1]
|
||||
const name = nameDefinitionMatch[2]
|
||||
if (id in saved) {
|
||||
throw new Error(
|
||||
`Redefinition of name with id: ${id}. Original value was "${saved[id]}". Tried to redefine as "${name}" on line ${this.lineNum}.`,
|
||||
)
|
||||
}
|
||||
|
||||
saved[id] = name
|
||||
return name
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const nameUseMatch = /^\((\d+)\)$/.exec(name)
|
||||
if (nameUseMatch) {
|
||||
const id = nameUseMatch[1]
|
||||
if (!(id in saved)) {
|
||||
throw new Error(
|
||||
`Tried to use name with id ${id} on line ${this.lineNum} before it was defined.`,
|
||||
)
|
||||
}
|
||||
return saved[id]
|
||||
}
|
||||
}
|
||||
|
||||
return name
|
||||
}
|
||||
|
||||
private prevCostLineNumbers: number[] = []
|
||||
|
||||
private parseCostLine(line: string, costType: 'self' | 'child'): boolean {
|
||||
// TODO(jlfwong): Allow hexadecimal encoding
|
||||
|
||||
const parts = line.split(/\s+/)
|
||||
const nums: number[] = []
|
||||
|
||||
for (let i = 0; i < parts.length; i++) {
|
||||
const part = parts[i]
|
||||
|
||||
if (part.length === 0) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (part === '*' || part[0] === '-' || part[1] === '+') {
|
||||
// This handles "Subposition compression"
|
||||
// See: https://valgrind.org/docs/manual/cl-format.html#cl-format.overview.compression2
|
||||
if (this.prevCostLineNumbers.length <= i) {
|
||||
throw new Error(
|
||||
`Line ${this.lineNum} has a subposition on column ${i} but ` +
|
||||
`previous cost line has only ${this.prevCostLineNumbers.length} ` +
|
||||
`columns. Line contents: ${line}`,
|
||||
)
|
||||
}
|
||||
const prevCostForSubposition = this.prevCostLineNumbers[i]
|
||||
if (part === '*') {
|
||||
nums.push(prevCostForSubposition)
|
||||
} else {
|
||||
// This handles both the '-' and '+' cases
|
||||
const offset = parseInt(part)
|
||||
if (isNaN(offset)) {
|
||||
throw new Error(
|
||||
`Line ${this.lineNum} has a subposition on column ${i} but ` +
|
||||
`the offset is not a number. Line contents: ${line}`,
|
||||
)
|
||||
}
|
||||
nums.push(prevCostForSubposition + offset)
|
||||
}
|
||||
} else {
|
||||
const asNum = parseInt(part)
|
||||
if (isNaN(asNum)) {
|
||||
return false
|
||||
}
|
||||
nums.push(asNum)
|
||||
}
|
||||
}
|
||||
|
||||
if (nums.length == 0) {
|
||||
return false
|
||||
}
|
||||
|
||||
// TODO(jlfwong): Handle custom positions format w/ multiple parts
|
||||
const numPositionFields = 1
|
||||
|
||||
// NOTE: We intentionally do not include the line number here because
|
||||
// callgrind uses the line number of the function invocation, not the
|
||||
// line number of the function definition, which conflicts with how
|
||||
// speedscope uses line numbers.
|
||||
//
|
||||
// const lineNum = nums[0]
|
||||
|
||||
if (!this.callGraphs) {
|
||||
throw new Error(
|
||||
`Encountered a cost line on line ${this.lineNum} before event specification was provided.`,
|
||||
)
|
||||
}
|
||||
for (let i = 0; i < this.callGraphs.length; i++) {
|
||||
if (costType === 'self') {
|
||||
this.callGraphs[i].addSelfWeight(this.frameInfo(), nums[numPositionFields + i])
|
||||
} else if (costType === 'child') {
|
||||
this.callGraphs[i].addChildWithTotalWeight(
|
||||
this.frameInfo(),
|
||||
this.calleeFrameInfo(),
|
||||
nums[numPositionFields + i] || 0,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
this.prevCostLineNumbers = nums
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
export function importFromCallgrind(
|
||||
contents: TextFileContent,
|
||||
importedFileName: string,
|
||||
): ProfileGroup | null {
|
||||
return new CallgrindParser(contents, importedFileName).parse()
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import {checkProfileSnapshot} from '../lib/test-utils'
|
||||
import {withMockedFileChunkSizeForTests} from './utils'
|
||||
|
||||
test('importFromChromeCPUProfile', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/65/simple.cpuprofile')
|
||||
@@ -8,6 +9,12 @@ test('importFromChromeTimeline', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/65/simple-timeline.json')
|
||||
})
|
||||
|
||||
test('importFromChromeTimeline chunked', async () => {
|
||||
await withMockedFileChunkSizeForTests(100, async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/65/simple-timeline.json')
|
||||
})
|
||||
})
|
||||
|
||||
test('importFromChromeTimeline Chrome 69', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/69/simple.json')
|
||||
})
|
||||
@@ -23,3 +30,7 @@ test('importFromChromeTimeline Workers Chrome 66', async () => {
|
||||
test('importFromChromeTimeline Workers Chrome 70', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/70/worker.json')
|
||||
})
|
||||
|
||||
test('importFromChromeTimeline Chrome 116', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/Chrome/116/Trace-20230603T221323.json')
|
||||
})
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user