profile-viewer 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/dist/022efb839d22fa54a716.svg +28 -0
- data/dist/0c510afd6169a0a83f97.svg +14 -0
- data/dist/0d5cf282780cd1a5ec64.svg +8 -0
- data/dist/119.cc58ce313e67f80f50f3.bundle.js +2 -0
- data/dist/119.cc58ce313e67f80f50f3.bundle.js.map +1 -0
- data/dist/11c5dca6d97c9e10e5b7.svg +9 -0
- data/dist/131.c21d348572deab4ece66.bundle.js +2 -0
- data/dist/131.c21d348572deab4ece66.bundle.js.map +1 -0
- data/dist/18e7fdd45099134897d2.svg +8 -0
- data/dist/2d4b477bc424d35a0245.svg +25 -0
- data/dist/2e43ad991eb141fc017f.svg +9 -0
- data/dist/2ea5b50b7361e6de561c.svg +11 -0
- data/dist/308.4d236ce7e6451807cb54.bundle.js +2 -0
- data/dist/308.4d236ce7e6451807cb54.bundle.js.map +1 -0
- data/dist/31fe933f3a12be1aa7f3.svg +4 -0
- data/dist/390aa266f451c1005f61.svg +10 -0
- data/dist/3c3fda7c08bcc9544c64.svg +6 -0
- data/dist/4260d5db8309a6f83637.svg +10 -0
- data/dist/4536fd0738f36c3463bc.svg +1 -0
- data/dist/490065792b7e903c9f3e.svg +6 -0
- data/dist/49da6a2153f62ef73d17.svg +7 -0
- data/dist/4d26f0e38c22eedde178.jpg +0 -0
- data/dist/4ecb077d8715f89c0f87.svg +13 -0
- data/dist/524e896f487119a0b832.svg +13 -0
- data/dist/58c5415e952fb6dddd6b.png +0 -0
- data/dist/6bd0589a27236471fdab.svg +4 -0
- data/dist/6c6b49af3a86dfdd44e6.svg +4 -0
- data/dist/6c8063be3afa1d95c902.svg +3 -0
- data/dist/71730566d6c47ffdc965.svg +12 -0
- data/dist/7273fadce89da05535e5.svg +4 -0
- data/dist/731673c749e57bf6f544.svg +13 -0
- data/dist/76e5b29823c9fd62d90d.svg +3 -0
- data/dist/7853c71223701f30d495.svg +19 -0
- data/dist/79856ce399cb305fafb8.svg +19 -0
- data/dist/79eaad4fc0c398100809.svg +6 -0
- data/dist/7c7ac3c7df370340cfd2.svg +7 -0
- data/dist/7e3ac9afb25cfe809520.svg +1 -0
- data/dist/81762b0b1aacd3686a6b.svg +12 -0
- data/dist/86e81402ef76d28ff55f.svg +15 -0
- data/dist/8aae7b979b04407f71a4.svg +3 -0
- data/dist/8b8b909e42722172d494.svg +7 -0
- data/dist/8dab2a6ba757bcc6e9a5.svg +3 -0
- data/dist/9.071a712ea648c8b30416.bundle.js +2 -0
- data/dist/9.071a712ea648c8b30416.bundle.js.map +1 -0
- data/dist/9103e94f1d34c15d44be.svg +6 -0
- data/dist/914.b9bc213d93173ce6b0cb.bundle.js +2 -0
- data/dist/914.b9bc213d93173ce6b0cb.bundle.js.map +1 -0
- data/dist/9a7bd6ec36312a2baa7e.svg +1 -0
- data/dist/9d858d1a3ab57f8ee2e1.svg +4 -0
- data/dist/9eb1fab2684d1e1f0e26.svg +13 -0
- data/dist/_headers +37 -0
- data/dist/_redirects +2 -0
- data/dist/a3196e840709b18a3119.svg +1 -0
- data/dist/aa867391c311267af5a9.svg +4 -0
- data/dist/acb8393f3fb9c59b15c9.svg +20 -0
- data/dist/ad13da76642d8099fe70.module.wasm +0 -0
- data/dist/b45b29da558efa211628.jpg +0 -0
- data/dist/b5698a02eef37ce29146.svg +10 -0
- data/dist/b805360fcc91834556c9.svg +4 -0
- data/dist/before-load.js +1 -0
- data/dist/c3432220f657733ed05f.svg +10 -0
- data/dist/ca2af827049e9039ef9c.svg +8 -0
- data/dist/contribute.json +37 -0
- data/dist/d09537c705fb0878eb63.svg +4 -0
- data/dist/d9c199b3e3e469cc5713.svg +10 -0
- data/dist/da1f21c60c7217745dd8.svg +1 -0
- data/dist/docs/README.md +7 -0
- data/dist/docs/_navbar.md +3 -0
- data/dist/docs/_sidebar.md +27 -0
- data/dist/docs/advanced-topics.md +9 -0
- data/dist/docs/bunny-2.md +78 -0
- data/dist/docs/bunny.md +281 -0
- data/dist/docs/case-studies.md +5 -0
- data/dist/docs/css/style-overrides.css +160 -0
- data/dist/docs/css/vue_v4.12.2.min.css +858 -0
- data/dist/docs/gitpod.md +39 -0
- data/dist/docs/guide-android-profiling.md +46 -0
- data/dist/docs/guide-filtering-call-trees.md +87 -0
- data/dist/docs/guide-getting-started.md +115 -0
- data/dist/docs/guide-perf-profiling.md +76 -0
- data/dist/docs/guide-profiler-fundamentals.md +33 -0
- data/dist/docs/guide-profiling-android-directly-on-device.md +34 -0
- data/dist/docs/guide-profiling-firefox-android.md +7 -0
- data/dist/docs/guide-remote-profiling.md +90 -0
- data/dist/docs/guide-removing-profiler.md +4 -0
- data/dist/docs/guide-stack-samples-and-call-trees.md +57 -0
- data/dist/docs/guide-startup-shutdown.md +108 -0
- data/dist/docs/guide-ui-tour-panels.md +95 -0
- data/dist/docs/guide-ui-tour-timeline.md +76 -0
- data/dist/docs/images/about-debugging-remote-profiling-panel.png +0 -0
- data/dist/docs/images/about-debugging-remote.png +0 -0
- data/dist/docs/images/about-url.png +0 -0
- data/dist/docs/images/allocation-calltree-2019-12-11.png +0 -0
- data/dist/docs/images/allocation-feature.png +0 -0
- data/dist/docs/images/allocation-flame-graph-2019-12-11.png +0 -0
- data/dist/docs/images/allocation-js.png +0 -0
- data/dist/docs/images/allocation-track.png +0 -0
- data/dist/docs/images/bunny-analysis/bunny.png +0 -0
- data/dist/docs/images/bunny-analysis/clone-flame-content.png +0 -0
- data/dist/docs/images/bunny-analysis/clone-flame-worker.png +0 -0
- data/dist/docs/images/bunny-analysis/clone-thread-list.png +0 -0
- data/dist/docs/images/bunny-analysis/fillstyle-thread-list-measure.png +0 -0
- data/dist/docs/images/bunny-analysis/fillstyle-thread-list.png +0 -0
- data/dist/docs/images/bunny-analysis/flame-graph-content.png +0 -0
- data/dist/docs/images/bunny-analysis/flame-graph-set-fillstyle.png +0 -0
- data/dist/docs/images/bunny-analysis/flame-graph-worker.png +0 -0
- data/dist/docs/images/bunny-analysis/focus-subtree.png +0 -0
- data/dist/docs/images/bunny-analysis/threads-list-measure.png +0 -0
- data/dist/docs/images/bunny-analysis/threads-list.png +0 -0
- data/dist/docs/images/bunny-analysis/threads-parallel.png +0 -0
- data/dist/docs/images/bunny-analysis/threads-sync.png +0 -0
- data/dist/docs/images/bunny-analysis/threads-work-parallel.png +0 -0
- data/dist/docs/images/bunny-analysis/threads-work-sync.png +0 -0
- data/dist/docs/images/call-tree-running-time.svg +82 -0
- data/dist/docs/images/call-tree-self-time.svg +82 -0
- data/dist/docs/images/call-tree.svg +131 -0
- data/dist/docs/images/favicon.svg +4 -0
- data/dist/docs/images/filter-search.svg +78 -0
- data/dist/docs/images/getting-started-delete-profile.png +0 -0
- data/dist/docs/images/getting-started-devtools-panel.png +0 -0
- data/dist/docs/images/getting-started-enable-popup.png +0 -0
- data/dist/docs/images/getting-started-list-uploaded-profiles.png +0 -0
- data/dist/docs/images/getting-started-naming-profiles.png +0 -0
- data/dist/docs/images/getting-started-popup.png +0 -0
- data/dist/docs/images/getting-started-upload-permalink.webm +0 -0
- data/dist/docs/images/getting-started-upload.png +0 -0
- data/dist/docs/images/getting-started-use-icon.webm +0 -0
- data/dist/docs/images/getting-started-use-popup.webm +0 -0
- data/dist/docs/images/implementation-2022-06-16.png +0 -0
- data/dist/docs/images/implementation-filter.svg +101 -0
- data/dist/docs/images/interval-2020-05.png +0 -0
- data/dist/docs/images/invert-2022-06-16.png +0 -0
- data/dist/docs/images/invert-after.svg +161 -0
- data/dist/docs/images/invert-before.svg +144 -0
- data/dist/docs/images/invert-call-tree.svg +113 -0
- data/dist/docs/images/ipc-messages-feature.png +0 -0
- data/dist/docs/images/ipc-messages-io-threads.png +0 -0
- data/dist/docs/images/ipc-messages-popup.png +0 -0
- data/dist/docs/images/popup.png +0 -0
- data/dist/docs/images/qr-gve-nightly.gif +0 -0
- data/dist/docs/images/qr-reference-browser-nightly.gif +0 -0
- data/dist/docs/images/samples.svg +116 -0
- data/dist/docs/images/screenshot-2022-04-25.png +0 -0
- data/dist/docs/images/search-2022-06-16.png +0 -0
- data/dist/docs/images/secret-menu-toast.png +0 -0
- data/dist/docs/images/settings-menu.png +0 -0
- data/dist/docs/images/simple-call-tree-self-time.svg +41 -0
- data/dist/docs/images/simple-call-tree.svg +41 -0
- data/dist/docs/images/simple-stacks-self-time.svg +96 -0
- data/dist/docs/images/simple-stacks.svg +118 -0
- data/dist/docs/images/start-profiler.png +0 -0
- data/dist/docs/images/transform-collapse-direct-recursion.svg +47 -0
- data/dist/docs/images/transform-collapse-resource.svg +83 -0
- data/dist/docs/images/transform-focus-function.svg +81 -0
- data/dist/docs/images/transform-focus-node.svg +86 -0
- data/dist/docs/images/transform-merge-function.svg +95 -0
- data/dist/docs/images/transform-merge-node.svg +96 -0
- data/dist/docs/images/transforms-2022-06-16.png +0 -0
- data/dist/docs/images/ui-tour-activity-graph.png +0 -0
- data/dist/docs/images/ui-tour-panels-call-tree.png +0 -0
- data/dist/docs/images/ui-tour-panels-flame-graph.png +0 -0
- data/dist/docs/images/ui-tour-panels-marker-chart.png +0 -0
- data/dist/docs/images/ui-tour-panels-network-chart.png +0 -0
- data/dist/docs/images/ui-tour-panels-stack-chart.png +0 -0
- data/dist/docs/images/ui-tour-panels.png +0 -0
- data/dist/docs/images/ui-tour-ranges.png +0 -0
- data/dist/docs/images/ui-tour-selection.webm +0 -0
- data/dist/docs/images/ui-tour-timeline-markers.png +0 -0
- data/dist/docs/images/ui-tour-timeline-memory.png +0 -0
- data/dist/docs/images/ui-tour-timeline-network.png +0 -0
- data/dist/docs/images/ui-tour-timeline-screenshots.png +0 -0
- data/dist/docs/images/ui-tour-timeline-track-selection.png +0 -0
- data/dist/docs/images/ui-tour-timeline.png +0 -0
- data/dist/docs/index.html +21 -0
- data/dist/docs/ipc-messages.md +44 -0
- data/dist/docs/js/docsify_v4.12.2+.min.js +1 -0
- data/dist/docs/js/ga_v4.12.2.min.js +1 -0
- data/dist/docs/js/init.js +1 -0
- data/dist/docs/js/search_v4.12.2.min.js +1 -0
- data/dist/docs/memory-allocations.md +70 -0
- data/dist/docs/videos-call-tree-1.md +5 -0
- data/dist/docs/videos-call-tree-2.md +5 -0
- data/dist/docs/videos-call-tree-3.md +5 -0
- data/dist/docs/videos-intro.md +7 -0
- data/dist/docs/videos-samples-markers.md +5 -0
- data/dist/docs/videos-threads.md +5 -0
- data/dist/docs/videos.md +32 -0
- data/dist/e4ed50222911c5af9a32.svg +12 -0
- data/dist/e70722c0fe0ac3d4227b.svg +10 -0
- data/dist/f0599659345cf76717cd.svg +4 -0
- data/dist/f8e25c2ebeb0a0725a9e.svg +12 -0
- data/dist/favicon.png +0 -0
- data/dist/fcb532a05dd4b09c2d08.svg +10 -0
- data/dist/fd040fb5f4e7a515bb3c.svg +15 -0
- data/dist/index.html +1 -0
- data/dist/locales/README.md +26 -0
- data/dist/locales/be/app.ftl +1003 -0
- data/dist/locales/de/app.ftl +994 -0
- data/dist/locales/el/app.ftl +1013 -0
- data/dist/locales/en-GB/app.ftl +1018 -0
- data/dist/locales/en-US/app.ftl +1125 -0
- data/dist/locales/es-CL/app.ftl +948 -0
- data/dist/locales/fr/app.ftl +942 -0
- data/dist/locales/fy-NL/app.ftl +1018 -0
- data/dist/locales/ia/app.ftl +1007 -0
- data/dist/locales/it/app.ftl +936 -0
- data/dist/locales/kab/app.ftl +557 -0
- data/dist/locales/nl/app.ftl +1018 -0
- data/dist/locales/pt-BR/app.ftl +947 -0
- data/dist/locales/ru/app.ftl +1032 -0
- data/dist/locales/sv-SE/app.ftl +1013 -0
- data/dist/locales/uk/app.ftl +1019 -0
- data/dist/locales/zh-CN/app.ftl +931 -0
- data/dist/locales/zh-TW/app.ftl +930 -0
- data/dist/main.8208fda2d35ddbe38d55.bundle.js +199 -0
- data/dist/main.8208fda2d35ddbe38d55.bundle.js.LICENSE.txt +92 -0
- data/dist/main.8208fda2d35ddbe38d55.bundle.js.map +1 -0
- data/dist/photon/31fe933f3a12be1aa7f3.svg +4 -0
- data/dist/photon/49da6a2153f62ef73d17.svg +7 -0
- data/dist/photon/6bd0589a27236471fdab.svg +4 -0
- data/dist/photon/6c8063be3afa1d95c902.svg +3 -0
- data/dist/photon/76e5b29823c9fd62d90d.svg +3 -0
- data/dist/photon/8aae7b979b04407f71a4.svg +3 -0
- data/dist/photon/8dab2a6ba757bcc6e9a5.svg +3 -0
- data/dist/photon/9103e94f1d34c15d44be.svg +6 -0
- data/dist/photon/aa867391c311267af5a9.svg +4 -0
- data/dist/photon/f0599659345cf76717cd.svg +4 -0
- data/dist/photon/index.html +214 -0
- data/dist/photon/main.8c8260452e7439ec6df9.bundle.js +2 -0
- data/dist/photon/main.8c8260452e7439ec6df9.bundle.js.map +1 -0
- data/dist/service-worker-compat.js +1 -0
- data/dist/sw.js +2 -0
- data/dist/sw.js.map +1 -0
- data/dist/workbox-27b29e6f.js +2 -0
- data/dist/workbox-27b29e6f.js.map +1 -0
- data/dist/zee-worker.js +1 -0
- data/ruby-bin/profile-viewer +87 -0
- metadata +281 -0
@@ -0,0 +1,108 @@
|
|
1
|
+
# Profiling Firefox Startup & Shutdown
|
2
|
+
|
3
|
+
## Startup
|
4
|
+
|
5
|
+
Before starting, make sure the profiler's popup is already present. Otherwise
|
6
|
+
please go to https://profiler.firefox.com to add it first to your Firefox.
|
7
|
+
|
8
|
+
1. Start your Firefox with the environment variable `MOZ_PROFILER_STARTUP=1` set. This way, the profiler is started as early as possible during startup.
|
9
|
+
|
10
|
+
2. Then capture the profile using the popup, as usual.
|
11
|
+
|
12
|
+
Startup profiling does not use the settings that you configured in the `about:profiling`. It uses settings that can be configured with the environment variables `MOZ_PROFILER_STARTUP_ENTRIES`, `MOZ_PROFILER_STARTUP_INTERVAL`, and more:
|
13
|
+
|
14
|
+
* If it looks like the buffer is not large enough, you can tweak the buffer size with the env var `MOZ_PROFILER_STARTUP_ENTRIES`. This defaults to 1000000, which is 9MB. If you want 90MB, use 10000000, and for 180MB, use 20000000, which are good values to debug long startups.
|
15
|
+
|
16
|
+
* If you'd like a coarser resolution, you can also choose a different interval using `MOZ_PROFILER_STARTUP_INTERVAL`, which defaults to 1 (unit is millisecond). You can't go below 1 ms, but you can use e.g. 10 ms.
|
17
|
+
|
18
|
+
* More environment variables are available to control the profiler settings. They can be listed by setting `MOZ_PROFILER_HELP=1` and running Firefox from a command line inside a terminal; Firefox will exit immediately, and display all accepted variables in the terminal.
|
19
|
+
|
20
|
+
## Shutdown
|
21
|
+
|
22
|
+
1. Start your Firefox with the environment variable `MOZ_PROFILER_SHUTDOWN=<filename>` set, where `<filename>` is the name of the file where the recorded profile should be saved.
|
23
|
+
|
24
|
+
2. Start the profiler using the popup, then close Firefox.
|
25
|
+
|
26
|
+
3. The file you specified will contain the recorded profile. Load it through the [profiler.firefox.com](https://profiler.firefox.com) interface by either drag and drop or the file upload interface.
|
27
|
+
|
28
|
+
For startup profiling, similar to [startup profiling on Desktop](https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Profiling_with_the_Built-in_Profiler#Profiling_Firefox_Startup), you will need to manually set some `MOZ_PROFILER_STARTUP*` environment variables. The way to do this varies based on the app you want to profile (more details below). Once the app has been started with these environment variables, the profiler will be running. Then you can connect to the app using `about:debugging` as usual, and capture the profile with the regular UI.
|
29
|
+
|
30
|
+
|
31
|
+
## Firefox for Android
|
32
|
+
|
33
|
+
First, you'll need to use [the general information about profiling on Android](./guide-remote-profiling.md).
|
34
|
+
Then you can follow the additional instructions below.
|
35
|
+
|
36
|
+
### Startup profiling GeckoView-example (and Fennec)
|
37
|
+
|
38
|
+
If you have compiled GeckoView-example locally, you can launch it with `./mach run` and specify environment variables as follows:
|
39
|
+
|
40
|
+
```bash
|
41
|
+
./mach run --setenv MOZ_PROFILER_STARTUP=1 \
|
42
|
+
--setenv MOZ_PROFILER_STARTUP_INTERVAL=5 \
|
43
|
+
--setenv MOZ_PROFILER_STARTUP_FEATURES=threads,js,stackwalk,leaf,screenshots,ipcmessages,java \
|
44
|
+
--setenv MOZ_PROFILER_STARTUP_FILTERS="GeckoMain,Compositor,Renderer,IPDL Background"
|
45
|
+
```
|
46
|
+
|
47
|
+
Alternatively, if you have installed GeckoView-example from another source, you can launch it from the command line using `adb` with environment variables specified like this:
|
48
|
+
|
49
|
+
```bash
|
50
|
+
adb shell am start -n org.mozilla.geckoview_example/.App \
|
51
|
+
--es env0 MOZ_PROFILER_STARTUP=1 \
|
52
|
+
--es env1 MOZ_PROFILER_STARTUP_INTERVAL=5 \
|
53
|
+
--es env2 MOZ_PROFILER_STARTUP_FEATURES=threads,js,stackwalk,leaf,screenshots,ipcmessages,java \
|
54
|
+
--es env3 MOZ_PROFILER_STARTUP_FILTERS="GeckoMain,Compositor,Renderer,IPDL Background"
|
55
|
+
```
|
56
|
+
|
57
|
+
### Startup profiling Fenix
|
58
|
+
|
59
|
+
Fenix has a [different way](https://firefox-source-docs.mozilla.org/mobile/android/geckoview/consumer/automation.html#reading-configuration-from-a-file) to specify environment variables: it uses a yaml file.
|
60
|
+
|
61
|
+
The easiest way to set up startup profiling is to run the `<fenix-repo>/tools/setup-startup-profiling.py` script. For example:
|
62
|
+
```bash
|
63
|
+
./tools/setup-startup-profiling.py activate nightly # To activate startup profiling on nightly.
|
64
|
+
./tools/setup-startup-profiling.py deactivate beta # To deactivate startup profiling on beta.
|
65
|
+
```
|
66
|
+
|
67
|
+
If the app is uninstalled or the device is restarted, the `activate` command may need to be re-run. The script is hard-coded to use a default configuration file with default profiling arguments. If you wish to change these arguments or use a non-standard app ID, modify the script locally or read below.
|
68
|
+
|
69
|
+
If you don't want to check out [the fenix repository](https://github.com/mozilla-mobile/fenix/), you should be able to download [the script standalone](https://raw.githubusercontent.com/mozilla-mobile/fenix/master/tools/setup-startup-profiling.py) and execute it.
|
70
|
+
|
71
|
+
#### Manual configuration
|
72
|
+
|
73
|
+
The filename of the YAML file mentioned above depends on the bundle ID of your Fenix app. The instructions below assume you want to profile the Fenix Nightly app, with the bundle ID `org.mozilla.fenix`.
|
74
|
+
|
75
|
+
1. Create a file with the name `org.mozilla.fenix-geckoview-config.yaml` on your desktop machine and content of the following form:
|
76
|
+
|
77
|
+
```
|
78
|
+
env:
|
79
|
+
MOZ_PROFILER_STARTUP: 1
|
80
|
+
MOZ_PROFILER_STARTUP_INTERVAL: 5
|
81
|
+
MOZ_PROFILER_STARTUP_FEATURES: threads,js,stackwalk,leaf,screenshots,ipcmessages,java
|
82
|
+
MOZ_PROFILER_STARTUP_FILTERS: GeckoMain,Compositor,Renderer,IPDL Background
|
83
|
+
```
|
84
|
+
2. Push this file to the device with `adb push org.mozilla.fenix-geckoview-config.yaml /data/local/tmp/`.
|
85
|
+
3. Run `adb shell am set-debug-app --persistent org.mozilla.fenix` to make sure the file is respected.
|
86
|
+
|
87
|
+
From now on, whenever you open the Fenix app, Gecko will be profiling itself automatically from the start, even if remote debugging is turned off. Then you can enable remote debugging, connect to the browser with `about:debugging`, and capture the profiling run.
|
88
|
+
|
89
|
+
You can delete the file again when you want to stop this behavior, e.g. using `adb shell rm /data/local/tmp/org.mozilla.fenix-geckoview-config.yaml`.
|
90
|
+
|
91
|
+
[Here's an example profile captured using this method](https://perfht.ml/3bKTFCG).
|
92
|
+
|
93
|
+
Refer to the [Reading configuration from a file](https://firefox-source-docs.mozilla.org/mobile/android/geckoview/consumer/automation.html#reading-configuration-from-a-file) section of the GeckoView docs for more details.
|
94
|
+
|
95
|
+
### Profiling App Link startup
|
96
|
+
|
97
|
+
Fenix can be launched with a URL as follows (assuming a debug Fenix build):
|
98
|
+
|
99
|
+
```
|
100
|
+
adb shell am start-activity -d "https://www.mozilla.org/" \
|
101
|
+
-a android.intent.action.VIEW org.mozilla.fenix.debug/org.mozilla.fenix.IntentReceiverActivity
|
102
|
+
```
|
103
|
+
|
104
|
+
When combined with the startup profiling `.yaml` file as described in the previous section, this allows profiling GeckoView during the App Link startup path. This is the scenario of a user opening a link from a different Android app in the default browser.
|
105
|
+
|
106
|
+
Startup from App Link is the most important GeckoView startup scenario. In this scenario, GeckoView startup is directly in the critical path between the user action (tapping the link) and the first useful result (the web page being shown on the screen). This is different from the scenario of launching Fenix from the home screen - in that case, Fenix can show meaningful content even before Gecko is initialized, so Gecko's startup time is not as crucial to the experience.
|
107
|
+
|
108
|
+
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# UI Tour
|
2
|
+
|
3
|
+
Get to know Firefox Profiler UI a bit better with a tour that highlights various features. The screenshots are all taken from [this profile](https://share.firefox.dev/3rRG46l).
|
4
|
+
|
5
|
+
## The panels
|
6
|
+
|
7
|
+
![A screenshot highlighting the panels on the lower half of the UI.](images/ui-tour-panels.png)
|
8
|
+
|
9
|
+
The timeline lists multiple threads, while the panels provide an analysis of the currently selected thread in the timeline. The panel only uses one thread at a time by default. However it's possible to merge several threads together by using the `Ctrl` keyboard key when clicking a thread.
|
10
|
+
|
11
|
+
## The Call Tree
|
12
|
+
|
13
|
+
![A screenshot of the call tree including the sidebar](images/ui-tour-panels-call-tree.png)
|
14
|
+
|
15
|
+
The Call Tree panels is a synthetic view of the sample data. The page about
|
16
|
+
[stack samples and call trees](guide-stack-samples-and-call-trees) explains well
|
17
|
+
how the call tree structure is computed from the sample data.
|
18
|
+
|
19
|
+
In short, by merging the common ancestors in stacks, we can find out
|
20
|
+
which parts of the program run more often.
|
21
|
+
|
22
|
+
The [filtering guide](guide-filtering-call-trees) gives some useful information
|
23
|
+
about how to work with this view: searching, filtering to javascript,
|
24
|
+
transforming, and inverting (also called bottom-up tree).
|
25
|
+
|
26
|
+
Finally the sidebar gives a breakdown of the categories of the code running
|
27
|
+
inside the selected function.
|
28
|
+
|
29
|
+
## The Flame Graph
|
30
|
+
|
31
|
+
![A screenshot of the flame graph](images/ui-tour-panels-flame-graph.png)
|
32
|
+
|
33
|
+
The Flame Graph provide a more visual view into the very same call tree
|
34
|
+
structures:
|
35
|
+
* Larger rectangles mean more running time.
|
36
|
+
* The rectangles at the top are the stacks contributing to the self time, that
|
37
|
+
is the code where the program actually spends time.
|
38
|
+
* The order is always the same, which makes it more convenient to compare
|
39
|
+
between different range selections, but also between different profiles.
|
40
|
+
|
41
|
+
Some users will prefer using the flame graph over the call tree because it's
|
42
|
+
much more visual.
|
43
|
+
|
44
|
+
## The Stack Chart
|
45
|
+
|
46
|
+
![A screenshot of the stack chart](images/ui-tour-panels-stack-chart.png)
|
47
|
+
|
48
|
+
The Stack Chart panel also shows the sample data, but this isn't a summary.
|
49
|
+
Instead it's a chronological view that is aligned with the timeline: as we can
|
50
|
+
see on the screenshot above, the same categories can be seen at the same
|
51
|
+
timestamps. Therefore this provides a different view into the same data than the
|
52
|
+
previous panels.
|
53
|
+
|
54
|
+
Be careful though: in this panel we try to rebuild the sequence of the function calls,
|
55
|
+
but because the sample data by nature can miss short events, the view could show
|
56
|
+
a long call where it's instead a sequence of short calls.
|
57
|
+
|
58
|
+
## The Marker Chart
|
59
|
+
|
60
|
+
![A screenshot of the marker chart](images/ui-tour-panels-marker-chart.png)
|
61
|
+
|
62
|
+
The Marker Chart is a chronological and visual representation of all markers
|
63
|
+
that happened during a profiling session. [As a reminder](./guide-profiler-fundamentals),
|
64
|
+
the marker data comes from source code instrumentation (C++, Rust, JavaScript,
|
65
|
+
Java).
|
66
|
+
|
67
|
+
By hovering on the markers it's possible to inspect their data. For example for
|
68
|
+
CSS animation markers, the element that the animation runs for is displayed.
|
69
|
+
|
70
|
+
Right clicking on a marker displays a context menu that allows interacting even
|
71
|
+
more with these pieces of information, such as copy their data.
|
72
|
+
|
73
|
+
Web Developers can add their own markers using [performance.mark](https://developer.mozilla.org/en-US/docs/Web/API/Performance/mark) and
|
74
|
+
[performance.measure](https://developer.mozilla.org/en-US/docs/Web/API/Performance/measure). Gecko Developers can look at [this comprehensive
|
75
|
+
documentation](https://firefox-source-docs.mozilla.org/tools/profiler/markers-guide.html) to add their new markers.
|
76
|
+
|
77
|
+
## The Marker Table
|
78
|
+
|
79
|
+
This panel provide a table view to the same data as the marker chart. Its
|
80
|
+
strength is that by searching it's possibly faster to display the payload
|
81
|
+
information for several markers at once.
|
82
|
+
|
83
|
+
## The Network Chart
|
84
|
+
|
85
|
+
![A screenshot of the network chart](images/ui-tour-panels-network-chart.png)
|
86
|
+
|
87
|
+
This panel shows all network requests happening during the capturing session.
|
88
|
+
Especially all the phases happening during a request are shown, and they are
|
89
|
+
even more detailed when hovering a line.
|
90
|
+
|
91
|
+
This panel is also chronologically aligned with the timeline, so that we can
|
92
|
+
relate network requests with it.
|
93
|
+
|
94
|
+
The network requests are also displayed in the marker chart as well as the
|
95
|
+
timeline.
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# UI Tour
|
2
|
+
|
3
|
+
Get to know Firefox Profiler UI a bit better with a tour that highlights various features. The screenshots are all taken from [this profile](https://share.firefox.dev/3rRG46l).
|
4
|
+
|
5
|
+
## Timeline
|
6
|
+
|
7
|
+
![A screenshot of the UI, selecting the top portion with threads.](images/ui-tour-timeline.png)
|
8
|
+
|
9
|
+
The Firefox Profiler visualizes multi-threaded profiles. Each thread gets a row in the timeline. Clicking on the name of the thread selects the thread for the selected panel below the timeline. Threads can be hidden and shown by right clicking the thread name.
|
10
|
+
|
11
|
+
## Creating a range selection
|
12
|
+
|
13
|
+
[A video highlighting a range selection in the timeline.](images/ui-tour-selection.webm ':include :type=video controls width=100%')
|
14
|
+
|
15
|
+
Clicking and dragging in the timeline creates a new range selection. The selection is used to zoom in on information in the panels below. For example, the call tree recomputes dynamically when dragging across the timeline. These range selections can be committed by clicking the zoom button.
|
16
|
+
|
17
|
+
## The committed range selections
|
18
|
+
|
19
|
+
![A screenshot highlighting the commit ranges in the top toolbar.](images/ui-tour-ranges.png)
|
20
|
+
|
21
|
+
Committing a range selection by clicking the zoom button is a useful way to zoom in on a useful selection. It can be helpful to commit several ranges to focus on specific parts of a profile.
|
22
|
+
|
23
|
+
## The timeline's screenshots
|
24
|
+
|
25
|
+
![A screenshot highlighting the screenshot track in the timeline.](images/ui-tour-timeline-screenshots.png)
|
26
|
+
|
27
|
+
The screenshots track helps users navigate through the profile by providing visual context within the timeline.
|
28
|
+
|
29
|
+
## Timeline's activity graph
|
30
|
+
|
31
|
+
![A screenshot highlighting the activity graph.](images/ui-tour-activity-graph.png)
|
32
|
+
|
33
|
+
Each thread in the timeline contains an activity graph. The X axis represents time, and the Y axis represents the CPU usage.
|
34
|
+
|
35
|
+
Clicking on the activity graph will select a sample and update the panel below (if the panel uses the currently selected stack). For instance, in the call tree, it will open up the tree to find the stack for this sample. The selected stack will be colored a darker blue in the list. This is another useful way to correlate stacks with when they were executed over time.
|
36
|
+
|
37
|
+
[Stacks and samples can be filtered out](./guide-filtering-call-trees.md) through various operations. When this happens, the activity graph will be greyed at that spot. When the thread didn't have samples at all for an area (for instance the thread hadn't yet started up), then it should have an indicator as to the reason why there are no samples.
|
38
|
+
|
39
|
+
## Timeline's markers
|
40
|
+
|
41
|
+
![A screenshot highlighting the timeline's markers.](images/ui-tour-timeline-markers.png)
|
42
|
+
|
43
|
+
Markers are displayed in the timeline and can be useful to correlate events with the activity graph. Markers can be clicked to set the range selection to that time. Hovering over the marker will display a tooltip with information about the marker.
|
44
|
+
|
45
|
+
Perhaps one of the most useful markers is the responsiveness marker—pictured here in red. This is collected when events are taking a long time to run inside of Firefox. Clicking on one of these will quickly zoom in on potential problem areas and can indicate jank.
|
46
|
+
|
47
|
+
Only certain markers are broken out and colored in the timeline. A similar but more detailed view can be seen in the Marker Chart panel.
|
48
|
+
|
49
|
+
## Timeline's network activity
|
50
|
+
![A screenshot highlighting the timeline's network activity.](images/ui-tour-timeline-network.png)
|
51
|
+
|
52
|
+
Network requests are displayed in the timeline, which can be useful to correlate
|
53
|
+
the work that's done by the browser and the webpage, and the network activity.
|
54
|
+
For example you could find out that some JavaScript code is executed when
|
55
|
+
some response is received.
|
56
|
+
|
57
|
+
Hovering a network request will show interesting information about it, and
|
58
|
+
clicking it will switch to the more detailed network panel.
|
59
|
+
|
60
|
+
## Timeline's memory usage change
|
61
|
+
![A screenshot highlighting the timeline's memory usage.](images/ui-tour-timeline-memory.png)
|
62
|
+
|
63
|
+
The timeline also gives an overview of the memory usage change for a process.
|
64
|
+
Please note that this doesn't show the absolute memory usage, but rather the
|
65
|
+
difference between the lowest and highest memory usage during the profiling
|
66
|
+
session.
|
67
|
+
|
68
|
+
## Track selection
|
69
|
+
![A screenshot showing the track selection button.](images/ui-tour-timeline-track-selection.png)
|
70
|
+
|
71
|
+
With the button right above the tracks it's possible to either hide tracks and
|
72
|
+
threads that are in the way when analyzing a profile, or show some that were
|
73
|
+
automatically hidden when loading the profile because we thought they were less
|
74
|
+
interesting.
|
75
|
+
|
76
|
+
The same operations can be carried out with a right click on each track.
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="410" height="328" viewBox="0 0 410 328">
|
2
|
+
<g fill="none" fill-rule="evenodd">
|
3
|
+
<g transform="translate(38 48)">
|
4
|
+
<g fill="#000" font-family="Helvetica" font-size="12" transform="translate(87 1)">
|
5
|
+
<text>
|
6
|
+
<tspan x="125.165" y="11">3ms</tspan>
|
7
|
+
</text>
|
8
|
+
<text>
|
9
|
+
<tspan x="125.165" y="63">3ms</tspan>
|
10
|
+
</text>
|
11
|
+
<text>
|
12
|
+
<tspan x="164.165" y="119">1ms</tspan>
|
13
|
+
</text>
|
14
|
+
<text>
|
15
|
+
<tspan x="183.165" y="175">1ms</tspan>
|
16
|
+
</text>
|
17
|
+
<text>
|
18
|
+
<tspan x="184.165" y="232">1ms</tspan>
|
19
|
+
</text>
|
20
|
+
<text>
|
21
|
+
<tspan x="29.165" y="120">2ms</tspan>
|
22
|
+
</text>
|
23
|
+
<text>
|
24
|
+
<tspan x="1.165" y="174">1ms</tspan>
|
25
|
+
</text>
|
26
|
+
<text>
|
27
|
+
<tspan x="1.165" y="229">1ms</tspan>
|
28
|
+
</text>
|
29
|
+
<text>
|
30
|
+
<tspan x="111.165" y="174">1ms</tspan>
|
31
|
+
</text>
|
32
|
+
<text>
|
33
|
+
<tspan x="111.165" y="232">1ms</tspan>
|
34
|
+
</text>
|
35
|
+
</g>
|
36
|
+
</g>
|
37
|
+
<path fill="#4A4A4A" stroke="#4A4A4A" stroke-linecap="square" d="M227.5 66.4305556L227.5 96.5694444M227.5 96.5694444L230.5 85.7694444 224.5 85.7694444 227.5 96.5694444zM166.5 231.430556L166.5 261.569444M166.5 261.569444L169.5 250.769444 163.5 250.769444 166.5 261.569444zM221.5 231.430556L221.5 261.569444M221.5 261.569444L224.5 250.769444 218.5 250.769444 221.5 261.569444zM293.5 231.430556L293.5 261.569444M293.5 261.569444L296.5 250.769444 290.5 250.769444 293.5 261.569444zM228.565217 108.433962L199.5 152.5M199.5 152.5L207.950786 145.136291 202.94217 141.832692 199.5 152.5zM228.565217 108.433962L264.5 153.5M264.5 153.5L260.11239 143.185502 255.421189 146.926174 264.5 153.5zM270.565217 162.433962L292.5 206.5M292.5 206.5L290.373016 195.494731 285.001672 198.168429 292.5 206.5zM189.565217 163.433962L216.5 208.5M216.5 208.5L213.53443 197.690495 208.384194 200.768656 216.5 208.5zM192.565217 162.433962L173.434783 207.566038M173.434783 207.566038L180.411747 198.793241 174.88753 196.451654 173.434783 207.566038z"/>
|
38
|
+
<ellipse cx="228.5" cy="55" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
39
|
+
<ellipse cx="228.5" cy="110" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
40
|
+
<ellipse cx="192.5" cy="165" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
41
|
+
<ellipse cx="167.5" cy="220" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
42
|
+
<ellipse cx="221.5" cy="220" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
43
|
+
<ellipse cx="293.5" cy="220" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
44
|
+
<ellipse cx="221.5" cy="275" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
45
|
+
<ellipse cx="293.5" cy="275" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
46
|
+
<ellipse cx="167.5" cy="275" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
47
|
+
<ellipse cx="272.5" cy="165" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
48
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
49
|
+
<tspan x="223" y="62">A</tspan>
|
50
|
+
</text>
|
51
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
52
|
+
<tspan x="223" y="117">B</tspan>
|
53
|
+
</text>
|
54
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
55
|
+
<tspan x="186.189" y="171.582">C</tspan>
|
56
|
+
</text>
|
57
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
58
|
+
<tspan x="161.589" y="226.554">D</tspan>
|
59
|
+
</text>
|
60
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
61
|
+
<tspan x="217" y="227">F</tspan>
|
62
|
+
</text>
|
63
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
64
|
+
<tspan x="289" y="226">F</tspan>
|
65
|
+
</text>
|
66
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
67
|
+
<tspan x="215" y="282">G</tspan>
|
68
|
+
</text>
|
69
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
70
|
+
<tspan x="287" y="282">G</tspan>
|
71
|
+
</text>
|
72
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
73
|
+
<tspan x="162" y="282">E</tspan>
|
74
|
+
</text>
|
75
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
76
|
+
<tspan x="266.389" y="171.582">H</tspan>
|
77
|
+
</text>
|
78
|
+
<text fill="#0A84FF" font-family="Helvetica-Bold, Helvetica" font-size="17" font-weight="bold">
|
79
|
+
<tspan x="33" y="53">Call Tree</tspan> <tspan x="33" y="73">Running Time</tspan>
|
80
|
+
</text>
|
81
|
+
</g>
|
82
|
+
</svg>
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="410" height="328" viewBox="0 0 410 328">
|
2
|
+
<g fill="none" fill-rule="evenodd">
|
3
|
+
<g transform="translate(38 48)">
|
4
|
+
<g fill="#000" font-family="Helvetica" font-size="12" transform="translate(87 1)">
|
5
|
+
<text>
|
6
|
+
<tspan x="125.165" y="11">0ms</tspan>
|
7
|
+
</text>
|
8
|
+
<text>
|
9
|
+
<tspan x="125.165" y="63">0ms</tspan>
|
10
|
+
</text>
|
11
|
+
<text>
|
12
|
+
<tspan x="164.165" y="119">0ms</tspan>
|
13
|
+
</text>
|
14
|
+
<text>
|
15
|
+
<tspan x="183.165" y="175">0ms</tspan>
|
16
|
+
</text>
|
17
|
+
<text>
|
18
|
+
<tspan x="184.165" y="232">1ms</tspan>
|
19
|
+
</text>
|
20
|
+
<text>
|
21
|
+
<tspan x="29.165" y="120">0ms</tspan>
|
22
|
+
</text>
|
23
|
+
<text>
|
24
|
+
<tspan x="1.165" y="174">0ms</tspan>
|
25
|
+
</text>
|
26
|
+
<text>
|
27
|
+
<tspan x="1.165" y="229">1ms</tspan>
|
28
|
+
</text>
|
29
|
+
<text>
|
30
|
+
<tspan x="111.165" y="174">0ms</tspan>
|
31
|
+
</text>
|
32
|
+
<text>
|
33
|
+
<tspan x="111.165" y="232">1ms</tspan>
|
34
|
+
</text>
|
35
|
+
</g>
|
36
|
+
</g>
|
37
|
+
<path fill="#4A4A4A" stroke="#4A4A4A" stroke-linecap="square" d="M227.5 66.4305556L227.5 96.5694444M227.5 96.5694444L230.5 85.7694444 224.5 85.7694444 227.5 96.5694444zM166.5 231.430556L166.5 261.569444M166.5 261.569444L169.5 250.769444 163.5 250.769444 166.5 261.569444zM221.5 231.430556L221.5 261.569444M221.5 261.569444L224.5 250.769444 218.5 250.769444 221.5 261.569444zM293.5 231.430556L293.5 261.569444M293.5 261.569444L296.5 250.769444 290.5 250.769444 293.5 261.569444zM228.565217 108.433962L199.5 152.5M199.5 152.5L207.950786 145.136291 202.94217 141.832692 199.5 152.5zM228.565217 108.433962L264.5 153.5M264.5 153.5L260.11239 143.185502 255.421189 146.926174 264.5 153.5zM270.565217 162.433962L292.5 206.5M292.5 206.5L290.373016 195.494731 285.001672 198.168429 292.5 206.5zM189.565217 163.433962L216.5 208.5M216.5 208.5L213.53443 197.690495 208.384194 200.768656 216.5 208.5zM192.565217 162.433962L173.434783 207.566038M173.434783 207.566038L180.411747 198.793241 174.88753 196.451654 173.434783 207.566038z"/>
|
38
|
+
<ellipse cx="228.5" cy="55" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
39
|
+
<ellipse cx="228.5" cy="110" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
40
|
+
<ellipse cx="192.5" cy="165" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
41
|
+
<ellipse cx="167.5" cy="220" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
42
|
+
<ellipse cx="221.5" cy="220" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
43
|
+
<ellipse cx="293.5" cy="220" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
44
|
+
<ellipse cx="221.5" cy="275" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
45
|
+
<ellipse cx="293.5" cy="275" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
46
|
+
<ellipse cx="167.5" cy="275" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
47
|
+
<ellipse cx="272.5" cy="165" fill="#D7D7DB" stroke="#737373" rx="12.5" ry="12"/>
|
48
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
49
|
+
<tspan x="223" y="62">A</tspan>
|
50
|
+
</text>
|
51
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
52
|
+
<tspan x="223" y="117">B</tspan>
|
53
|
+
</text>
|
54
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
55
|
+
<tspan x="186.189" y="171.582">C</tspan>
|
56
|
+
</text>
|
57
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
58
|
+
<tspan x="161.589" y="226.554">D</tspan>
|
59
|
+
</text>
|
60
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
61
|
+
<tspan x="217" y="227">F</tspan>
|
62
|
+
</text>
|
63
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
64
|
+
<tspan x="289" y="226">F</tspan>
|
65
|
+
</text>
|
66
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
67
|
+
<tspan x="215" y="282">G</tspan>
|
68
|
+
</text>
|
69
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
70
|
+
<tspan x="287" y="282">G</tspan>
|
71
|
+
</text>
|
72
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
73
|
+
<tspan x="162" y="282">E</tspan>
|
74
|
+
</text>
|
75
|
+
<text fill="#000" font-family="Helvetica" font-size="17">
|
76
|
+
<tspan x="266.389" y="171.582">H</tspan>
|
77
|
+
</text>
|
78
|
+
<text fill="#0A84FF" font-family="Helvetica-Bold, Helvetica" font-size="17" font-weight="bold">
|
79
|
+
<tspan x="37" y="53">Call Tree</tspan> <tspan x="37" y="73">Self Time</tspan>
|
80
|
+
</text>
|
81
|
+
</g>
|
82
|
+
</svg>
|