Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d36c3a5442 | ||
|
|
e468c60229 | ||
|
|
d69f3d0eec | ||
|
|
25f671e9d8 | ||
|
|
0121cf9342 | ||
|
|
68fd88ceaf | ||
|
|
a6d700194f | ||
|
|
a3c0b15935 | ||
|
|
e9a17d5d14 | ||
|
|
3f3da22853 |
@@ -1,3 +1,19 @@
|
||||
## [1.21.0] - 2024-11-16
|
||||
|
||||
- Add support for Instruments 16 Time Profile Deep Copy [[#484](https://github.com/jlfwong/speedscope/pull/484)] (by @robert3005)
|
||||
- Fix bug where import after error continues failing [[#463](https://github.com/jlfwong/speedscope/pull/463)] (by @tom93)
|
||||
- Bundle the font [[#472](https://github.com/jlfwong/speedscope/pull/472)] (by @Krinkle)
|
||||
- Clarify specification of startValue in speedscope file format [[#464](https://github.com/jlfwong/speedscope/pull/464)] (by @tom93)
|
||||
|
||||
## [1.20.0] - 2024-01-12
|
||||
|
||||
- Partition based on samples instead of traceEvents when importing a sample-based chrome trace [[#460](https://github.com/jlfwong/speedscope/pull/460)] (by @zacharyfmarion)
|
||||
|
||||
## [1.19.0] - 2023-12-27
|
||||
|
||||
- Improve hermes profile frame keys to better group frames [[#459](https://github.com/jlfwong/speedscope/pull/459)] (by @zacharyfmarion)
|
||||
- Update README.md
|
||||
|
||||
## [1.18.0] - 2023-12-26
|
||||
|
||||
- Add hermes-specific support for the trace event format [[#458](https://github.com/jlfwong/speedscope/pull/458)] (by @zacharyfmarion)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
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.
|
||||
A fast, interactive web-based viewer for performance profiles. Supports import from a variety of profiles in a variety of languages (JS, Ruby, Python, Go & more). Try it here: https://www.speedscope.app
|
||||
|
||||
Given raw profiling data, speedscope allows you to interactively explore the data to get insight into what's slow in your application, or allocating all the memory, or whatever data is represented in the profiling data.
|
||||
|
||||
@@ -10,27 +9,7 @@ Given raw profiling data, speedscope allows you to interactively explore the dat
|
||||
[0]: https://en.wikipedia.org/wiki/Profiling_(computer_programming)#Statistical_profilers
|
||||
[1]: https://github.com/brendangregg/FlameGraph
|
||||
|
||||
# Usage
|
||||
|
||||
Visit https://www.speedscope.app, then either browse to find a profile file or drag-and-drop one onto the page. The profiles are not uploaded anywhere -- the application is totally in-browser.
|
||||
|
||||
## Command line usage
|
||||
|
||||
For offline use, or convenience in the terminal, you can also install speedscope
|
||||
via npm:
|
||||
|
||||
npm install -g speedscope
|
||||
|
||||
Invoking `speedscope /path/to/profile` will load speedscope in your default browser.
|
||||
|
||||
## Self-contained directory
|
||||
|
||||
If you don't have npm or node installed, you can also download a
|
||||
self-contained version from https://github.com/jlfwong/speedscope/releases.
|
||||
After you download the zip file from a release, simply unzip it and open the
|
||||
contained `index.html` in Chrome or Firefox.
|
||||
|
||||
## Supported file formats
|
||||
# Supported file formats
|
||||
|
||||
speedscope is designed to ingest profiles from a variety of different profilers for different programming languages & environments. Click the links below for documentation on how to import from a specific source.
|
||||
|
||||
@@ -39,6 +18,7 @@ speedscope is designed to ingest profiles from a variety of different profilers
|
||||
- [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)
|
||||
- [Importing from Hermes (for React Native)](https://github.com/jlfwong/speedscope/wiki/Importing-from-Hermes)
|
||||
- Ruby
|
||||
- [Importing from stackprof](https://github.com/jlfwong/speedscope/wiki/Importing-from-stackprof-(ruby))
|
||||
- [Importing from rbspy](https://github.com/jlfwong/speedscope/wiki/Importing-from-rbspy-(ruby))
|
||||
@@ -62,6 +42,25 @@ speedscope is designed to ingest profiles from a variety of different profilers
|
||||
- [Importing from custom sources](https://github.com/jlfwong/speedscope/wiki/Importing-from-custom-sources)
|
||||
|
||||
Contributions to add support for additional formats are welcome! See issues with the ["import source" tag](https://github.com/jlfwong/speedscope/issues?q=is%3Aissue+is%3Aopen+label%3A%22import+source%22).
|
||||
# Usage
|
||||
|
||||
Visit https://www.speedscope.app, then either browse to find a profile file or drag-and-drop one onto the page. The profiles are not uploaded anywhere -- the application is totally in-browser.
|
||||
|
||||
## Command line usage
|
||||
|
||||
For offline use, or convenience in the terminal, you can also install speedscope
|
||||
via npm:
|
||||
|
||||
npm install -g speedscope
|
||||
|
||||
Invoking `speedscope /path/to/profile` will load speedscope in your default browser.
|
||||
|
||||
## Self-contained directory
|
||||
|
||||
If you don't have npm or node installed, you can also download a
|
||||
self-contained version from https://github.com/jlfwong/speedscope/releases.
|
||||
After you download the zip file from a release, simply unzip it and open the
|
||||
contained `index.html` in Chrome or Firefox.
|
||||
|
||||
## Importing via URL
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>speedscope</title>
|
||||
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet">
|
||||
<link href="source-code-pro.css" rel="stylesheet">
|
||||
<script>
|
||||
// https://github.com/evanw/webgl-recorder
|
||||
false && (function () {
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
@font-face{
|
||||
font-family: 'Source Code Pro';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-stretch: normal;
|
||||
src: url('./source-code-pro/SourceCodePro-Regular.ttf.woff2') format('woff2');
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
Copyright 2010-2019 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
Binary file not shown.
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "1.18.0",
|
||||
"version": "1.21.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "speedscope",
|
||||
"version": "1.18.0",
|
||||
"version": "1.21.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"open": "7.2.0"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "speedscope",
|
||||
"version": "1.18.0",
|
||||
"version": "1.21.0",
|
||||
"description": "",
|
||||
"repository": "jlfwong/speedscope",
|
||||
"main": "index.js",
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
Weight Self Weight Symbol Names
|
||||
4.93 s 100.0% 0 s start
|
||||
4.93 s 99.9% 0 s main
|
||||
2.45 s 0.0% 846.00 ms delta()
|
||||
797.00 ms 0.0% 786.00 ms alpha()
|
||||
9.00 ms 0.0% 0 s leakMemory()
|
||||
8.00 ms 0.0% 1.00 ms szone_malloc_should_clear
|
||||
6.00 ms 0.0% 4.00 ms small_malloc_should_clear
|
||||
2.00 ms 0.0% 2.00 ms small_malloc_from_free_list
|
||||
1.00 ms 0.0% 1.00 ms small_malloc_from_free_list
|
||||
1.00 ms 0.0% 1.00 ms _malloc_zone_malloc
|
||||
2.00 ms 0.0% 2.00 ms _malloc_zone_malloc
|
||||
795.00 ms 0.0% 778.00 ms beta()
|
||||
14.00 ms 0.0% 1.00 ms leakMemory()
|
||||
11.00 ms 0.0% 2.00 ms szone_malloc_should_clear
|
||||
9.00 ms 0.0% 3.00 ms small_malloc_should_clear
|
||||
5.00 ms 0.0% 5.00 ms small_malloc_from_free_list
|
||||
1.00 ms 0.0% 1.00 ms rack_get_thread_index
|
||||
1.00 ms 0.0% 1.00 ms nanov2_malloc_type
|
||||
1.00 ms 0.0% 1.00 ms DYLD-STUB$$malloc
|
||||
2.00 ms 0.0% 2.00 ms nanov2_malloc_type
|
||||
1.00 ms 0.0% 1.00 ms _malloc_zone_malloc
|
||||
10.00 ms 0.0% 0 s leakMemory()
|
||||
7.00 ms 0.0% 3.00 ms szone_malloc_should_clear
|
||||
4.00 ms 0.0% 3.00 ms small_malloc_should_clear
|
||||
1.00 ms 0.0% 0 s mvm_allocate_pages_plat
|
||||
1.00 ms 0.0% 1.00 ms _kernelrpc_mach_vm_map_trap
|
||||
2.00 ms 0.0% 2.00 ms small_malloc_should_clear
|
||||
1.00 ms 0.0% 1.00 ms _malloc_zone_malloc
|
||||
3.00 ms 0.0% 3.00 ms _malloc_zone_malloc
|
||||
838.00 ms 0.0% 827.00 ms gamma()
|
||||
9.00 ms 0.0% 1.00 ms leakMemory()
|
||||
5.00 ms 0.0% 0 s szone_malloc_should_clear
|
||||
4.00 ms 0.0% 1.00 ms small_malloc_should_clear
|
||||
3.00 ms 0.0% 3.00 ms small_malloc_from_free_list
|
||||
1.00 ms 0.0% 1.00 ms rack_get_thread_index
|
||||
1.00 ms 0.0% 1.00 ms small_malloc_should_clear
|
||||
1.00 ms 0.0% 1.00 ms _malloc_zone_malloc
|
||||
1.00 ms 0.0% 1.00 ms nanov2_malloc_type
|
||||
2.00 ms 0.0% 2.00 ms _malloc_zone_malloc
|
||||
834.00 ms 0.0% 824.00 ms beta()
|
||||
9.00 ms 0.0% 0 s leakMemory()
|
||||
7.00 ms 0.0% 0 s szone_malloc_should_clear
|
||||
6.00 ms 0.0% 1.00 ms small_malloc_should_clear
|
||||
4.00 ms 0.0% 4.00 ms small_malloc_from_free_list
|
||||
1.00 ms 0.0% 1.00 ms rack_get_thread_index
|
||||
1.00 ms 0.0% 1.00 ms rack_get_thread_index
|
||||
1.00 ms 0.0% 1.00 ms nanov2_malloc_type
|
||||
1.00 ms 0.0% 1.00 ms small_malloc_should_clear
|
||||
1.00 ms 0.0% 1.00 ms _malloc_zone_malloc
|
||||
803.00 ms 0.0% 788.00 ms alpha()
|
||||
14.00 ms 0.0% 0 s leakMemory()
|
||||
11.00 ms 0.0% 1.00 ms szone_malloc_should_clear
|
||||
10.00 ms 0.0% 3.00 ms small_malloc_should_clear
|
||||
5.00 ms 0.0% 5.00 ms small_malloc_from_free_list
|
||||
2.00 ms 0.0% 2.00 ms rack_get_thread_index
|
||||
1.00 ms 0.0% 1.00 ms nanov2_malloc_type
|
||||
1.00 ms 0.0% 1.00 ms small_malloc_should_clear
|
||||
1.00 ms 0.0% 1.00 ms _malloc_zone_malloc
|
||||
1.00 ms 0.0% 1.00 ms _malloc_zone_malloc
|
||||
4.00 ms 0.1% 0 s dyld4::start(dyld4::KernelArgs*, void*, void*)::$_0::operator()() const
|
||||
4.00 ms 0.1% 0 s dyld4::prepare(dyld4::APIs&, dyld3::MachOAnalyzer const*)
|
||||
3.00 ms 0.0% 0 s dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&)
|
||||
3.00 ms 0.0% 0 s mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const
|
||||
3.00 ms 0.0% 0 s mach_o::Header::forEachLoadCommand(void (load_command const*, bool&) block_pointer) const
|
||||
3.00 ms 0.0% 0 s invocation function for block in mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const
|
||||
3.00 ms 0.0% 0 s invocation function for block in dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&)
|
||||
3.00 ms 0.0% 0 s dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&)
|
||||
3.00 ms 0.0% 0 s dyld4::Loader::forEachPath(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer)
|
||||
3.00 ms 0.0% 0 s dyld4::ProcessConfig::PathOverrides::forEachPathVariant(char const*, dyld3::Platform, bool, bool, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer) const
|
||||
3.00 ms 0.0% 0 s dyld4::Loader::forEachResolvedAtPathVar(dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, dyld4::ProcessConfig::PathOverrides::Type, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer)
|
||||
3.00 ms 0.0% 0 s invocation function for block in dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&)
|
||||
3.00 ms 0.0% 0 s dyld4::Loader::makeDyldCacheLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, unsigned int, mach_o::Layout const*)
|
||||
3.00 ms 0.0% 0 s dyld4::RuntimeState::findPrebuiltLoader(char const*) const
|
||||
3.00 ms 0.0% 0 s dyld4::PrebuiltLoader::isValid(dyld4::RuntimeState const&) const
|
||||
3.00 ms 0.0% 0 s dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const
|
||||
3.00 ms 0.0% 0 s dyld4::ProcessConfig::PathOverrides::forEachPathVariant(char const*, dyld3::Platform, bool, bool, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer) const
|
||||
3.00 ms 0.0% 0 s invocation function for block in dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const
|
||||
3.00 ms 0.0% 0 s dyld4::SyscallDelegate::fileExists(char const*, dyld4::FileID*, int*) const
|
||||
3.00 ms 0.0% 0 s dyld3::stat(char const*, stat*)
|
||||
3.00 ms 0.0% 3.00 ms stat
|
||||
1.00 ms 0.0% 0 s dyld4::APIs::runAllInitializersForMain()
|
||||
1.00 ms 0.0% 0 s dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const
|
||||
1.00 ms 0.0% 0 s dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const::$_0::operator()() const
|
||||
1.00 ms 0.0% 0 s dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const
|
||||
1.00 ms 0.0% 0 s dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const
|
||||
1.00 ms 0.0% 0 s dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const
|
||||
1.00 ms 0.0% 0 s dyld4::PrebuiltLoader::runInitializers(dyld4::RuntimeState&) const
|
||||
1.00 ms 0.0% 0 s dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const
|
||||
1.00 ms 0.0% 0 s dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const
|
||||
1.00 ms 0.0% 0 s dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const
|
||||
1.00 ms 0.0% 0 s dyld3::MachOFile::forEachLoadCommand(Diagnostics&, void (load_command const*, bool&) block_pointer) const
|
||||
1.00 ms 0.0% 0 s invocation function for block in dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const
|
||||
1.00 ms 0.0% 0 s invocation function for block in dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const
|
||||
1.00 ms 0.0% 1.00 ms _GLOBAL__sub_I_stdlib_typed_new.cpp
|
||||
@@ -0,0 +1,156 @@
|
||||
[
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"B",
|
||||
"name":"[root]",
|
||||
"ts":0,
|
||||
"args":{
|
||||
"name":"[root]",
|
||||
"category":"root",
|
||||
"url":null,
|
||||
"line":null,
|
||||
"column":null,
|
||||
"params":null,
|
||||
"allocatedCategory":"root",
|
||||
"allocatedName":"[root]"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"B",
|
||||
"name":"beta",
|
||||
"ts":1,
|
||||
"args":{
|
||||
"line":54,
|
||||
"column":12,
|
||||
"funcLine":"1",
|
||||
"funcColumn":"1",
|
||||
"name":"beta",
|
||||
"category":"JavaScript",
|
||||
"parent":1,
|
||||
"url":"/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"params":null,
|
||||
"allocatedCategory":"JavaScript",
|
||||
"allocatedName":"beta"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"E",
|
||||
"name":"beta",
|
||||
"ts":2,
|
||||
"args":{
|
||||
"line":54,
|
||||
"column":12,
|
||||
"funcLine":"1",
|
||||
"funcColumn":"1",
|
||||
"name":"beta",
|
||||
"category":"JavaScript",
|
||||
"parent":1,
|
||||
"url":"/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"params":null,
|
||||
"allocatedCategory":"JavaScript",
|
||||
"allocatedName":"beta"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"B",
|
||||
"name":"gamma",
|
||||
"ts":4,
|
||||
"args":{
|
||||
"line":54,
|
||||
"column":12,
|
||||
"funcLine":"1",
|
||||
"funcColumn":"1",
|
||||
"name":"beta",
|
||||
"category":"blah",
|
||||
"parent":1,
|
||||
"url":"/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"params":null,
|
||||
"allocatedCategory":"JavaScript",
|
||||
"allocatedName":"beta"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"E",
|
||||
"name":"gamma",
|
||||
"ts":13,
|
||||
"args":{
|
||||
"line":54,
|
||||
"column":12,
|
||||
"funcLine":"1",
|
||||
"funcColumn":"1",
|
||||
"name":"beta",
|
||||
"category":"blah",
|
||||
"parent":1,
|
||||
"url":"/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"params":null,
|
||||
"allocatedCategory":"JavaScript",
|
||||
"allocatedName":"beta"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"B",
|
||||
"name":"beta",
|
||||
"ts":4,
|
||||
"args":{
|
||||
"line":54,
|
||||
"column":12,
|
||||
"funcLine":"1",
|
||||
"funcColumn":"1",
|
||||
"name":"beta",
|
||||
"category":"blah",
|
||||
"parent":1,
|
||||
"url":"/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"params":null,
|
||||
"allocatedCategory":"JavaScript",
|
||||
"allocatedName":"beta"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"E",
|
||||
"name":"beta",
|
||||
"ts":10,
|
||||
"args":{
|
||||
"line":54,
|
||||
"column":12,
|
||||
"funcLine":"1",
|
||||
"funcColumn":"1",
|
||||
"name":"beta",
|
||||
"category":"blah",
|
||||
"parent":1,
|
||||
"url":"/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"params":null,
|
||||
"allocatedCategory":"JavaScript",
|
||||
"allocatedName":"beta"
|
||||
}
|
||||
},
|
||||
{
|
||||
"pid":0,
|
||||
"tid":0,
|
||||
"ph":"E",
|
||||
"name":"[root]",
|
||||
"ts":14,
|
||||
"args":{
|
||||
"name":"[root]",
|
||||
"category":"root",
|
||||
"url":null,
|
||||
"line":null,
|
||||
"column":null,
|
||||
"params":null,
|
||||
"allocatedCategory":"root",
|
||||
"allocatedName":"[root]"
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -21,16 +21,6 @@
|
||||
"args": {
|
||||
"name": "mqt_js"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mqt_js",
|
||||
"cat": "mqt_js",
|
||||
"ph": "X",
|
||||
"dur": 0,
|
||||
"pid": 7512,
|
||||
"ts": "11550183666",
|
||||
"tid": "7695",
|
||||
"args": {}
|
||||
}
|
||||
],
|
||||
"samples": [
|
||||
|
||||
@@ -22,5 +22,9 @@ git rev-parse HEAD >> "$OUTDIR"/release.txt
|
||||
# Place a json schema for the file format into the build directory too
|
||||
node scripts/generate-file-format-schema-json.js > "$OUTDIR"/file-format-schema.json
|
||||
|
||||
# Include licenses
|
||||
# https://github.com/jlfwong/speedscope/pull/412
|
||||
cp assets/source-code-pro/LICENSE.md "$OUTDIR"/source-code-pro.LICENSE.md
|
||||
|
||||
# Build the compiled assets
|
||||
node_modules/.bin/parcel build assets/index.html --no-cache --out-dir "$OUTDIR" --public-url "./" --detailed-report
|
||||
@@ -654,6 +654,504 @@ Object {
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile, version 16 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":start",
|
||||
"line": undefined,
|
||||
"name": "start",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4479,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":main",
|
||||
"line": undefined,
|
||||
"name": "main",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4475,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":delta()",
|
||||
"line": undefined,
|
||||
"name": "delta()",
|
||||
"selfWeight": 395,
|
||||
"totalWeight": 2000,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":alpha()",
|
||||
"line": undefined,
|
||||
"name": "alpha()",
|
||||
"selfWeight": 1574,
|
||||
"totalWeight": 1600,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":leakMemory()",
|
||||
"line": undefined,
|
||||
"name": "leakMemory()",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 65,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":szone_malloc_should_clear",
|
||||
"line": undefined,
|
||||
"name": "szone_malloc_should_clear",
|
||||
"selfWeight": 7,
|
||||
"totalWeight": 49,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":small_malloc_should_clear",
|
||||
"line": undefined,
|
||||
"name": "small_malloc_should_clear",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 44,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":small_malloc_from_free_list",
|
||||
"line": undefined,
|
||||
"name": "small_malloc_from_free_list",
|
||||
"selfWeight": 20,
|
||||
"totalWeight": 20,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_malloc_zone_malloc",
|
||||
"line": undefined,
|
||||
"name": "_malloc_zone_malloc",
|
||||
"selfWeight": 14,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":beta()",
|
||||
"line": undefined,
|
||||
"name": "beta()",
|
||||
"selfWeight": 1602,
|
||||
"totalWeight": 1629,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":rack_get_thread_index",
|
||||
"line": undefined,
|
||||
"name": "rack_get_thread_index",
|
||||
"selfWeight": 6,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":nanov2_malloc_type",
|
||||
"line": undefined,
|
||||
"name": "nanov2_malloc_type",
|
||||
"selfWeight": 6,
|
||||
"totalWeight": 6,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":DYLD-STUB$$malloc",
|
||||
"line": undefined,
|
||||
"name": "DYLD-STUB$$malloc",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":mvm_allocate_pages_plat",
|
||||
"line": undefined,
|
||||
"name": "mvm_allocate_pages_plat",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_kernelrpc_mach_vm_map_trap",
|
||||
"line": undefined,
|
||||
"name": "_kernelrpc_mach_vm_map_trap",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":gamma()",
|
||||
"line": undefined,
|
||||
"name": "gamma()",
|
||||
"selfWeight": 827,
|
||||
"totalWeight": 838,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::start(dyld4::KernelArgs*, void*, void*)::$_0::operator()() const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::start(dyld4::KernelArgs*, void*, void*)::$_0::operator()() const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::prepare(dyld4::APIs&, dyld3::MachOAnalyzer const*)",
|
||||
"line": undefined,
|
||||
"name": "dyld4::prepare(dyld4::APIs&, dyld3::MachOAnalyzer const*)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 4,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&)",
|
||||
"line": undefined,
|
||||
"name": "dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const",
|
||||
"line": undefined,
|
||||
"name": "mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":mach_o::Header::forEachLoadCommand(void (load_command const*, bool&) block_pointer) const",
|
||||
"line": undefined,
|
||||
"name": "mach_o::Header::forEachLoadCommand(void (load_command const*, bool&) block_pointer) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":invocation function for block in mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const",
|
||||
"line": undefined,
|
||||
"name": "invocation function for block in mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":invocation function for block in dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&)",
|
||||
"line": undefined,
|
||||
"name": "invocation function for block in dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&)",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::forEachPath(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer)",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::forEachPath(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::ProcessConfig::PathOverrides::forEachPathVariant(char const*, dyld3::Platform, bool, bool, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::ProcessConfig::PathOverrides::forEachPathVariant(char const*, dyld3::Platform, bool, bool, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::forEachResolvedAtPathVar(dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, dyld4::ProcessConfig::PathOverrides::Type, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer)",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::forEachResolvedAtPathVar(dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, dyld4::ProcessConfig::PathOverrides::Type, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":invocation function for block in dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&)",
|
||||
"line": undefined,
|
||||
"name": "invocation function for block in dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::makeDyldCacheLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, unsigned int, mach_o::Layout const*)",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::makeDyldCacheLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, unsigned int, mach_o::Layout const*)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::RuntimeState::findPrebuiltLoader(char const*) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::RuntimeState::findPrebuiltLoader(char const*) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::PrebuiltLoader::isValid(dyld4::RuntimeState const&) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::PrebuiltLoader::isValid(dyld4::RuntimeState const&) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":invocation function for block in dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const",
|
||||
"line": undefined,
|
||||
"name": "invocation function for block in dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::SyscallDelegate::fileExists(char const*, dyld4::FileID*, int*) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::SyscallDelegate::fileExists(char const*, dyld4::FileID*, int*) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld3::stat(char const*, stat*)",
|
||||
"line": undefined,
|
||||
"name": "dyld3::stat(char const*, stat*)",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":stat",
|
||||
"line": undefined,
|
||||
"name": "stat",
|
||||
"selfWeight": 3,
|
||||
"totalWeight": 3,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::APIs::runAllInitializersForMain()",
|
||||
"line": undefined,
|
||||
"name": "dyld4::APIs::runAllInitializersForMain()",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const::$_0::operator()() const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const::$_0::operator()() const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::PrebuiltLoader::runInitializers(dyld4::RuntimeState&) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::PrebuiltLoader::runInitializers(dyld4::RuntimeState&) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const",
|
||||
"line": undefined,
|
||||
"name": "dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const",
|
||||
"line": undefined,
|
||||
"name": "dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const",
|
||||
"line": undefined,
|
||||
"name": "dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":dyld3::MachOFile::forEachLoadCommand(Diagnostics&, void (load_command const*, bool&) block_pointer) const",
|
||||
"line": undefined,
|
||||
"name": "dyld3::MachOFile::forEachLoadCommand(Diagnostics&, void (load_command const*, bool&) block_pointer) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":invocation function for block in dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const",
|
||||
"line": undefined,
|
||||
"name": "invocation function for block in dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":invocation function for block in dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const",
|
||||
"line": undefined,
|
||||
"name": "invocation function for block in dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const",
|
||||
"selfWeight": 0,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
Frame {
|
||||
"col": undefined,
|
||||
"file": undefined,
|
||||
"key": ":_GLOBAL__sub_I_stdlib_typed_new.cpp",
|
||||
"line": undefined,
|
||||
"name": "_GLOBAL__sub_I_stdlib_typed_new.cpp",
|
||||
"selfWeight": 1,
|
||||
"totalWeight": 1,
|
||||
},
|
||||
],
|
||||
"name": "simple-time-profile-deep-copy.txt",
|
||||
"stacks": Array [
|
||||
"start;main;delta();alpha();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;small_malloc_from_free_list 2.00ms",
|
||||
"start;main;delta();alpha();leakMemory();szone_malloc_should_clear;small_malloc_should_clear 4.00ms",
|
||||
"start;main;delta();alpha();leakMemory();szone_malloc_should_clear;small_malloc_from_free_list 1.00ms",
|
||||
"start;main;delta();alpha();leakMemory();szone_malloc_should_clear 1.00ms",
|
||||
"start;main;delta();alpha();leakMemory();_malloc_zone_malloc 1.00ms",
|
||||
"start;main;delta();alpha();_malloc_zone_malloc 2.00ms",
|
||||
"start;main;delta();alpha() 786.00ms",
|
||||
"start;main;delta();beta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;small_malloc_from_free_list 5.00ms",
|
||||
"start;main;delta();beta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;rack_get_thread_index 1.00ms",
|
||||
"start;main;delta();beta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear 3.00ms",
|
||||
"start;main;delta();beta();leakMemory();szone_malloc_should_clear 2.00ms",
|
||||
"start;main;delta();beta();leakMemory();nanov2_malloc_type 1.00ms",
|
||||
"start;main;delta();beta();leakMemory();DYLD-STUB$$malloc 1.00ms",
|
||||
"start;main;delta();beta();leakMemory() 1.00ms",
|
||||
"start;main;delta();beta();nanov2_malloc_type 2.00ms",
|
||||
"start;main;delta();beta();_malloc_zone_malloc 1.00ms",
|
||||
"start;main;delta();beta() 778.00ms",
|
||||
"start;main;delta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;mvm_allocate_pages_plat;_kernelrpc_mach_vm_map_trap 1.00ms",
|
||||
"start;main;delta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear 3.00ms",
|
||||
"start;main;delta();leakMemory();szone_malloc_should_clear 3.00ms",
|
||||
"start;main;delta();leakMemory();small_malloc_should_clear 2.00ms",
|
||||
"start;main;delta();leakMemory();_malloc_zone_malloc 1.00ms",
|
||||
"start;main;delta();_malloc_zone_malloc 3.00ms",
|
||||
"start;main;delta() 395.00ms",
|
||||
"start;main;gamma();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;small_malloc_from_free_list 3.00ms",
|
||||
"start;main;gamma();leakMemory();szone_malloc_should_clear;small_malloc_should_clear 1.00ms",
|
||||
"start;main;gamma();leakMemory();szone_malloc_should_clear;rack_get_thread_index 1.00ms",
|
||||
"start;main;gamma();leakMemory();small_malloc_should_clear 1.00ms",
|
||||
"start;main;gamma();leakMemory();_malloc_zone_malloc 1.00ms",
|
||||
"start;main;gamma();leakMemory();nanov2_malloc_type 1.00ms",
|
||||
"start;main;gamma();leakMemory() 1.00ms",
|
||||
"start;main;gamma();_malloc_zone_malloc 2.00ms",
|
||||
"start;main;gamma() 827.00ms",
|
||||
"start;main;beta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;small_malloc_from_free_list 4.00ms",
|
||||
"start;main;beta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;rack_get_thread_index 1.00ms",
|
||||
"start;main;beta();leakMemory();szone_malloc_should_clear;small_malloc_should_clear 1.00ms",
|
||||
"start;main;beta();leakMemory();szone_malloc_should_clear;rack_get_thread_index 1.00ms",
|
||||
"start;main;beta();leakMemory();nanov2_malloc_type 1.00ms",
|
||||
"start;main;beta();leakMemory();small_malloc_should_clear 1.00ms",
|
||||
"start;main;beta();_malloc_zone_malloc 1.00ms",
|
||||
"start;main;beta() 824.00ms",
|
||||
"start;main;alpha();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;small_malloc_from_free_list 5.00ms",
|
||||
"start;main;alpha();leakMemory();szone_malloc_should_clear;small_malloc_should_clear;rack_get_thread_index 2.00ms",
|
||||
"start;main;alpha();leakMemory();szone_malloc_should_clear;small_malloc_should_clear 3.00ms",
|
||||
"start;main;alpha();leakMemory();szone_malloc_should_clear 1.00ms",
|
||||
"start;main;alpha();leakMemory();nanov2_malloc_type 1.00ms",
|
||||
"start;main;alpha();leakMemory();small_malloc_should_clear 1.00ms",
|
||||
"start;main;alpha();leakMemory();_malloc_zone_malloc 1.00ms",
|
||||
"start;main;alpha();_malloc_zone_malloc 1.00ms",
|
||||
"start;main;alpha() 788.00ms",
|
||||
"start;dyld4::start(dyld4::KernelArgs*, void*, void*)::$_0::operator()() const;dyld4::prepare(dyld4::APIs&, dyld3::MachOAnalyzer const*);dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&);mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const;mach_o::Header::forEachLoadCommand(void (load_command const*, bool&) block_pointer) const;invocation function for block in mach_o::Header::forEachLinkedDylib(void (char const*, mach_o::LinkedDylibAttributes, mach_o::Version32, mach_o::Version32, bool&) block_pointer) const;invocation function for block in dyld4::JustInTimeLoader::loadDependents(Diagnostics&, dyld4::RuntimeState&, dyld4::Loader::LoadOptions const&);dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&);dyld4::Loader::forEachPath(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer);dyld4::ProcessConfig::PathOverrides::forEachPathVariant(char const*, dyld3::Platform, bool, bool, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer) const;dyld4::Loader::forEachResolvedAtPathVar(dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, dyld4::ProcessConfig::PathOverrides::Type, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer);invocation function for block in dyld4::Loader::getLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&);dyld4::Loader::makeDyldCacheLoader(Diagnostics&, dyld4::RuntimeState&, char const*, dyld4::Loader::LoadOptions const&, unsigned int, mach_o::Layout const*);dyld4::RuntimeState::findPrebuiltLoader(char const*) const;dyld4::PrebuiltLoader::isValid(dyld4::RuntimeState const&) const;dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const;dyld4::ProcessConfig::PathOverrides::forEachPathVariant(char const*, dyld3::Platform, bool, bool, bool&, void (char const*, dyld4::ProcessConfig::PathOverrides::Type, bool&) block_pointer) const;invocation function for block in dyld4::PrebuiltLoader::invalidateInIsolation(dyld4::RuntimeState const&) const;dyld4::SyscallDelegate::fileExists(char const*, dyld4::FileID*, int*) const;dyld3::stat(char const*, stat*);stat 3.00ms",
|
||||
"start;dyld4::start(dyld4::KernelArgs*, void*, void*)::$_0::operator()() const;dyld4::prepare(dyld4::APIs&, dyld3::MachOAnalyzer const*);dyld4::APIs::runAllInitializersForMain();dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const;dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const::$_0::operator()() const;dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const;dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const;dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&, dyld3::Array<dyld4::Loader const*>&) const;dyld4::PrebuiltLoader::runInitializers(dyld4::RuntimeState&) const;dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const;dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const;dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const;dyld3::MachOFile::forEachLoadCommand(Diagnostics&, void (load_command const*, bool&) block_pointer) const;invocation function for block in dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const;invocation function for block in dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const;_GLOBAL__sub_I_stdlib_typed_new.cpp 1.00ms",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile, version 16: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile, version 16: profileGroup.name 1`] = `"simple-time-profile-deep-copy.txt"`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importFromInstrumentsDeepCopy time profile: profileGroup.name 1`] = `"simple-time-profile-deep-copy.txt"`;
|
||||
|
||||
@@ -404,6 +404,41 @@ 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 hermes profile with multiple frames 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
Frame {
|
||||
"col": null,
|
||||
"file": null,
|
||||
"key": "[root]:null:null:null",
|
||||
"line": null,
|
||||
"name": "[root]",
|
||||
"selfWeight": 2,
|
||||
"totalWeight": 14,
|
||||
},
|
||||
Frame {
|
||||
"col": 12,
|
||||
"file": "/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"key": "beta:/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js:54:12",
|
||||
"line": 54,
|
||||
"name": "beta",
|
||||
"selfWeight": 12,
|
||||
"totalWeight": 12,
|
||||
},
|
||||
],
|
||||
"name": "pid 0, tid 0",
|
||||
"stacks": Array [
|
||||
"[root] 1.00µs",
|
||||
"[root];beta 12.00µs",
|
||||
"[root] 1.00µs",
|
||||
],
|
||||
}
|
||||
`;
|
||||
|
||||
exports[`importTraceEvents hermes profile with multiple frames: indexToView 1`] = `0`;
|
||||
|
||||
exports[`importTraceEvents hermes profile with multiple frames: profileGroup.name 1`] = `"simple-hermes.json"`;
|
||||
|
||||
exports[`importTraceEvents invalid x nesting 1`] = `
|
||||
Object {
|
||||
"frames": Array [
|
||||
@@ -1321,7 +1356,7 @@ Object {
|
||||
Frame {
|
||||
"col": null,
|
||||
"file": null,
|
||||
"key": "[root] {\\"name\\":\\"[root]\\",\\"category\\":\\"root\\",\\"url\\":null,\\"line\\":null,\\"column\\":null,\\"params\\":null,\\"allocatedCategory\\":\\"root\\",\\"allocatedName\\":\\"[root]\\"}",
|
||||
"key": "[root]:null:null:null",
|
||||
"line": null,
|
||||
"name": "[root]",
|
||||
"selfWeight": 2,
|
||||
@@ -1330,7 +1365,7 @@ Object {
|
||||
Frame {
|
||||
"col": 12,
|
||||
"file": "/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js",
|
||||
"key": "beta {\\"line\\":54,\\"column\\":12,\\"funcLine\\":\\"1\\",\\"funcColumn\\":\\"1\\",\\"name\\":\\"beta\\",\\"category\\":\\"JavaScript\\",\\"parent\\":1,\\"url\\":\\"/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js\\",\\"params\\":null,\\"allocatedCategory\\":\\"JavaScript\\",\\"allocatedName\\":\\"beta\\"}",
|
||||
"key": "beta:/Users/example/test_project/node_modules/metro-runtime/src/polyfills/require.js:54:12",
|
||||
"line": 54,
|
||||
"name": "beta",
|
||||
"selfWeight": 12,
|
||||
|
||||
@@ -12,6 +12,12 @@ describe('importFromInstrumentsDeepCopy', () => {
|
||||
)
|
||||
})
|
||||
|
||||
test('time profile, version 16', async () => {
|
||||
await checkProfileSnapshot(
|
||||
'./sample/profiles/Instruments/16.0/simple-time-profile-deep-copy.txt',
|
||||
)
|
||||
})
|
||||
|
||||
test('allocations profile', async () => {
|
||||
await checkProfileSnapshot(
|
||||
'./sample/profiles/Instruments/7.3.1/random-allocations-deep-copy.txt',
|
||||
|
||||
@@ -38,12 +38,14 @@ interface PastedTimeProfileRow {
|
||||
Weight?: string
|
||||
'Source Path'?: string
|
||||
'Symbol Name'?: string
|
||||
'Symbol Names'?: string
|
||||
}
|
||||
|
||||
interface PastedAllocationsProfileRow {
|
||||
'Bytes Used'?: string
|
||||
'Source Path'?: string
|
||||
'Symbol Name'?: string
|
||||
'Symbol Names'?: string
|
||||
}
|
||||
|
||||
interface FrameInfoWithWeight extends FrameInfo {
|
||||
@@ -108,9 +110,12 @@ export function importFromInstrumentsDeepCopy(contents: TextFileContent): Profil
|
||||
|
||||
const stack: FrameInfoWithWeight[] = []
|
||||
let cumulativeValue: number = 0
|
||||
let leadingFirstRowSpaces: number = rows[0]['Symbol Names']
|
||||
? rows[0]['Symbol Names'].lastIndexOf(' ') + 1
|
||||
: 0
|
||||
|
||||
for (let row of rows) {
|
||||
const symbolName = row['Symbol Name']
|
||||
const symbolName = row['Symbol Name'] || row['Symbol Names']?.slice(leadingFirstRowSpaces)
|
||||
if (!symbolName) continue
|
||||
const trimmedSymbolName = symbolName.trim()
|
||||
let stackDepth = symbolName.length - trimmedSymbolName.length
|
||||
|
||||
@@ -127,6 +127,10 @@ test('importTraceEvents simple hermes profile', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/trace-event/simple-hermes.json')
|
||||
})
|
||||
|
||||
test('importTraceEvents hermes profile with multiple frames', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/trace-event/simple-hermes.json')
|
||||
})
|
||||
|
||||
test('importTraceEvents simple profile with samples', async () => {
|
||||
await checkProfileSnapshot('./sample/profiles/trace-event/simple-with-samples.json')
|
||||
})
|
||||
|
||||
+61
-29
@@ -185,7 +185,7 @@ function selectQueueToTakeFromNext(
|
||||
// to ensure it opens before we try to close it.
|
||||
//
|
||||
// Otherwise, process the 'E' queue first.
|
||||
return keyForEvent(bFront) === keyForEvent(eFront) ? 'B' : 'E'
|
||||
return getEventId(bFront) === getEventId(eFront) ? 'B' : 'E'
|
||||
}
|
||||
|
||||
function convertToEventQueues(events: ImportableTraceEvent[]): [BTraceEvent[], ETraceEvent[]] {
|
||||
@@ -309,7 +309,13 @@ function getEventName(event: TraceEvent): string {
|
||||
return `${event.name || '(unnamed)'}`
|
||||
}
|
||||
|
||||
function keyForEvent(event: TraceEvent): string {
|
||||
/**
|
||||
* Attempt to construct a unique identifier for an event. Note that this
|
||||
* is different from the frame key, as in some cases we don't want to include
|
||||
* some arguments to allow from frame grouping (e.g. parent in the case of
|
||||
* hermes profiles)
|
||||
*/
|
||||
function getEventId(event: TraceEvent): string {
|
||||
let key = getEventName(event)
|
||||
if (event.args) {
|
||||
key += ` ${JSON.stringify(event.args)}`
|
||||
@@ -321,34 +327,72 @@ function frameInfoForEvent(
|
||||
event: TraceEvent,
|
||||
exporterSource: ExporterSource = ExporterSource.UNKNOWN,
|
||||
): FrameInfo {
|
||||
const key = keyForEvent(event)
|
||||
|
||||
// In Hermes profiles we have additional guaranteed metadata we can use to
|
||||
// more accurately populate profiles with info such as line + col number
|
||||
if (exporterSource === ExporterSource.HERMES) {
|
||||
const hermesFrameKey = `${event.name}:${event.args.url}:${event.args.line}:${event.args.column}`
|
||||
|
||||
return {
|
||||
name: getEventName(event),
|
||||
key: key,
|
||||
key: hermesFrameKey,
|
||||
file: event.args.url,
|
||||
line: event.args.line,
|
||||
col: event.args.column,
|
||||
}
|
||||
}
|
||||
|
||||
const key = getEventId(event)
|
||||
|
||||
return {
|
||||
name: key,
|
||||
key: key,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an array mapping pid-tid keys to profile builders. Both the traceEvent[]
|
||||
* format and the sample + stack frame based object format specify the process and thread
|
||||
* names based on metadata so we share this logic.
|
||||
*
|
||||
* See https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview#heading=h.xqopa5m0e28f
|
||||
*/
|
||||
function getProfileNameByPidTid(
|
||||
function getProfileName(
|
||||
processName: string | undefined,
|
||||
threadName: string | undefined,
|
||||
pid: number,
|
||||
tid: number,
|
||||
): string {
|
||||
if (processName != null && threadName != null) {
|
||||
return `${processName} (pid ${pid}), ${threadName} (tid ${tid})`
|
||||
} else if (processName != null) {
|
||||
return `${processName} (pid ${pid}, tid ${tid})`
|
||||
} else if (threadName != null) {
|
||||
return `${threadName} (pid ${pid}, tid ${tid})`
|
||||
} else {
|
||||
return `pid ${pid}, tid ${tid}`
|
||||
}
|
||||
}
|
||||
|
||||
function getProfileNamesFromSamples(
|
||||
events: TraceEvent[],
|
||||
partitionedSamples: Map<string, Sample[]>,
|
||||
): Map<string, string> {
|
||||
const processNamesByPid = getProcessNamesByPid(events)
|
||||
const threadNamesByPidTid = getThreadNamesByPidTid(events)
|
||||
|
||||
const profileNamesByPidTid = new Map<string, string>()
|
||||
|
||||
partitionedSamples.forEach(samples => {
|
||||
if (samples.length === 0) return
|
||||
|
||||
const pid = Number(samples[0].pid)
|
||||
const tid = Number(samples[0].tid)
|
||||
|
||||
const profileKey = pidTidKey(pid, tid)
|
||||
const processName = processNamesByPid.get(pid)
|
||||
const threadName = threadNamesByPidTid.get(profileKey)
|
||||
const profileName = getProfileName(processName, threadName, pid, tid)
|
||||
|
||||
profileNamesByPidTid.set(profileKey, profileName)
|
||||
})
|
||||
|
||||
return profileNamesByPidTid
|
||||
}
|
||||
|
||||
function getProfileNamesFromTraceEvents(
|
||||
events: TraceEvent[],
|
||||
partitionedTraceEvents: Map<string, TraceEvent[]>,
|
||||
): Map<string, string> {
|
||||
@@ -365,19 +409,9 @@ function getProfileNameByPidTid(
|
||||
const profileKey = pidTidKey(pid, tid)
|
||||
const processName = processNamesByPid.get(pid)
|
||||
const threadName = threadNamesByPidTid.get(profileKey)
|
||||
const profileName = getProfileName(processName, threadName, pid, tid)
|
||||
|
||||
if (processName != null && threadName != null) {
|
||||
profileNamesByPidTid.set(
|
||||
profileKey,
|
||||
`${processName} (pid ${pid}), ${threadName} (tid ${tid})`,
|
||||
)
|
||||
} else if (processName != null) {
|
||||
profileNamesByPidTid.set(profileKey, `${processName} (pid ${pid}, tid ${tid})`)
|
||||
} else if (threadName != null) {
|
||||
profileNamesByPidTid.set(profileKey, `${threadName} (pid ${pid}, tid ${tid})`)
|
||||
} else {
|
||||
profileNamesByPidTid.set(profileKey, `pid ${pid}, tid ${tid}`)
|
||||
}
|
||||
profileNamesByPidTid.set(profileKey, profileName)
|
||||
})
|
||||
|
||||
return profileNamesByPidTid
|
||||
@@ -608,7 +642,7 @@ function eventListToProfileGroup(
|
||||
): ProfileGroup {
|
||||
const importableEvents = filterIgnoredEventTypes(events)
|
||||
const partitionedTraceEvents = partitionByPidTid(importableEvents)
|
||||
const profileNamesByPidTid = getProfileNameByPidTid(events, partitionedTraceEvents)
|
||||
const profileNamesByPidTid = getProfileNamesFromTraceEvents(events, partitionedTraceEvents)
|
||||
|
||||
const profilePairs: [string, Profile][] = []
|
||||
|
||||
@@ -639,10 +673,8 @@ function eventListToProfileGroup(
|
||||
}
|
||||
|
||||
function sampleListToProfileGroup(contents: TraceWithSamples): ProfileGroup {
|
||||
const importableEvents = filterIgnoredEventTypes(contents.traceEvents)
|
||||
const partitionedTraceEvents = partitionByPidTid(importableEvents)
|
||||
const partitionedSamples = partitionByPidTid(contents.samples)
|
||||
const profileNamesByPidTid = getProfileNameByPidTid(contents.traceEvents, partitionedTraceEvents)
|
||||
const profileNamesByPidTid = getProfileNamesFromSamples(contents.traceEvents, partitionedSamples)
|
||||
|
||||
const profilePairs: [string, Profile][] = []
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ export namespace FileFormat {
|
||||
unit: ValueUnit
|
||||
|
||||
// The starting value of the profile. This will typically be a timestamp.
|
||||
// All event values will be relative to this startValue.
|
||||
// All event values will be displayed relative to this startValue.
|
||||
startValue: number
|
||||
|
||||
// The final value of the profile. This will typically be a timestamp. This
|
||||
@@ -93,7 +93,7 @@ export namespace FileFormat {
|
||||
unit: ValueUnit
|
||||
|
||||
// The starting value of the profile. This will typically be a timestamp.
|
||||
// All event values will be relative to this startValue.
|
||||
// All event values will be displayed relative to this startValue.
|
||||
startValue: number
|
||||
|
||||
// The final value of the profile. This will typically be a timestamp. This
|
||||
|
||||
@@ -168,6 +168,7 @@ export type ApplicationProps = {
|
||||
|
||||
export class Application extends StatelessComponent<ApplicationProps> {
|
||||
private async loadProfile(loader: () => Promise<ProfileGroup | null>) {
|
||||
this.props.setError(false)
|
||||
this.props.setLoading(true)
|
||||
await new Promise(resolve => setTimeout(resolve, 0))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user